数据库与存储 · 高级

MySQL 主从高可用

围绕 GTID 复制、旧主隔离、代理入口和受控切换,建立有一致性检查与恢复边界的 MySQL 高可用流程。

MySQL监控告警高可用

场景目标

建立可审阅的单写拓扑、复制与代理监控,验证备份恢复记录;在受控窗口完成一次计划切换,记录冻结写入、GTID 追平、旧主隔离、新主放行与应用恢复时间;根据业务抽样和事务证据报告实际 RPO/RTO,并使旧主以经过校验的副本身份恢复冗余。

环境要求

以 MySQL 8.4 GTID 语法为示例,其他版本需核对命令、复制兼容性和权限;确认 ProxySQL、Keepalived 版本及配置方式。至少两个容量合格的数据库节点、两个代理节点,并具备阻断旧主所有应用写入路径的隔离能力;VIP 方案须由网络环境支持,云网络限制需提前验证。准备数据库检查与复制账号、代理管理权限、可信凭据注入方式、足够的 binlog 保留空间,以及已在隔离环境恢复过的备份记录。维护窗口需能冻结写入并安排 DBA、应用和网络负责人协同。预计 360 分钟覆盖首批配置与计划演练,不含硬件采购、全量数据复制、备份重建和长周期负载观察。

参考架构 · 非实时拓扑

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

用 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 采集复制、容量与角色状态,采集失败不代表数据库已经切换。

从架构到实施

  1. 01

    先证明单写和候选数据来源

    登记所有写入口、恢复记录和候选资格,定义提升责任方,核对 GTID、复制线程及业务抽样。

  2. 02

    分别验收代理层和观测层

    代理故障只切换入口,不改变数据库角色;建立复制、磁盘、连接与角色观察证据后再进入切换窗口。

  3. 03

    按新主是否接写划分恢复边界

    依次停写、追平、隔离、提升和放行;新主接写后保持其权威,将旧主隔离后重建或追平为副本。

故障域与操作边界

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

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

异步复制不能承诺零丢失

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

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

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

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

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

方案说明

适用架构

适用于 MySQL 单写主库与至少一个副本、使用 GTID 复制的受管环境。ProxySQL 管理应用连接与后端路由,Keepalived 为代理层提供可漂移入口,Prometheus 观测复制和代理状态。数据库提升由明确的人工流程或已验证的外部编排负责。

不适用边界

本方案不是 Group Replication 或 InnoDB Cluster 的安装手册。ProxySQL 与 Keepalived 不负责判定数据权威、完成 MySQL 提升或保证数据库仲裁;仅漂移 VIP 不能阻止旧主接受直连写入。异步复制存在尚未复制事务丢失的可能,RPO 与 RTO 必须通过实际演练测量。

全局验收

只允许一个经确认的写入源,应用通过受控入口重连;保存切换前后的 GTID、关键业务校验、代理运行配置及时间线。新主接收写入后保持其权威,旧主先隔离再按新主重建或追平为副本,恢复冗余后另行规划后续切换。

配套知识

官方参考

工具编排

4 个关联工具
  1. MySQL单写数据与 GTID 复制提供事务、GTID 和复制状态;提升与旧主隔离遵循明确编排,数据检查通过后才放行新主写入。
  2. ProxySQL应用连接与后端路由按后端状态维护读写主机组与连接路由,不承担数据库提升、数据一致性裁决或旧主隔离。
  3. Keepalived代理层入口冗余在网络支持的前提下维护代理 VIP,并结合代理健康检查;VIP 状态不等同于数据库主库权威。
  4. Prometheus复制与代理观测通过已验证采集端点观察复制线程、事务积压、连接、磁盘与代理健康,记录切换时间线。

实施步骤

