生产环境如何使用Vitess实现MySQL双主复制、分片及数据库层零停机?
基于Vitess的MySQL双主集群落地及零停机迁移方案
前置准备
- 在两个Kubernetes集群分别部署Vitess Operator,配置跨集群网络连通,确保etcd、vtctld等控制面组件可以跨集群访问,优先用集群联邦的
ServiceExport/ServiceImport实现服务发现 - 原有MySQL实例开启ROW格式binlog,保留从全量备份生成到迁移完成全周期的binlog,确保增量同步链路可用
- 使用
xtrabackup生成现有500G数据的全量物理备份,相比逻辑备份可节省70%以上的备份和导入时间 - 验证两个K8s集群间网络延迟低于20ms,避免跨集群主从复制延迟过高影响业务
双主复制集群搭建
- 纳管现有MySQL实例
在Vitess中创建对应Keyspace,初始配置为非分片模式,通过ExternalMaster功能将两个现有MySQL实例纳入Vitess管理,分别作为两个K8s集群内的主节点。
双主模式必须提前配置主键偏移避免冲突:第一个主节点设置
auto_increment_offset=1、auto_increment_increment=2,第二个主节点设置auto_increment_offset=2、auto_increment_increment=2
- 数据同步校验
将全量备份导入Vitess管理的两个实例,启动双主复制链路,用Vitess自带的vrepl组件监控复制延迟,确保延迟稳定低于1s、无数据不一致问题后进入流量切换阶段。 - 零停机流量切换
- 先将1%的读流量切到Vitess的VTGate接入层,验证查询逻辑、返回结果完全一致,无报错
- 逐步提升读流量占比到100%,观察24小时无异常后,开始灰度切换写流量
- 写流量按1%→10%→50%→100%的比例逐步切换,全程开启Vitess事务一致性校验,双写期间原有实例和Vitess集群并行运行,任意阶段出现异常可立即切回原有集群,无业务中断风险
- 全量流量切到Vitess后,继续并行运行72小时确认无问题,再下线原有独立MySQL实例
后续分片扩展
当业务需要分片时,直接通过Vitess控制面执行在线分片操作,全程无停机:
- 提前选定分片键,优先选择高频查询的过滤字段作为分片键,避免跨分片事务
- 开启Vitess在线分片功能,
vsplit组件会自动完成数据拆分、增量同步、流量灰度切换,整个过程业务无感知,不需要停服操作
零停机核心保障
- 迁移全周期不停止原有MySQL的binlog写入,Vitess增量同步链路始终追平最新数据,支持随时回滚
- 所有流量切换操作都是灰度可控制的,不存在一刀切的切换动作
- 500G大体积数据用物理备份+多线程并行导入,配合增量binlog同步,全程不需要停服备份
内容的提问来源于stack exchange,提问作者Hamid Shariati
相关产品推荐
相关产品推荐

