Skip to content

MySQL 逻辑复制监控 ​

逻辑复制的关键组件 ​

1. 二进制日志(Binary Log) ​

主库上记录所有数据更改事件的日志,逻辑复制的基础。

2. 复制源(Source) ​

提供数据更改事件的主库,原称为主库(Master)。

3. 复制通道(Replication Channel) ​

逻辑复制中的复制通道,用于管理特定的复制流。

4. 复制接收器(Receiver) ​

从库上接收主库二进制日志的组件。

5. 复制应用器(Applier) ​

从库上应用主库二进制日志事件的组件。

6. 中继日志(Relay Log) ​

从库上临时存储主库二进制日志的日志文件。

逻辑复制监控的重要性 ​

逻辑复制监控对于确保复制的可靠性和性能至关重要,主要体现在以下方面:

  • 及时发现复制故障:通过监控可以及时发现复制中断、错误等问题
  • 监控复制延迟:确保从库与主库的数据一致性
  • 优化复制性能:识别复制瓶颈,优化复制配置
  • 规划容量:基于复制负载规划系统容量
  • 故障诊断:当复制出现问题时,提供诊断依据

逻辑复制监控的核心指标 ​

1. 复制状态 ​

  • 复制是否运行:判断复制进程是否正常运行
  • 复制通道状态:每个复制通道的运行状态
  • 错误信息:复制过程中发生的错误

2. 复制延迟 ​

  • SQL 延迟:从库应用 SQL 线程的延迟
  • IO 延迟:从库接收二进制日志的延迟
  • 总延迟:从库与主库的总延迟

3. 复制吞吐量 ​

  • 每秒应用的事务数:从库每秒应用的事务数量
  • 每秒应用的事件数:从库每秒应用的二进制日志事件数量
  • 二进制日志传输速率:主库到从库的二进制日志传输速率

4. 复制队列 ​

  • 中继日志队列大小:从库上未应用的中继日志大小
  • 二进制日志队列大小:主库上未传输的二进制日志大小

5. 复制配置 ​

  • 复制过滤规则:应用的表级或库级过滤规则
  • 复制模式:异步、半同步或同步复制
  • 复制线程数:应用器线程数量

监控逻辑复制的方法 ​

1. 使用 MySQL 内置命令 ​

1.1 SHOW REPLICA STATUS ​

MySQL 8.0.22+ 推荐使用的命令,用于查看从库的复制状态。

sql
SHOW REPLICA STATUS\G

关键字段说明:

  • Replica_IO_State:从库 IO 线程的状态
  • Source_Host:主库主机名
  • Source_User:复制用户名
  • Source_Port:主库端口
  • Connect_Retry:连接重试间隔
  • Source_Log_File:当前读取的主库二进制日志文件
  • Read_Source_Log_Pos:当前读取的主库二进制日志位置
  • Relay_Log_File:当前写入的中继日志文件
  • Relay_Log_Pos:当前写入的中继日志位置
  • Relay_Master_Log_File:当前应用的主库二进制日志文件
  • Exec_Source_Log_Pos:当前应用的主库二进制日志位置
  • Relay_Log_Space:中继日志总大小
  • Replica_IO_Running:IO 线程是否运行
  • Replica_SQL_Running:SQL 线程是否运行
  • Replicate_Do_DB:需要复制的数据库
  • Replicate_Ignore_DB:需要忽略的数据库
  • Replicate_Do_Table:需要复制的表
  • Replicate_Ignore_Table:需要忽略的表
  • Replicate_Wild_Do_Table:需要复制的通配符表
  • Replicate_Wild_Ignore_Table:需要忽略的通配符表
  • Last_Errno:最后一个错误编号
  • Last_Error:最后一个错误信息
  • Skip_Counter:跳过的事件数
  • Exec_Master_Log_Pos:已执行的主库二进制日志位置
  • Relay_Log_Space:中继日志总大小
  • Until_Condition:复制停止条件
  • Until_Log_File:复制停止的日志文件
  • Until_Log_Pos:复制停止的日志位置
  • Master_SSL_Allowed:是否允许 SSL 连接
  • Seconds_Behind_Source:从库延迟秒数
  • Source_SSL_Verify_Server_Cert:是否验证主库 SSL 证书
  • Last_IO_Errno:最后一个 IO 错误编号
  • Last_IO_Error:最后一个 IO 错误信息
  • Last_SQL_Errno:最后一个 SQL 错误编号
  • Last_SQL_Error:最后一个 SQL 错误信息

1.2 SHOW SLAVE STATUS ​

