概述

中继日志是 MySQL 主从复制架构中,从库(Slave)的核心组件,用于暂存从主库(Master)接收到的二进制日志事件(binlog events),然后在本地执行的中间存储。它在主从复制中扮演了关键角色,确保数据同步的可靠性和持久性。

核心作用

  1. 数据中转:临时存储从主库接收的二进制日志
  2. 执行缓冲:从库SQL线程顺序执行日志中的事件
  3. 故障恢复:支持复制中断后的断点续传
  4. 延迟复制:实现人工配置的复制延迟

工作机制

  1. 写入流程

    • I/O线程从主库拉取binlog → 写入relay log
    • SQL线程读取relay log → 应用数据变更
  2. 文件结构

    • relay-log.index:索引文件
    • relay-bin.000001:二进制日志文件
  3. 生命周期

    • SQL线程执行完事件后自动清理(默认)
    • 可配置保留策略

配置文件参数

核心配置项(my.cnf):

[mysqld]
relay_log = /var/lib/mysql/relay-bin
relay_log_index = /var/lib/mysql/relay-bin.index
relay_log_info_file = relay-log.info
relay_log_purge = ON
max_relay_log_size = 1G
sync_relay_log = 1
relay_log_recovery = ON

动态参数控制:

-- 临时禁用自动清理
SET GLOBAL relay_log_purge = 0;

-- 查看当前中继日志状态
SHOW SLAVE STATUS\G

-- 清理指定日志
PURGE RELAY LOGS BEFORE '2023-08-20 00:00:00';

常用参数配置

参数默认值说明
relay_logrelay-bin中继日志文件名前缀
relay_log_indexrelay-bin.index中继日志索引文件
relay_log_info_filerelay-log.info存储复制位置信息的文件(记录从库读取主库二进制日志的位置)
relay_log_purgeON是否自动清理已应用的中继日志(建议保持开启以节省空间)
max_relay_log_size1G单个中继日志文件最大大小(超过此值会滚动生成新文件)
sync_relay_log10000同步写入磁盘的频率(0=每次提交都同步,N=每N次事务同步一次)
relay_log_recoveryOFF崩溃后自动恢复中继日志(建议在主从复制场景开启以增强数据一致性)

关键参数说明

  1. relay_log_purge

    • ON:自动删除已应用且不再需要的中继日志(默认推荐)
    • OFF:需手动清理,适用于需要保留中继日志的场景(如审计)
  2. relay_log_recovery

    • 开启后(设为 ON),从库重启时会自动删除未完成的中继日志并重新拉取主库日志,确保数据一致性
  3. sync_relay_log

    • 设置为 1 可提高数据安全性(每次事务提交都同步到磁盘),但会影响性能

配置示例

-- 设置中继日志文件最大为2GB
SET GLOBAL max_relay_log_size = 2G;

-- 开启中继日志崩溃恢复
SET GLOBAL relay_log_recovery = ON;

-- 查看当前配置
SHOW VARIABLES LIKE '%relay_log%';

优缺点分析

优点:

  • 数据可靠性: 确保复制中断后不丢失数据
  • 执行有序性: 保证SQL线程顺序执行
  • 灵活管理: 支持手动清理和保留策略
  • 监控便利: 可通过多种方式监控日志状态

缺点:

  • 存储开销: 需要额外磁盘空间存储日志
  • IO压力: 高并发场景可能产生磁盘IO瓶颈
  • 管理复杂度: 需要定期监控和清理
  • 潜在风险: 日志文件损坏可能导致复制中断

日志分析工具

内置工具mysqlbinlog:

# 查看日志内容
mysqlbinlog /var/lib/mysql/relay-bin.000001

# 实时监控日志事件
SHOW RELAYLOG EVENTS IN 'relay-bin.000001' FROM 123 LIMIT 10;

第三方工具:

  • pt-query-digest: 分析日志中的SQL模式
  • mha-manager: 自动处理中继日志故障
  • orchestrator: 可视化监控复制拓扑

状态监控:

-- 查看复制状态
SHOW SLAVE STATUS\G

-- 查看当前中继日志
SHOW RELAYLOG EVENTS;

-- 监控延迟
SELECT 
  UNIX_TIMESTAMP() - UNIX_TIMESTAMP(Last_SQL_Exec_Time) AS delay_seconds 
FROM performance_schema.replication_applier_status_by_worker;

生产实践指南

安全清理策略

-- 手动清理所有已应用日志
PURGE RELAY LOGS TO 'relay-bin.000015';

-- 设置自动保留策略
SET GLOBAL relay_log_purge = 1;
SET GLOBAL expire_logs_days = 7;

性能优化

# 调整IO参数(适合SSD)
sync_relay_log = 1000
relay_log_space_limit = 10G

# 提升并行复制
slave_parallel_workers = 8
slave_parallel_type = LOGICAL_CLOCK

故障处理场景

场景1:中继日志损坏:

STOP SLAVE;
CHANGE MASTER TO RELAY_LOG_FILE='relay-bin.000001', RELAY_LOG_POS=123;
START SLAVE;

场景2:磁盘空间不足:

# 临时切换日志路径
SET GLOBAL relay_log = '/new_path/relay-bin';

知识补充

GTID复制模式下的变化

  • 不再严格依赖relay log文件位置
  • 使用全局事务标识符(GTID)追踪进度
  • 保留中继日志用于故障恢复

多源复制特性

-- 为每个通道维护独立的中继日志
CHANGE MASTER TO MASTER_HOST='master2' FOR CHANNEL 'channel2';

与二进制日志关系

特性Relay LogBinlog
生成位置从库主库/从库(主库生成为主)
内容来源主库的 binlog 内容本地执行的 SQL 语句
用途数据复制的中转存储记录所有数据变更事件

生成位置

  • Relay Log
    仅存在于从库,用于暂存从主库接收的 binlog 事件。
  • Binlog

    • 主库:默认生成
    • 从库:可选生成(需设置 log_slave_updates=ON

      内容来源

  • Relay Log
    被动接收主库的 binlog 数据,内容与主库 binlog 完全一致。
  • Binlog
    主动记录本机执行的所有数据变更语句(DDL/DML)。

    用途

  • Relay Log

    1. 从库通过 I/O 线程从主库拉取 binlog 并写入 relay log
    2. SQL 线程读取 relay log 并重放事件
  • Binlog

    1. 主从复制的基础
    2. 数据恢复(通过 mysqlbinlog 工具)
    3. 审计追踪

配置示例:

-- 查看 relay log 配置
SHOW VARIABLES LIKE '%relay_log%';

-- 查看 binlog 配置
SHOW VARIABLES LIKE '%log_bin%';

监控指标参考

-- 关键监控项
SELECT 
  Relay_Log_Space AS log_space,
  Slave_SQL_Running_State AS sql_state,
  Seconds_Behind_Master AS replication_delay
FROM performance_schema.replication_connection_status;

总结

  • 定期监控: 检查Relay_Log_Space使用情况
  • 合理配置: 根据磁盘性能设置max_relay_log_size
  • 启用恢复: 设置relay_log_recovery = ON
  • 版本升级: MySQL 8.0+ 增强并行复制能力
  • 安全备份: 重要场景保留历史relay log


晚上不吃饭
4 声望1 粉丝