MySQL集群架构之分库分表概述
分库分表是实际应用中,之前介绍的“读写分离”和缓存等已经不能解决数据量呈几何级数增长导致数据库性能降低不能满足生产需求的问题。目前比较普遍的方案就是使用NoSQL/NewSQL或者采用分库分表。
使用分库分表时,主要有垂直拆分和水平拆分两种拆分模式,都属于物理空间的拆分。
分库分表方案:只分库、只分表、分库又分表。
分库分表技术:
1)垂直拆分:由于表数量多导致的单个库大,将表拆分到多个库中。
2)水平拆分:由于表记录多导致的单个库大,将表记录拆分到多个表中。
一、拆分方式
1、垂直拆分
垂直拆分又称为纵向拆分,垂直拆分是将表按库进行分离,或者修改表结构按照访问的差异将某些列拆分出去。应用时有垂直分库和垂直分表两种方式,一般谈到的垂直拆分主要指的是垂直分库。
按列进行垂直拆分,即把一条记录分开多个地方保存,每个子表的行数相同。把主键和一些列放到一个表,然后把主键和另外的列放到另一个表中(MySQL性能优化之表结构设计优化 - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)是中示范案例就是垂直拆分,但是拆表后并没有分库)。
2、水平拆分
水平拆分又称为横向拆分。 相对于垂直拆分,它不再将数据根据业务逻辑分类,而是通过某个字段(或某几个字段),根据某种规则将数据分散至多个库或表中,每个表仅包含数据的一部分,如下图所示:
水平分表是将一张含有很多记录数的表水平切分,不同的记录可以分开保存,拆分成几张结构相同的表。如果一张表中的记录数过多,那么会对数据库的读写性能产生较大的影响,虽然此时仍然能够正确地读写,但读写的速度已经到了业务无法忍受的地步,此时就需要使用水平分表来解决这个问题。
水平拆分:解决表中记录过多问题。
垂直拆分:解决表过多或者是表字段过多问题。
日常工作中,通常会同时使用两种拆分方式,垂直拆分更偏向于产品/业务/功能拆分的过程,在技术上更关注水平拆分的方案。
二、扩容方案
当系统用户进入了高速增长期时,即便是对数据进行分库分表,但数据库的容量,还有表的数据量也总会达到天花板。当现有数据库达到承受极限时,就需要增加新服务器节点数量进行横向扩容。
从上图看就是增加了一个硬件,没什么难的。实际真这么简单么?需要解决的主要技术问题如下:
1)数据迁移问题
2)分片规则改变
3)数据同步、时间点、数据一致性
如果这些都能处理的很好,那是比较简单。
上述问题时,通常使用以下两种方案(实践地比较成熟):
1、停机扩容
这是一种生产初期都会使用的方案,尤其是初期只有几台数据库的时候。
停机扩容的具体步骤如下:
1)站点发布一个公告,例如:“为了为广大用户提供更好的服务,本站点将在今晚00:00-2:00之间升级,给您带来不便抱歉";
2)时间到了,停止所有对外服务;
3)新增n个数据库,然后写一个数据迁移程序,将原有x个库的数据导入到最新的y个库中。比如分片规则由%x变为%y;
4)数据迁移完成,修改数据库服务配置,原来x个库的配置升级为y个库的配置
5)重启服务,连接新库重新对外提供服务
回滚方案:万一数据迁移失败,需要将配置和数据回滚,改天再挂公告。
优点:简单
缺点:
停止服务,缺乏高可用
程序员压力山大,需要在指定时间完成
如果有问题没有及时测试出来启动了服务,运行后发现问题,数据会丢失一部分,难以回滚。
适用场景:小型网站、大部分游戏、对高可用要求不高的服务。
2、平滑扩容
数据库扩容的过程中,如果想要持续对外提供服务,保证服务的可用性,平滑扩容方案是最好的选择。平滑扩容就是将数据库数量扩容成原来的2倍,比如:由2个数据库扩容到4个数据库,具体步骤如下:
1)新增2个数据库
2)配置双主进行数据同步(先测试、后上线)
3)数据同步完成之后,配置双主双写(同步因为有延迟,如果时时刻刻都有写和更新操作,会存在不准确问题)
4)数据同步完成后,删除双主同步,修改数据库配置,并重启
5)此时已经扩容完成,但此时的数据并没有减少,新增的数据库跟旧的数据库一样多的数据,此时还需要写一个程序,清空数据库中多余的数据。如:
User1去除 uid % 4 = 2的数据;
User3去除 uid % 4 = 0的数据;
User2去除 uid % 4 = 3的数据;
User4去除 uid % 4 = 1的数据;
平滑扩容方案能够实现n库扩2n库的平滑扩容,增加数据库服务能力,降低单库一半的数据量。其核心原理是:成倍扩容,避免数据迁移。
优点:
1)扩容期间,服务正常进行,保证高可用
2)相对停机扩容,时间长,项目组压力没那么大,出错率低
3)扩容期间遇到问题,随时解决,不怕影响线上服务
4)可以将每个数据库数据量减少一半
缺点:
1)程序复杂、配置双主同步、双主双写、检测数据同步等
2)后期数据库扩容,比如成千上万,代价比较高
适用场景:大型网站、对高可用要求高的服务。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?