MySQL 8.0.22 之前版本使用的命令,功能与 SHOW REPLICA STATUS 类似。

sql
SHOW SLAVE STATUS\G

1.3 SHOW REPLICA STATUS FOR CHANNEL ​

用于查看特定复制通道的状态。

sql
SHOW REPLICA STATUS FOR CHANNEL 'channel_name'\G

1.4 SHOW PROCESSLIST ​

查看复制相关进程的状态。

sql
SHOW PROCESSLIST;

2. 使用 Performance Schema ​

MySQL 5.6 引入的 Performance Schema 提供了丰富的复制监控指标。

2.1 监控复制源(Source) ​

sql
-- 查看二进制日志统计信息
SELECT * FROM performance_schema.global_status WHERE VARIABLE_NAME LIKE 'Binlog%';

-- 查看复制连接统计信息
SELECT * FROM performance_schema.replication_connection_status;

2.2 监控复制接收器(Receiver) ​

sql
-- 查看复制接收器统计信息
SELECT * FROM performance_schema.replication_applier_status_by_worker;

2.3 监控复制应用器(Applier) ​

sql
-- 查看复制应用器统计信息
SELECT * FROM performance_schema.replication_applier_status_by_coordinator;

3. 使用 Sys Schema ​

MySQL 5.7 引入的 Sys Schema 提供了更友好的复制监控视图。

3.1 查看复制状态 ​

sql
-- 查看复制状态摘要
SELECT * FROM sys.replication_status;

-- 查看复制通道状态
SELECT * FROM sys.replication_connection_status;

-- 查看复制应用器状态
SELECT * FROM sys.replication_applier_status_by_worker;

3.2 监控复制延迟 ​

sql
-- 查看复制延迟
SELECT * FROM sys.replication_delay;

4. 使用第三方监控工具 ​

4.1 MySQL Enterprise Monitor ​

MySQL 官方提供的企业级监控工具,支持复制监控、性能监控、安全监控等。

特点:

  • 全面的复制监控
  • 实时告警
  • 历史趋势分析
  • 可视化仪表盘
  • 自动故障检测

4.2 Prometheus + Grafana ​

开源监控组合,通过 MySQL Exporter 收集复制指标。

配置步骤:

  1. 安装 MySQL Exporter
  2. 配置 Prometheus 采集 MySQL 指标
  3. 配置 Grafana 仪表盘

常用指标:

  • mysql_slave_status_seconds_behind_master:复制延迟
  • mysql_slave_status_slave_io_running:IO 线程状态
  • mysql_slave_status_slave_sql_running:SQL 线程状态

4.3 Zabbix ​

开源监控系统,支持 MySQL 复制监控。

配置步骤:

  1. 安装 Zabbix Agent
  2. 配置 MySQL 监控模板
  3. 添加复制监控项
  4. 配置告警规则

4.4 Nagios ​

开源监控系统,通过插件支持 MySQL 复制监控。

常用插件:

  • check_mysql_health:支持复制状态和延迟监控
  • check_mysql_replication:专门用于复制监控

逻辑复制延迟监控 ​

1. 延迟产生的原因 ​

  • 网络延迟:主从库之间的网络延迟
  • 主库负载:主库高负载导致二进制日志写入延迟
  • 从库负载:从库高负载导致中继日志应用延迟
  • 大事务:主库上的大事务导致从库应用延迟
  • DDL 操作:主库上的 DDL 操作导致从库应用延迟
  • 复制过滤:从库上的复制过滤规则增加处理开销

2. 延迟监控方法 ​

2.1 使用 Seconds_Behind_Source ​

最常用的复制延迟指标,通过 SHOW REPLICA STATUS 命令获取。

sql
SHOW REPLICA STATUS\G

注意:

  • 对于逻辑复制,该指标可能不准确,因为它基于主库和从库的时间戳
  • 当从库 SQL 线程停止时,该值会显示为 NULL

2.2 使用 GTID 集比较 ​

通过比较主库和从库的 GTID 集来计算复制延迟。

sql
-- 主库上获取已执行的 GTID 集
SELECT @@GLOBAL.gtid_executed;

-- 从库上获取已执行的 GTID 集
SELECT @@GLOBAL.gtid_executed;

-- 计算差异

2.3 使用心跳表 ​

在主库上创建一个心跳表,定期更新时间戳,从库上查询该表来计算延迟。

实现步骤:

  1. 在主库上创建心跳表
  2. 创建一个事件定期更新心跳表
  3. 在从库上查询心跳表,计算与主库的时间差

示例:

sql
-- 主库上创建心跳表
CREATE TABLE heartbeat (
    id INT PRIMARY KEY,
    update_time TIMESTAMP(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6)
);

