分库分表

简介: 分库分表

一般来说,高并发,海量数据存储的解决方法有:缓存加速,读写分离,垂直拆分,分库分表,冷热数据分离,ES 辅助搜索,NoSQL 等方式,分库分表是海量数据存储与高并发系统的一个解决方案。

数据量大就分表,并发高就分库。


为什么要分库分表?


如果是创业公司。比如注册用户20w, 每天日活1w, 每天单表1000, 高峰期每秒并发 10 ,这个时候,一般不需要考虑分库分表,如果注册用户2000w, 日活100w, 单表10w条,高峰期每秒并发1000,此时就要考虑分库分表。当然多加几台机器,使用负载均衡可以扛住,但是每天单表数据增加,磁盘资源会被消耗掉,高峰期如果要5000 怎么办,系统肯定撑不住。也就是说,数据增加,请求量增大,并发增大,单个数据库肯定不行。


分表


如果单表数据达到 几千万了,数据量比较大,会极大影响 SQL 查询性能, 后面的SQL 执行会很慢,经验来说,单表数据几百万,就要考虑分表了。

所谓的分表,就是将一个表的数据存放到多个表中, 查询的时候就查一个表。比如按照用户 id 来分表,将一个用户的数据存放在一个表中,然后对这个用户操作时操作那个表就好。一般来说,每个表的数据固定在 200w 以内比较好。


分表方式


垂直拆分

所谓的垂直拆分,就是将一个表中的列拆分到多个表中,也就是说将一个大表拆分成多个小表。

  • 常用的列放在一个表,不常用的列放在其他表
  • 关系紧密的列放在一个表
  • 大字段列单独存放

image.png

水平拆分

表结构保持不变, 对数据进行拆分,将表中对某些行拆分到其他表中。

image.png

分库

分库, 经验来说,一个库对并发最多到 2000, 一定要扩容,一个健康的单库并发控制在1000 QPS 左右,如果超过,那么将一个库的数据拆分到多个库。

image.png

分库分表技术实现有两个派系


代理模式 Proxy

代表产品是 mycat,  SQL组合,数据库路由,执行结果合并都放到一个代理服务中。

  • 无代码侵入性, 支持多种语言
  • 需要额外引入中间件, 容易造成流量瓶颈

客户端模式Client

常见的有 Sharing-JDBC, 业务端系统只要引入一个 jar 包即可,按照规范配置路由规则, jar 包中处理数据库路由,SQL 组合,执行结果合并等操作。

  • 简单,容易上手,引入 jar 包即可,无流量瓶颈
  • 升级麻烦,升级 jar 包时,往往需要升级服务

如何选择分片键

  • 数据尽量均匀等分布在不同等库或者不同表,避免数据倾斜。
  • 跨库操作尽量少
  • 这个字段的值不会变化。

分片策略

  • hash 分片
  • range 分片(范围分片)
思考;分库分表如何平滑过渡?

历史数据迁移


  1. 增量数据监听 binlog,通过 canal 增量迁移数据
  2. 全量迁移历史数据
  3. 开启双写,关闭增量迁移任务。
  4. 读业务切换到新库
  5. 线上运行一段时间,没有问题后,下线老库。

双写迁移方案

简单来说,对新库,老库都操作。要注意的是不允许老数据覆盖新数据。

image.png

思考题

如何设计可以动态扩容缩容的分库分表方案?