共 7 步
  1. 01

    确认单写拓扑与恢复基础

    标记当前权威主库、候选副本、应用直连入口和复制方向,确认没有遗漏的写入客户端。核对各节点版本、唯一标识、GTID 模式、只读状态、磁盘余量及备份恢复记录,凭据通过受控客户端配置提供。以下 SQL 只读取实例状态,需分别连接已核对身份的节点执行,结果连同实例地址、时间和业务校验基线归档。

    SELECT VERSION(), @@server_uuid, @@gtid_mode;
    SELECT @@read_only, @@super_read_only, @@GLOBAL.gtid_executed;
    验证标准

    节点角色、UUID 与资产清单一致,仅已确认主库对应用可写;候选副本具备容量与复制条件,恢复记录包含实际还原和业务抽样。未知写入口、版本差异和数据异常均已查明。

    停止与回退

    此阶段不改变复制与角色。若发现双写、备份未验证或候选数据来源不清,停止高可用变更并先冻结相关变更计划;保留实例证据,由 DBA 确认权威数据后再继续。

    返回步骤起点
  2. 02

    定义切换权限与停止条件

    确定执行提升的唯一责任方,明确计划切换与突发故障的不同路径:计划切换可先停写等待追平,旧主失联时则必须先证实隔离并评估未知事务。列出应用、网络与数据库层所有写入口及隔离验证方式,约定最大等待、可接受数据缺口和升级联系人。准备每阶段检查表,尤其区分新主尚未接写和已经接写,避免使用同一套回退动作。

    验证标准

    检查表写明谁能提升、谁确认隔离、谁放行应用,且所有直连路径都有验证方法;未达到数据与隔离条件时明确停在只读或停写状态。业务负责人理解实际复制模式的 RPO 边界。

    停止与回退

    若隔离手段无法证明旧主不可接写,撤回自动切换计划并维持当前受控拓扑。此步骤不做角色修改;未明确恢复边界前不执行故障注入,不把代理健康检查当作隔离证据。

    返回步骤起点
  3. 03

    核对复制线程与事务追平条件

    在候选副本检查接收、回放线程及错误,结合 GTID 差集、工作线程积压、磁盘和网络确认复制质量,不把延迟为零视为数据一致性的充分证据。核对复制过滤、延迟副本及历史手工写入是否影响候选资格,并在负载可控时做关键业务抽样。下列只读命令在副本执行;若使用多通道复制,应按本环境明确目标通道,不能混用状态。

    SHOW REPLICA STATUS;
    SELECT @@GLOBAL.gtid_executed;
    验证标准

    接收与回放线程健康且没有未解释错误,候选 GTID 与业务抽样结论可复核;复制过滤和延迟配置符合切换要求。以多个采样点确认复制没有持续积压,并保留主副本同时段证据。

    停止与回退

    发现复制异常则取消该候选资格,停止切换准备并保留错误和 GTID 记录。不得通过跳过事务、清空复制元数据或注入空事务来制造通过结果;先修复或重建副本再重新验收。

    返回步骤起点
  4. 04

    验证代理路由与入口冗余

    在 ProxySQL 配置受控后端、读写主机组、监控账号与连接规则,先用测试应用核对事务、读后写一致性和重连行为,不假定任意 SELECT 都适合副本。区分配置层、运行层与磁盘持久层,按变更流程同步并复核。Keepalived 仅为代理入口提供冗余,健康检查需覆盖代理可用性;单独演练代理故障,数据库角色应保持不变,网络不支持 VIP 时先解决入口方案。

    验证标准

    测试写请求只进入权威主库,事务和一致性要求按应用规则满足;代理重启后配置仍正确。代理入口切换可观察且不触发数据库提升,所有应用端点和直连例外均与登记清单一致。

    停止与回退

    代理异常时恢复已保存的路由及运行配置,仅在数据库权威未变化的前提下恢复原应用入口。若数据库已切换,任何备用入口也必须指向已确认的新主,禁止通过旧地址重新打开旧主写入。

    返回步骤起点
  5. 05

    建立复制、容量与切换监控

    接入经确认兼容的数据库与代理指标端点,观测复制线程、事务积压、连接数、锁等待、磁盘水位及代理后端状态,采集账号遵循实际所需权限。把采集失联与数据库故障区分开,告警中附上实例身份、当前角色和检查入口。检查 binlog 保留是否覆盖预期故障恢复时间,用已登记测试信号确认告警到达,并准备记录切换各阶段时间的统一时钟。

    验证标准

    主副本与代理关键指标连续更新,角色和数据来源可辨认;采集失联不会被误报为已完成主库切换。测试告警到达指定责任组,恢复入口及实例标识有效,容量阈值有明确处置动作。

    停止与回退

    采集影响实例时先停用相关采集目标,恢复旧监控配置与账号权限;不得为了消除告警修改数据库角色。监控证据不完整时暂停切换演练,待时间线和关键状态可观察后再继续。

    返回步骤起点
  6. 06

    执行计划停写与单次主库切换

    在批准窗口冻结应用写入并排空相关事务,确认旧主不再产生业务写入后记录终点 GTID,等待候选应用全部目标事务并完成校验。验证旧主的写入隔离,再由唯一编排责任方提升候选、调整代理路由,最后逐批开放应用连接。每完成一阶段记录证据与时间;若模拟旧主失联,必须另行确认隔离及未知事务的处置结论,不能套用已追平的计划切换结论。

    验证标准

    保存停写终点、候选追平证据及旧主隔离结果,放行后只有新主承接测试与业务写入。应用重连、事务结果和关键业务计数通过约定校验,实际中断时间及可能的数据缺口如实记录。

    停止与回退

    新主尚未接写且双方状态已核实一致时,可按检查表撤销候选提升并恢复原主。新主已接写后不得切回旧主或覆盖旧备份;保持旧主隔离,暂停新增写入并以新主为权威排查。

    返回步骤起点
  7. 07

    按新主恢复副本与验收交接

    切换后先保存新主 GTID、业务校验和备份状态,再处理旧主;旧主保持隔离与只读,检查是否存在分叉事务,按新主的数据源追平或使用已验证的新备份重建为副本。确认复制恢复后再登记其候选资格,不自动抢回原角色。交接当前权威、剩余风险、实际恢复时间、代理配置和恢复步骤,另行安排完整负载观察及下一次演练。

    验证标准

    旧主只能作为已校验副本接入,没有未解释的分叉事务;当前写入口全部指向新主,冗余和备份链路恢复。验收记录区分本次实测结果与后续观察,值班人员能够复述角色和停止条件。

    停止与回退

    旧主重建或追平失败时继续隔离该节点,保留新主服务并按容量风险决定是否限流。不得为恢复原拓扑覆盖新主已提交数据;需要再次切换时重新执行停写、追平、隔离与放行流程。

    返回步骤起点

DOUYA OPS ECOSYSTEM

体验豆芽自研工具与场景能力

部分场景提供体验环境,用于功能验证、测试和技术交流。