-- 插入初始数据
INSERT INTO heartbeat (id) VALUES (1);

-- 创建事件定期更新心跳表
CREATE EVENT update_heartbeat
ON SCHEDULE EVERY 1 SECOND
DO
    UPDATE heartbeat SET update_time = CURRENT_TIMESTAMP(6) WHERE id = 1;

-- 从库上计算延迟
SELECT TIMESTAMPDIFF(SECOND, update_time, CURRENT_TIMESTAMP(6)) AS delay_seconds
FROM heartbeat;

3. 延迟阈值设置 ​

复制延迟阈值应根据业务需求设置,常见的阈值设置:

  • 实时业务:延迟应小于 1 秒
  • 近实时业务:延迟应小于 5 秒
  • 非实时业务:延迟可接受几分钟甚至几小时

逻辑复制故障监控 ​

1. 常见复制故障类型 ​

1.1 连接故障 ​

  • 主库不可达
  • 复制用户权限问题
  • 网络连接问题

1.2 日志故障 ​

  • 主库二进制日志丢失
  • 从库中继日志损坏
  • 二进制日志格式不兼容

1.3 SQL 应用故障 ​

  • 从库表结构与主库不一致
  • 从库数据与主库冲突
  • 从库缺少必要的权限
  • 复制过滤规则错误

1.4 配置故障 ​

  • 复制参数配置错误
  • 二进制日志配置错误
  • 复制通道配置错误

2. 故障检测方法 ​

2.1 监控复制线程状态 ​

sql
-- 检查复制线程是否运行
SHOW REPLICA STATUS\G

关键字段:

  • Replica_IO_Running:IO 线程状态
  • Replica_SQL_Running:SQL 线程状态

2.2 监控错误日志 ​

定期检查 MySQL 错误日志,查找复制相关错误。

bash
# 查看错误日志
tail -n 100 /var/log/mysql/error.log

2.3 使用 Performance Schema 监控错误 ​

sql
-- 查看复制错误
SELECT * FROM performance_schema.replication_applier_status_by_worker WHERE LAST_ERROR_NUMBER > 0;

3. 故障自动恢复 ​

3.1 使用 MySQL 内置的自动恢复 ​

MySQL 8.0 引入了复制自动恢复功能,可以自动处理某些复制故障。

配置参数:

ini
# 启用复制自动恢复
replica_auto_recovery = ON

# 自动恢复重试间隔
replica_parallel_type = LOGICAL_CLOCK

# 并行复制线程数
replica_parallel_workers = 4

3.2 使用第三方工具实现自动恢复 ​

  • MySQL Orchestrator:支持复制拓扑管理和自动故障转移
  • MHA (Master High Availability):支持 MySQL 复制的自动故障转移
  • ProxySQL:支持读写分离和自动故障转移

逻辑复制性能监控 ​

1. 性能指标 ​

  • 二进制日志生成速率:主库每秒生成的二进制日志大小
  • 复制传输速率:主库到从库的二进制日志传输速率
  • 复制应用速率:从库每秒应用的二进制日志事件数
  • 复制线程负载:复制相关线程的 CPU 和内存使用率
  • 中继日志增长速率:从库中继日志的增长速率

2. 性能瓶颈识别 ​

2.1 主库瓶颈 ​

  • 二进制日志写入瓶颈:主库 IO 负载过高
  • 连接数过多:主库连接数达到上限
  • 大事务:主库上执行大事务

2.2 从库瓶颈 ​

  • SQL 应用瓶颈:从库 CPU 负载过高
  • 中继日志应用瓶颈:从库 IO 负载过高
  • 并行复制配置不当:并行复制线程数不足

3. 性能优化方法 ​

3.1 优化主库配置 ​

ini
# 增大二进制日志缓存
binlog_cache_size = 32M
max_binlog_cache_size = 1G

# 增大二进制日志文件大小
max_binlog_size = 1G

# 使用 row 格式
binlog_format = ROW

3.2 优化从库配置 ​

ini
# 启用并行复制
replica_parallel_type = LOGICAL_CLOCK
replica_parallel_workers = 8

# 增大中继日志缓存
relay_log_cache_size = 32M
max_relay_log_cache_size = 1G

# 增大中继日志文件大小
max_relay_log_size = 1G

3.3 优化网络配置 ​

  • 确保主从库之间的网络带宽充足
  • 减少主从库之间的网络延迟
  • 考虑使用专用网络进行复制

逻辑复制监控的最佳实践 ​

