操作手册 · 数据库与存储

待环境验证

MySQL 复制延迟的定位方法

结合复制线程、GTID、事务积压与资源指标分析 MySQL 复制延迟,区分接收异常、回放瓶颈和监控误判。

MySQL监控告警高可用
阅读导引 · 理解后再操作

这篇知识解决什么问题

复制排障要把源端产生事务、副本接收日志、副本执行事务分成三个进度,而不是追求一个延迟数字归零。以同一实例、通道和时间轴比较进度差异,再结合业务负载与资源证据,判断是接收故障、应用瓶颈还是观测口径误读。

进度变化比单次状态更有解释力

将源端、接收端和执行端放在连续采样表里,注明实例 UUID 与复制通道。线程存活回答是否运行,进度趋势回答是否跟得上,两者不能互相替代。采样非同时发生时还需保留时间差,避免把正常持续写入期间的集合差异直接判成复制损坏。

性能与一致性问题使用不同处置入口

积压扩大可能适合进一步调查吞吐,但复制应用错误、异常事务来源或缺行证据首先涉及一致性。应在性能假设中写出预期支持和反证,并标明何时停止调参。跳过事务会改变数据历史,不能作为把线程和告警恢复正常的普通诊断手段。

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

使用 MySQL 高可用图中的主库到候选副本复制边与观测节点,理解复制进度为何影响候选资格。图中的 VIP、代理和切换责任方提供上下文,不表示本文会提升副本,也未展开复制 worker 和锁等待内部结构。

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

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

用 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 8.4 单源异步复制,配合「MySQL 主从高可用」场景使用。多源复制需按通道分别采样;其他版本先核对字段名称。准备可查询复制状态的账号、实例与通道清单、统一时间轴,以及告警前后的业务写入和主机指标。以下是待环境验证的排查流程,不是实际故障复盘。

先确认复制是否还在运行

在副本执行只读查询,并记录采样时间、实例标识及完整输出:

SELECT NOW(), @@server_uuid, @@version;
SHOW REPLICA STATUS\G

先查看 Replica_IO_RunningReplica_SQL_Running 和最后错误。如果线程停止,优先依据错误定位认证、连接、日志可用性或应用事务失败;把「已停止」与「仍在追赶」分开记录。错误字段可能保留历史信息,应结合时间和当前线程状态判断。

不把延迟秒数当作唯一结论

Seconds_Behind_Source 为 0 不能单独证明副本已追上源库:接收链路变慢时,应用线程可能只追上已接收的日志。NULL 也不能当作零延迟。字段含义和限制见文末的 SHOW REPLICA STATUS 官方说明。

建议连续采集多个观察点,同时记录业务写入量、接收位置、执行位置和 relay log 大小。使用 GTID 时对照接收与执行集合;未用 GTID 时同时比较日志文件名和位置,不能直接相减不同文件中的数字。确认是否配置了预期的延迟复制,避免把策略当故障。

区分接收慢与应用慢

源库持续产生事务而接收进度基本不变时,沿源库连接、网络重传、带宽和日志保留范围查证。接收进度持续前移、执行进度落后且积压增大时,再检查副本 CPU、磁盘延迟、可用空间、锁等待和大事务。

将高负载时间段与备份、批处理、DDL 或读流量变化对齐。复制线程仍为 Yes 只说明线程运行,不代表吞吐足够。每次提出一个假设,并写明能支持或推翻它的证据,避免同时调整多个参数后无法归因。

若只有一个副本异常,对照正常副本的硬件、读负载和连接路径;若多个副本同时出现积压,优先检查共同的源端写入变化。把这种横向比较与时间趋势一起保留,便于下一位值班人员继续排查。

根据证据安排处置

优先选择可控的业务降载或错峰方案,并保留变更前的指标。应用瓶颈涉及并行复制时,先确认当前配置、事务依赖和资源余量,在验证环境评估后再调整;不要把增加 worker 数当成通用解法。遇到重复键、缺行等错误,先保存错误上下文和数据证据,不用跳过事务来掩盖一致性问题。

验收与停止条件

验收应覆盖一个有代表性的业务负载窗口:线程稳定、无新增复制错误、积压持续收敛,并通过业务允许的数据新鲜度检查。记录实测结果,阈值由业务目标确定,不预设「恢复到某秒即成功」。若积压继续增长、磁盘趋满或错误指向数据分歧,应停止性能调参,保全日志并转入容量或一致性处置。撤销本次临时降载或配置调整时逐项恢复并继续观察。

参考资料

从现象到判断

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

  1. 副本展示很小的延迟甚至为零,但业务读到旧数据,源库持续写入,而副本的新事务可见性没有同步改善。

    只读核对
    读取同通道的接收与执行集合、线程状态及多个采样时间点,对照源端事务进度和既有业务数据新鲜度记录。
    如何判读
    执行端追上已接收日志不等于追上源库;还应排除延迟复制、过滤规则和读路由,才能判断缺口所在阶段。
  2. 接收位置不断前进,执行位置增长较慢,relay log 占用持续扩大,并与批处理或读流量高峰发生重叠。

    只读核对
    对照副本现有 CPU、磁盘延迟、空间及锁等待资料,读取复制应用错误和任务时间线,与正常副本比较负载。
    如何判读
    证据支持优先调查应用吞吐,但不能只因磁盘忙就认定唯一根因;大事务、锁竞争与资源限制仍需逐项排除。
  3. 复制线程不再运行,最后错误仍有内容,监控有时同时显示未知延迟;值班记录却把它当作普通慢复制。

    只读核对
    限定实例和通道读取当前线程状态、最后错误时间与错误日志片段,核对连接、认证及日志可用性的既有记录。
    如何判读
    先区分当前故障和保留的历史错误;涉及事务冲突或日志缺口时应保全上下文,不能用延迟阈值代替恢复决策。
常见误区与判断边界 2 项

延迟为零不是提升许可

延迟字段只覆盖特定时间关系,不能证明全部源事务已到达,也不能排除历史过滤和旁路写入。即使当前追赶正常,候选是否能接管仍需要独立核验写入隔离、数据历史与业务容量。复制诊断报告应提供证据,不自动给出切换授权。

多加 worker 未必能消除积压

并行度调整受事务依赖和实际资源余量影响;如果阻塞来自单个事务、磁盘或锁,增大并发可能增加竞争。先解释接收与执行差距在何时扩大,再把参数评估交给变更流程;每次改变多个条件会让后续无法确认真正改善来源。

交接时应留下的证据

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

  • 保留源库与副本 UUID、版本、复制通道及采样时间,记录延迟复制和过滤配置的只读核对结果,避免跨通道混读。
  • 用连续观察点保存接收、执行进度及 relay log 变化,标明采样间隔与源端写入活动,不把非同时快照视为原子比较。
  • 附同窗口线程错误、资源趋势、锁等待及批处理记录,说明正常副本对照结果,并列出当前性能假设的支持与反证。
  • 登记业务可接受的新鲜度范围、未知事务差异、容量风险和下一位处理人,任何提升、跳过事务或重建都单独注明授权要求。

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

继续阅读与资料核对

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

返回原理导读

DOUYA OPS ECOSYSTEM

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

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