标准流程 · 数据库与存储

待环境验证

MySQL 主从切换前的检查与验收

为 MySQL 计划切换检查 GTID、写入隔离、复制追平和代理路由,明确新主写入后的回退边界与业务验收。

MySQL自动化高可用
阅读导引 · 理解后再操作

这篇知识解决什么问题

计划切换要先形成可以证明的写入冻结边界,再判断候选是否覆盖该边界,最后才讨论新入口。阅读时按新主是否已经接收写入划分阶段,把代理路由、旧连接、GTID 与业务数据核对分别留证,理解为何新主接写后回到旧机器不是简单回退。

冻结边界必须停止继续增长

计划切换的比较基准来自已确认停写后的权威源端,而非随手取得的一次 GTID 快照。还需核对应用池、直连、定时任务和进行中事务是否被纳入边界。没有可信冻结证据,后续即使集合比较曾经相符,也只能说明当时覆盖了一个样本,不能证明切换点完整。

事务集合与业务数据是不同验收层

GTID 集合可用于核对事务身份覆盖及额外历史,却不能单独排除过滤、历史跳过事务或不受复制约束的写入。候选资格还包括业务数据样本、容量与依赖。把集合判定和业务核验分别保留,任何无法解释的额外事务都应在提升前交由数据负责人处理。

进入文章正文
关联架构图解8 个组件 · 点击展开

参考图同时呈现代理数据路径与独立切换控制路径,重点阅读唯一责任方、旧主隔离和候选提升的先后关系。本篇仅用于旧主仍可核验的计划切换,不覆盖失联主库紧急故障转移,也未展开具体编排产品。

查看场景架构与实施步骤
参考架构 · 非实时拓扑

代理入口与数据库单写控制架构

用 GTID 复制维持候选副本,ProxySQL 处理应用路由,Keepalived 只负责代理入口冗余;数据权威、旧主隔离与提升由独立受控流程确认。

  • 数据 / 请求
  • 控制 / 管理
  • 观测 / 查询

点击组件,在图下方查看职责;连线编号对应流向解读。小屏可横向滚动,或直接展开文字说明。

代理入口与数据库单写控制架构:组件关系图用 GTID 复制维持候选副本,ProxySQL 处理应用路由,Keepalived 只负责代理入口冗余;数据权威、旧主隔离与提升由独立受控流程确认。 应用连接池 → Keepalived VIP:业务连接;Keepalived VIP → ProxySQL:当前代理入口;ProxySQL → MySQL 当前主库:路由业务写入;MySQL 当前主库 → MySQL 候选副本:binlog / GTID;唯一切换责任方 → 旧主写入隔离:先隔离并确认;旧主写入隔离 → MySQL 当前主库:限制旧主写入;唯一切换责任方 → MySQL 候选副本:核验后提升;唯一切换责任方 → ProxySQL:更新并放行路由;Prometheus → MySQL 候选副本:抓取复制状态。箭头说明见下方流向解读。
逻辑参考图,展示正常单写路径和切换控制职责,不表示已部署自动故障转移;实际 RPO、RTO 与隔离效果需按目标环境验证。

应用连接池

入口 / 来源

业务连接使用已登记入口,核对事务、读后写一致性和连接重建;任何直连例外都必须纳入写入隔离清单。

