6.6.5 复制拓扑设计与延迟优化

复制拓扑设计需兼顾业务读写比例、故障域隔离与扩展成本。常见拓扑包括一主多从、级联复制、双主+从与多源复制等。设计要点:明确主库写入集中、从库读扩展;跨机房复制采用级联或延迟从库降低广域延迟与抖动影响;为避免单点,主库通过高可用组件实现快速切换,从库按业务分组承载不同读流量与备份任务;拓扑命名与角色标识规范化,便于自动化运维与变更控制。

复制拓扑原理草图(主从+级联+延迟从库):

文章图片

延迟优化需从链路、配置与负载三方面入手。链路侧优化网络质量、减少跨域跳数并启用复制压缩;配置侧关注并行复制(基于GTID的多线程复制)、合理设置slave_parallel_workers、slave_parallel_type、binlog_group_commit_sync_delay等参数;负载侧拆分大事务、避免长事务与大表DDL在高峰期执行,控制主库I/O与CPU使用。对只读业务可引入延迟从库,保障误删可回滚,同时避免作为实时读节点。

一、安装与基础配置示例(GTID一主一从)
1)主库 my.cnf(/etc/mysql/my.cnf):

[mysqld]
server_id=1
log_bin=/var/lib/mysql/mysql-bin
binlog_format=ROW
gtid_mode=ON
enforce_gtid_consistency=ON
log_slave_updates=ON
sync_binlog=1
innodb_flush_log_at_trx_commit=1

2)从库 my.cnf(/etc/mysql/my.cnf):

[mysqld]
server_id=2
relay_log=/var/lib/mysql/relay-bin
read_only=ON
super_read_only=ON
gtid_mode=ON
enforce_gtid_consistency=ON
log_slave_updates=ON
slave_parallel_workers=4
slave_parallel_type=LOGICAL_CLOCK

3)主库创建复制账号:

CREATE USER 'repl'@'10.%' IDENTIFIED BY 'Repl@123';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'repl'@'10.%';
FLUSH PRIVILEGES;

4)从库指向主库并启动复制(GTID自动定位):

CHANGE MASTER TO
  MASTER_HOST='10.0.0.1',
  MASTER_USER='repl',
  MASTER_PASSWORD='Repl@123',
  MASTER_AUTO_POSITION=1;

START SLAVE;

5)预期检查结果:

SHOW SLAVE STATUS\G

关键字段预期:
- Slave_IO_Running: Yes
- Slave_SQL_Running: Yes
- Seconds_Behind_Master: 0(或小幅波动)

二、级联与延迟从库配置示例
1)级联从库(C 从 S1 复制):

-- 在级联上执行
CHANGE MASTER TO
  MASTER_HOST='10.0.0.2',
  MASTER_USER='repl',
  MASTER_PASSWORD='Repl@123',
  MASTER_AUTO_POSITION=1;
START SLAVE;

2)延迟从库(D 延迟 3600 秒):

CHANGE MASTER TO
  MASTER_HOST='10.0.0.1',
  MASTER_USER='repl',
  MASTER_PASSWORD='Repl@123',
  MASTER_AUTO_POSITION=1,
  MASTER_DELAY=3600;
START SLAVE;

预期效果:Seconds_Behind_Master稳定在约 3600 秒。

三、延迟优化关键参数示例与解释

[mysqld]
slave_parallel_workers=8         # 开启8个SQL线程
slave_parallel_type=LOGICAL_CLOCK # 基于组提交并行
binlog_group_commit_sync_delay=2000 # 2ms内合并提交减少binlog刷盘
binlog_group_commit_sync_no_delay_count=10 # 累计10笔强制刷盘

说明:并行复制提高从库回放速度;组提交减少binlog fsync频次,需结合延迟与一致性评估。

四、监控与诊断命令(含排错思路)
1)复制状态:

SHOW SLAVE STATUS\G

常见问题与处理:
- Last_IO_Error 提示连接失败:检查网络、端口、账号权限
- Last_SQL_Error 提示事务冲突:分析冲突SQL,必要时跳过或修复

2)线程状态:

SHOW PROCESSLIST;

预期:Slave_IOSlave_SQL 线程正常运行;如长时间 Waiting for master to send event,检查网络或主库负载。

3)延迟排查步骤(示例命令串):

# 主库binlog生成速率
mysql -e "SHOW GLOBAL STATUS LIKE 'Binlog_%';"

# 从库回放队列大小
mysql -e "SHOW GLOBAL STATUS LIKE 'Relay_Log_Space';"

# 从库SQL线程延迟原因
mysql -e "SHOW SLAVE STATUS\G" | egrep "Seconds_Behind_Master|Last_SQL_Error|SQL_Delay"

五、典型排错示例(GTID冲突)
问题:Last_SQL_Error: The slave SQL thread stops because it cannot find ... gtid
处理示例:

-- 停止复制
STOP SLAVE;

-- 跳过缺失GTID(谨慎使用,需评估一致性)
SET GLOBAL sql_slave_skip_counter=1;

-- 或通过注入空事务补齐GTID
SET GTID_NEXT='aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee:123';
BEGIN; COMMIT;
SET GTID_NEXT='AUTOMATIC';

START SLAVE;

六、练习
1)搭建一主两从拓扑,验证 Seconds_Behind_Master
2)在从库设置 slave_parallel_workers=4,对比回放延迟变化。
3)模拟网络抖动(限速或丢包),观察 Relay_Log_SpaceSeconds_Behind_Master
4)配置延迟从库 MASTER_DELAY=300,模拟误删后从延迟库恢复数据。
5)写出一份复制拓扑命名规范(如 prod-m1, prod-r1, prod-r1-c1)。