MySQL 分库分表扩容方案:固定槽位 + 双写迁移
MySQL 分库分表扩容方案:固定槽位 + 双写迁移
讲述链条
逻辑分片与物理节点解耦 → 槽位计算与路由 → 双写迁移四阶段 → 与 Redis Cluster 对比
核心表述
MySQL 分库分表扩容采用固定逻辑分片 + 映射表方案,设计思路与 Redis Cluster 类似。预先定义 1024 或 4096 个逻辑槽位(2 的幂次),通过 userId % 1024 计算槽位,然后查询配置中心的映射表找到物理数据库。逻辑分片号永远不变,扩容时只改变槽位到物理库的映射关系。
假设从 4 库扩容到 8 库,初始映射 [0-255]→DB_0、[256-511]→DB_1、[512-767]→DB_2、[768-1023]→DB_3。扩容后调整为 [0-127]→DB_0、[128-255]→DB_4、[256-383]→DB_1、[384-511]→DB_5,以此类推。旧库继续保留,只是槽位重新分配。
双写迁移四阶段:
阶段 1 - 双写期:新增数据同时写旧库(主)和新库(异步),新库写入失败则加入重试队列,后续补偿。读请求优先读新库,新库没有则降级读旧库(兜底),旧库有数据则异步补偿到新库。
阶段 2 - 后台迁移:定时任务扫描需要迁移的槽位,分批迁移历史数据(每次 1000 条),记录迁移进度,避免影响线上业务。
阶段 3 - 数据校验:对比新旧库数据一致性,修复差异数据。
阶段 4 - 切换完成:全部迁移完成后,停止双写,只用新映射表路由。
双写是否需要分布式事务? 不需要。双写是临时状态,采用最终一致性 + 补偿机制即可。新库写入失败加入重试队列,后续异步重试,允许短暂的数据不一致。如果要求强一致性反而影响性能和可用性。
与 Redis Cluster 对比:MySQL 分库分表需要应用层或中间件(ShardingSphere)实现路由和迁移,是人工触发的半自动化流程。Redis Cluster 通过集群协议自动管理,客户端智能路由,迁移过程集群自动协调。MySQL 强调强一致性(事务),Redis 强调最终一致性和高可用。