全部组件职责 8 个组件
应用连接池
业务连接使用已登记入口,核对事务、读后写一致性和连接重建;任何直连例外都必须纳入写入隔离清单。
Keepalived VIP
在网络支持且健康检查通过时,把 VIP 放在当前可用代理节点。它不选数据库主库,也不判定事务是否追平。工具介绍 Keepalived VIP
ProxySQL
按经核对的后端主机组处理路由。运行配置与磁盘持久配置需分别复核,代理冗余不等于数据库高可用已经验收。工具介绍 ProxySQL
Prometheus
通过兼容指标端点观测主副本及代理;图中只示意候选采集边,监控不执行数据库提升。工具介绍 Prometheus
MySQL 当前主库
正常状态下仅此节点承接应用写入并产生 binlog。切换后这个逻辑角色指向经确认的新主,不以原节点地址定义权威。工具介绍 MySQL 当前主库
旧主写入隔离
由获准的数据库、网络或基础设施手段阻止旧主继续接写,并保存验证证据;仅摘除代理后端不足以证明隔离。
唯一切换责任方
按阶段检查表确认停写、追平、旧主隔离、候选提升和路由放行。图中未假定已有可用自动编排服务。
MySQL 候选副本
接收并回放主库事务,候选资格需核对 GTID、复制过滤、错误和业务数据,不能只依赖延迟为零。工具介绍 MySQL 候选副本
流向解读 9 条连接
  1. 1

    应用连接池 Keepalived VIP

    数据 / 请求 · 业务连接

    应用向受控入口发送数据库请求,仍需处理失败连接和提交结果未知的事务。

  2. 2

    Keepalived VIP ProxySQL

    数据 / 请求 · 当前代理入口

    VIP 由可用代理节点承载;该连线不意味着 Keepalived 处理 SQL 或提升数据库。

  3. 3

    ProxySQL MySQL 当前主库

    数据 / 请求 · 路由业务写入

    写请求仅转到已确认权威主库,读路由按应用一致性要求单独评估。

  4. 4

    MySQL 当前主库 MySQL 候选副本

    数据 / 请求 · binlog / GTID

    箭头表示事务复制的数据方向;异步复制可能存在尚未送达或未回放的事务。

  5. 5

    唯一切换责任方 旧主写入隔离

    控制 / 管理 · 先隔离并确认

    提升前由唯一责任流程确认旧主所有写入口失效,隔离不明则停在停写或只读状态。

  6. 6

    旧主写入隔离 MySQL 当前主库

    控制 / 管理 · 限制旧主写入

    切换时针对图示原主节点执行隔离;它恢复后不能绕过新主权威重新承接写入。

  7. 7

    唯一切换责任方 MySQL 候选副本

    控制 / 管理 · 核验后提升

    只有数据与隔离条件满足后才提升候选;计划追平切换与旧主失联故障切换必须采用不同证据。

  8. 8

    唯一切换责任方 ProxySQL

    控制 / 管理 · 更新并放行路由

    新主权威确认后更新并持久化路由,再逐批允许应用重连,不让 VIP 漂移代替数据库切换。

  9. 9

    Prometheus MySQL 候选副本

    观测 / 查询 · 抓取复制状态

    通过经确认的 exporter 采集复制、容量与角色状态,采集失败不代表数据库已经切换。

故障域与操作边界

入口冗余不提供数据库仲裁

ProxySQL 和 Keepalived 不负责确认权威事务或可靠隔离旧主。未验证外部编排与 fencing 时,不应宣称自动高可用完成。

异步复制不能承诺零丢失

失联主库可能有未知已提交事务;GTID 与业务核对用于衡量缺口,不能将计划切换的追平结果套用到突发故障。

新主接写后不能直接切回旧主

写入权威一旦推进,应保存新主数据与时间线,再处理旧主分叉。回到原机器必须作为新的受控切换,不覆盖新主已提交数据。

架构依据与版本核对 2 篇官方资料

图解是本站基于官方资料整理的逻辑参考;实施前仍需核对实际部署版本、组件支持范围与变更审批。

适用范围与前提

本文是「MySQL 主从高可用」场景的计划切换检查单,面向 MySQL 8.4、单写源库与 GTID 复制。它不适用于源库已经不可访问的紧急故障转移,也不替代现有高可用组件的操作手册。先明确变更窗口、允许中断、数据丢失目标、操作负责人、应用入口和回退决策点;全文为待环境验证参考。

核对拓扑和候选副本

逐个确认实例身份、复制方向、版本兼容性、复制过滤规则及备份恢复可用性。候选副本应具备承接业务的容量、账号、网络策略和日志配置。检查自动切换系统是否会与人工操作竞争,按既定运维流程进入受控状态。

SELECT @@server_uuid, @@version, @@global.gtid_mode,
       @@global.read_only, @@global.super_read_only;
SHOW REPLICA STATUS\G

查询在候选副本执行。保存结果后确认复制没有错误、候选不是延迟副本,并核实其他副本能连接候选。不要只依据「延迟为 0」选择新主。

建立明确的写入边界

在切换流程中先暂停应用写入并排空进行中的写事务,再按环境既定方式隔离旧主的写权限和入口。仅改变代理地址不足以隔离仍持有旧连接的客户端。只读设置、应用连接池和网络入口应共同验证,不以一次配置返回成功代替实际检查。

确认写入冻结后,在旧主读取 @@GLOBAL.gtid_executed,把这个不可再增长的集合记录为本次切换边界,同时保存冻结时间和应用侧证据。

验证候选已覆盖边界

在候选执行下面的只读集合判断。字符串是占位符,必须替换成刚记录的完整 GTID 集合:

SELECT GTID_SUBSET('REPLACE_WITH_FROZEN_SOURCE_GTID_SET',
                   @@GLOBAL.gtid_executed) AS boundary_applied;
SELECT GTID_SUBTRACT(@@GLOBAL.gtid_executed,
                     'REPLACE_WITH_FROZEN_SOURCE_GTID_SET') AS extra_gtids;

