跨数据中心MySQL主从复制需调优网络与GTID参数:设slave_net_timeout=60、启用slave_compressed_protocol、禁用skip_slave_start并加重启逻辑;GTID场景须避免gtid_purged误设,慎用enforce_gtid_consistency;半同步在跨城下易退化,建议改用MASTER_DELAY;禁用库表级复制过滤,优先应用层写分离。
跨数据中心复制最直接的问题不是配置失败,而是 Seconds_Behind_Master 持续飙升甚至卡死。这不是 MySQL 配置错了,而是 TCP 层在高延迟(比如 50–200ms RTT)下默认参数严重不适应。
slave_net_timeout(建议设为 60),否则从库在短暂网络抖动后会主动断开 IO 线程,反复重连导致复制中断my.cnf 中启用 slave_compressed_protocol=ON,能显著降低带宽占用和传输时
间,尤其对大事务日志有效skip_slave_start,但要在启动脚本里加重试逻辑——因为跨 DC 的首次连接失败率高,靠 MySQL 自身不重试开启 GTID 后跨 DC 复制,常见现象是主库 failover 后从库报错 Could not execute Write_rows_v1 event on table xxx; Duplicate entry,本质是 GTID set 不一致或 gtid_purged 被错误覆盖。
RESET MASTER 前,必须先在所有从库上记录当前 SELECT @@global.gtid_executed;,否则重建主库后无法安全指向新位点SET GLOBAL gtid_purged = '...';,除非你已停掉 SQL 线程、清空 relay log 并确认该 GTID 集合完全不包含本地已执行事务enforce_gtid_consistency = OFF(仅限明确不使用匿名事务的环境),避免因存储过程/临时表等触发强制拒绝rpl_semi_sync_master_enabled=ON 在同城双机房可能有效,但在跨城(如北京 ↔ 广州)基本不可用:只要一个 ACK 超时(默认 rpl_semi_sync_master_timeout=10000 ms),就会自动退化为异步,且后续不会自动恢复半同步状态。
rpl_semi_sync_master_timeout 设为 ≥ 30000,并配合监控 Rpl_semi_sync_master_status 和 Rpl_semi_sync_master_no_tx 指标,及时发现退化MASTER_DELAY(如 CHANGE MASTER TO MASTER_DELAY = 3600),牺牲实时性换回可控性——延迟复制至少能防误删、误更新LOG_BIN_TRUST_FUNCTION_CREATORS 等依赖精确时序的审计方案用 replicate_do_db 或 replicate_wild_do_table 做库表级过滤,看似节省带宽,实则在跨 DC 场景中极易引发数据不一致。
replicate_do_db)受 USE db_name 影响,而主库上的跨库操作(如 INSERT INTO otherdb.t1 SELECT * FROM mydb.t2)会被从库忽略,造成静默丢失replicate_rewrite_db 做命名空间映射(如把主库 prod_xxx 映射到从库 dr_xxx),并确保所有 DML 显式指定库名CHANGE MASTER TO MASTER_HOST='10.20.30.40', MASTER_PORT=3306, MASTER_USER='repl', MASTER_PASSWORD='xxx', MASTER_SSL=1, MASTER_SSL_CA='/etc/mysql/ca.pem', MASTER_SSL_CERT='/etc/mysql/client-cert.pem', MASTER_SSL_KEY='/etc/mysql/client-key.pem', MASTER_AUTO_POSITION=1, MASTER_DELAY=3600;
跨 DC 复制没有“开箱即用”的最优解,关键参数往往要根据真实 RTT、事务大小分布、failover 频率反复调。最容易被忽略的是:从库磁盘 I/O 能力必须 ≥ 主库,否则网络再快,relay log 写不过来照样堆积。