相关文章
|
存储 Cloud Native NoSQL
分布式数据库新秀TIDB初探
背景随着社会数字化程度的加深,网络逐渐成为了社会的基础设施。随着互联网渗透程度的不断深入和互联网的进一步下沉,人们会在互联网上面 花费更多的时间,产生更多的数据。作为数据存储基石的DB面临着新的挑战和发展空间,由于数量的增长,之前的单机DB将面临越来越多的挑战,此时就出现数据库扩展的多种方案以满足海量数据的存储。目前主流的应对方案主要是分库分表,但是也存在着分布式事务,跨节点 join,扩容复杂等
1104 0
分布式数据库新秀TIDB初探
|
存储 SQL 分布式数据库
OceanBase 入门:分布式数据库的基础概念
【8月更文第31天】在当今的大数据时代,随着业务规模的不断扩大,传统的单机数据库已经难以满足高并发、大数据量的应用需求。分布式数据库应运而生,成为解决这一问题的有效方案之一。本文将介绍一款由阿里巴巴集团自主研发的分布式数据库——OceanBase,并通过一些基础概念和实际代码示例来帮助读者理解其工作原理。
1185 0
|
SQL 监控 关系型数据库
drds学习
【8月更文挑战第6天】
943 1
|
关系型数据库 MySQL 测试技术
MySQL性能测试(完整版)
MySQL性能测试(完整版)
1618 1
|
负载均衡 算法 Go
GoLang协程Goroutiney原理与GMP模型详解
【11月更文挑战第4天】Goroutine 是 Go 语言中的轻量级线程,由 Go 运行时管理,创建和销毁开销小,适合高并发场景。其调度采用非抢占式和协作式多任务处理结合的方式。GMP 模型包括 G(Goroutine)、M(系统线程)和 P(逻辑处理器),通过工作窃取算法实现负载均衡,确保高效利用系统资源。
277 3
|
SQL 存储 Oracle
大厂面试高频:聊下分库分表与读写分离的实现原理
本文详解了分库分表和读写分离的原理与实现,帮助解决大数据量下的性能瓶颈问题,大厂面试高频,建议收藏。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:聊下分库分表与读写分离的实现原理
|
SQL 存储 关系型数据库
京东面试:分库分表后,如何深度翻页?
在40岁老架构师尼恩的读者交流群中,有小伙伴在京东面试时遇到了MySQL分库分表后深度分页太慢的问题。本文详细分析了单表和分表场景下的性能问题及优化方法,包括索引覆盖、子查询分页、Join分页、禁止跳页查询、二次查询法等。此外,还介绍了使用ES+HBase的海量NOSQL架构方案。通过这些方法,可以显著提升分页查询的性能,帮助面试者在技术面试中脱颖而出。
京东面试:分库分表后,如何深度翻页?
|
消息中间件 安全 Kafka
Kafka支持SSL/TLS协议技术深度解析
SSL(Secure Socket Layer,安全套接层)及其继任者TLS(Transport Layer Security,传输层安全)是为网络通信提供安全及数据完整性的一种安全协议。这些协议在传输层对网络连接进行加密,确保数据在传输过程中不被窃取或篡改。
983 0
|
存储 关系型数据库 分布式数据库
PolarDB,阿里云的云原生分布式数据库,以其存储计算分离架构为核心,解决传统数据库的扩展性问题
【7月更文挑战第3天】PolarDB,阿里云的云原生分布式数据库,以其存储计算分离架构为核心,解决传统数据库的扩展性问题。此架构让存储层专注数据可靠性,计算层专注处理SQL,提升性能并降低运维复杂度。通过RDMA加速通信,多副本确保高可用性。资源可独立扩展,便于成本控制。动态添加计算节点以应对流量高峰,展示了其灵活性。PolarDB的开源促进了数据库技术的持续创新和发展。
596 2
|
SQL 关系型数据库 MySQL
OceanBase 的 SQL 兼容性与优化
【8月更文第31天】随着分布式计算的发展,越来越多的企业开始采用分布式数据库来满足其大规模数据存储和处理的需求。OceanBase 作为一款高性能的分布式关系数据库,其设计旨在为用户提供与传统单机数据库类似的 SQL 查询体验,同时保持高可用性和水平扩展能力。本文将深入探讨 OceanBase 的 SQL 引擎特性、兼容性问题,并提供一些针对特定查询进行优化的方法和代码示例。
944 0