第一项为 1 表示候选执行集合覆盖边界;第二项若非空,应查明额外事务来源。集合相符不等于已证明所有表内容一致,还须排除过滤规则、历史跳过事务和非复制写入,并完成所需业务数据核验。GTID 函数的定义见文末官方文档。

切换顺序与业务验收

通过全部检查后,按已验证的切换工具或操作单完成提升候选、重定向副本和应用入口。重新开放写入前再次确认唯一写主与旧主隔离。用独立测试对象进行经授权的写后读验证,记录请求标识;从应用连接确认实际服务实例,检查错误率、连接重建和关键业务路径。

随后观察下游副本是否跟随新主、复制进度是否推进、备份与监控是否指向正确角色。验收记录应填写实测中断与数据核验结果,不能预先写成「零丢失、零中断」。

切换后还应检查定时任务、离线客户端和只读服务是否仍使用旧地址。为长连接保留足够观察时间,将遗漏入口加入连接清单,避免前台验证通过而后台任务继续访问旧拓扑。

回退边界与停止条件

候选未开始接收新写入前,可在确认旧主仍为权威数据源后按原入口恢复。新主已经接收写入后,直接把流量切回旧主会造成数据分歧,应冻结变更,先核对两侧事务并建立反向同步或重新初始化方案。若写入无法可靠隔离、GTID 差异无法解释或候选资源不足,停止切换并保留当前证据。

参考资料

从现象到判断

先收集证据,再缩小范围。以下是判读路径,不代表已经确认根因或获准变更。

  1. 工单已经记录暂停写入,但源端事务集合仍有变化,或存在绕过代理的任务;当前入口状态不足以解释变化来源。

    只读核对
    只读比较冻结后的源端集合采样、现有连接与事务记录,核对应用池、批任务和直连清单,以及已执行隔离的证据。
    如何判读
    边界可能尚未建立,或者仍有需要解释的后台事务;在来源不清前不能据候选延迟为零继续推进提升。
  2. 候选线程正常且延迟较小,但与冻结集合比较仍有缺口,或候选出现无法从原主历史说明的额外 GTID。

    只读核对
    读取冻结基准及候选执行集合的覆盖和差集结果,对照复制过滤、错误与历史变更记录,保存同一候选的身份信息。
    如何判读
    缺口与额外历史必须分别解释;集合覆盖不是所有表内容一致的证明,不能用忽略差异或跳过事务获得通过结果。
  3. 代理页面已指向候选,应用连接却仍出现旧实例,或者新主已承接写入后有人建议直接恢复原入口。

    只读核对
    读取代理运行与持久配置、已有应用连接目标和请求记录,确认新主首次接写时间及旧主隔离的实际覆盖范围。
    如何判读
    入口配置与存量连接可能不一致;一旦新写入推进,恢复旧入口前必须处理两侧数据历史,不能按普通配置回退。
常见误区与判断边界 2 项

让 VIP 冗余承担数据库选主

VIP 漂移解决的是代理入口位置,不回答候选事务是否完整、旧主是否仍可接写,也不指定数据权威。若把一次地址变更当作数据库切换完成,可能遗漏直连和旧连接。应分别保存入口冗余与数据库切换的验收,未实现的编排能力明确说明。

新主接写后按原机器回切

数据权威由已确认的新写入历史决定,而不是哪个节点最初叫主库。直接切回尚未同步的旧主可能造成新事务不可见或新的分歧。出现异常应先保持受控写边界与两侧证据,后续回到原机器必须经过重新同步及新的切换审批。

交接时应留下的证据

作为记录提纲使用,不是自动检查结果;未取得的证据应标记缺口,并注明负责人。

  • 登记原主、候选及下游副本 UUID、版本与角色,保存所有应用、代理和直连入口清单,注明唯一切换负责人及批准窗口。
  • 附停写与进行中事务排空的实际证据,记录冻结时间和不可再增长的源端 GTID 基准,解释仍出现的后台事务来源。
  • 保存候选覆盖与额外集合判断、复制过滤和历史错误核对结果,另附获准业务样本检查及候选容量资料,不合并成一个勾选。
  • 记录旧主隔离范围、新主首次写入和应用连接目标,交接新写入后的数据恢复限制、未验证入口及实际业务验收时间线。

记录需包含环境、版本、时间与时区;分享前脱敏,不附访问令牌、密码或完整业务敏感数据。

继续阅读与资料核对

补充相关主题,再结合当前环境的实施记录形成结论。

返回原理导读

DOUYA OPS ECOSYSTEM

贡献你的经验,帮助更多运维人

把故障复盘、标准流程和最佳实践沉淀为可检索、可复用的知识内容。