计划内切换怎么做
计划内主从切换的标准节奏是先停写、再追平、最后切换:旧主设为只读并停止业务写入,等从库把事务集合完全补齐,再把从库提升为主并切换应用连接。整个过程最关键的约束是同一时刻只能有一个写入方,否则两个实例都能写会造成数据分叉,后果比一次普通宕机严重得多。
基本信息
| 用途 | 计划内的主从角色互换 |
|---|---|
| 核心顺序 | 先停写、再追平、最后切换 |
| 追平判据 | 事务集合比较,而不是延迟归零 |
| 应用侧 | 连接串或代理层需要同步切换 |
| 关键约束 | 同一时刻只能有一个写入方 |
| 切换之后 | 旧主作为新从库重新挂载 |
标准步骤
- 旧主设置只读并停止业务写入,必要时挂维护页
- 旧主记录最终事务集合,作为追平目标
- 从库等待追平:确认已执行集合已包含目标集合
- 从库取消只读并停止复制,应用连接切到新主
- 旧主作为新从库重新挂载到新主之下
关键操作
关键操作
# 旧主:第一步
SET GLOBAL read_only = ON; # 停止写入
SELECT @@GLOBAL.gtid_executed; # 记录最终事务集合作为追平目标
# 从库:第三步,等待追平
SELECT WAIT_FOR_EXECUTED_GTID_SET('最终集合', 60); # 返回 1 表示已追平
# 从库:第四步,提升为新主
STOP REPLICA;
RESET REPLICA ALL;
SET GLOBAL super_read_only = OFF;
SET GLOBAL read_only = OFF;切换环节与风险
| 环节 | 动作 | 风险 |
|---|---|---|
| 停写 | 旧主设为只读并停业务写入 | 漏停某个写入方会造成数据分叉 |
| 记录位点 | 保存最终事务集合 | 记录丢失就无法判断是否追平 |
| 等待追平 | 按事务集合比较确认 | 用延迟归零判断会出现假追平 |
| 提升 | 取消只读并停止复制 | 应用连接未切换时会出现双写 |
| 切连接 | 连接串或代理层切换 | 缓存未过期会导致仍连到旧主 |
| 回挂 | 旧主挂到新主之下 | 残留配置会导致复制关系异常 |
切换窗口内写入方必须唯一:应用连接串或代理层要同步切换,避免新旧主同时被写,数据一旦分叉修复代价极高。
追平判据用事务集合比较而不是延迟归零:拉取线程已经断开的场景下延迟同样显示为零,会造成假追平。
切换前检查清单
- 确认所有写入方都能被停止或切走
- 确认从库已通过事务集合比较追平
- 确认应用侧连接切换方案与回滚方案
- 确认旧主回挂为从库的配置已准备好
- 把切换窗口与影响范围提前通知业务方
切换完成后不要立刻宣布结束:观察新主写入是否正常、从库是否正常挂载、应用错误率是否恢复,确认这几项都平稳才算收尾。