1. 建立完善的监控体系 ​

  • 多层次监控:结合内置命令、Performance Schema、第三方工具
  • 全面覆盖:监控复制状态、延迟、性能、故障等各个方面
  • 实时告警:设置合理的告警阈值,及时通知运维人员

2. 定期进行复制健康检查 ​

  • 每周至少进行一次全面的复制健康检查
  • 检查复制状态、延迟、性能等指标
  • 检查复制配置是否正确
  • 检查复制过滤规则是否生效

3. 建立复制故障应急预案 ​

  • 制定详细的复制故障处理流程
  • 定期进行故障演练
  • 准备必要的工具和脚本
  • 确保运维人员熟悉故障处理流程

4. 优化复制配置 ​

  • 根据业务需求调整复制配置
  • 优化并行复制线程数
  • 调整复制缓冲大小
  • 优化二进制日志格式

5. 监控复制拓扑变化 ​

  • 监控复制拓扑的变化
  • 确保复制拓扑的正确性
  • 及时发现异常的复制关系

不同版本的逻辑复制监控差异 ​

MySQL 8.0.0-8.0.21 ​

  • 使用 SHOW SLAVE STATUS 命令
  • 支持基本的逻辑复制监控
  • Performance Schema 中的复制监控视图有限

MySQL 8.0.22+ ​

  • 推荐使用 SHOW REPLICA STATUS 命令
  • 增强了 Performance Schema 中的复制监控视图
  • 引入了更多的复制监控指标
  • 支持更细粒度的复制监控

常见问题(FAQ) ​

Q1: 如何区分物理复制和逻辑复制的监控? ​

A1: 物理复制和逻辑复制的监控有以下区别:

  • 监控命令:物理复制使用 SHOW SLAVE STATUS,逻辑复制推荐使用 SHOW REPLICA STATUS
  • 监控指标:逻辑复制增加了复制通道、复制过滤等监控指标
  • 延迟计算:逻辑复制的延迟计算可能更复杂,需要结合多种方法
  • 故障类型:逻辑复制可能出现更多的 SQL 应用错误

Q2: 如何处理逻辑复制延迟过高的问题? ​

A2: 处理逻辑复制延迟过高的方法包括:

  • 优化主库性能,减少二进制日志生成延迟
  • 优化从库性能,增加并行复制线程数
  • 减少主库上的大事务
  • 优化网络连接,减少网络延迟
  • 检查复制过滤规则,避免不必要的过滤开销
  • 考虑使用多个从库分担负载

Q3: 如何监控多个复制通道? ​

A3: 监控多个复制通道的方法包括:

  • 使用 SHOW REPLICA STATUS FOR CHANNEL 命令逐个检查
  • 查询 Performance Schema 中的复制监控视图
  • 使用第三方监控工具,如 MySQL Enterprise Monitor、Prometheus + Grafana
  • 编写脚本定期检查所有复制通道

Q4: 如何自动检测和恢复逻辑复制故障? ​

A4: 自动检测和恢复逻辑复制故障的方法包括:

  • 启用 MySQL 8.0 的复制自动恢复功能(replica_auto_recovery = ON)
  • 使用 MySQL Orchestrator 实现自动故障转移
  • 使用 MHA 实现自动故障转移
  • 使用 ProxySQL 实现读写分离和自动故障转移
  • 编写自定义脚本监控复制状态,自动处理常见故障

Q5: 如何监控跨版本逻辑复制? ​

A5: 监控跨版本逻辑复制的方法与监控同版本逻辑复制类似,但需要注意:

  • 确保主库和从库的二进制日志格式兼容
  • 监控复制过程中的兼容性错误
  • 关注跨版本复制的性能差异
  • 定期测试跨版本复制的可靠性

Q6: 如何使用 Performance Schema 监控逻辑复制? ​

A6: 使用 Performance Schema 监控逻辑复制的方法包括:

  • 查询 replication_connection_status 表监控复制连接状态
  • 查询 replication_applier_status_by_worker 表监控复制应用状态
  • 查询 replication_applier_status_by_coordinator 表监控复制协调器状态
  • 查询 replication_asynchronous_connection_failover 表监控异步连接故障转移

Q7: 如何设置合理的复制延迟告警阈值? ​

A7: 设置合理的复制延迟告警阈值需要考虑:

  • 业务对数据一致性的要求
  • 系统的正常复制延迟范围
  • 不同时间段的负载变化
  • 历史复制延迟趋势

一般建议设置多级告警:

  • 警告级:延迟超过 5 秒
  • 严重级:延迟超过 30 秒
  • 紧急级:延迟超过 5 分钟或复制中断