级联复制的原理与应用场景

级联复制的原理与应用场景

概述

级联复制(Cascading Replication)是一种链式复制架构:从库不直接从主库同步数据,而是从另一个从库同步。这种架构可以减轻主库的复制负载,适合从库数量较多的场景。

基本架构

传统星形架构

          ┌── 从库 A
          │
主库 ─────┼── 从库 B
          │
          └── 从库 C
          (所有从库直连主库,主库需要为每个从库维护 Binlog Dump 线程)

主库需要为每个从库维护一个 Binlog Dump 线程。如果从库很多(如 20+),主库压力很大。

级联复制架构

主库 ───→ 从库 1(中继)───→ 从库 2
                 │
                 ├──→ 从库 3
                 │
                 └──→ 从库 4

主库只需要服务一个从库(中继从库),其他从库从中继从库同步。

多层级联

主库 → 从库 A → 从库 B → 从库 C
                        ↓
                     从库 D

级联复制的配置

级联复制中,中间节点既是”从库”(从上游同步),又是”主库”(向下游提供 Binlog)。

第一步:中间节点开启 Binlog

# 中间节点(如 从库 1)的配置
[mysqld]
server-id = 2
log_bin = /var/log/mysql/mysql-bin  -- 开启 Binlog(记录变更)
log_slave_updates = ON              -- 关键!将从库回放的事务也写入 Binlog
binlog_format = ROW

关键参数log_slave_updates = ON

这个参数告诉 MySQL:SQL 线程回放的变更也写入本机的 Binlog。这样下层节点才能从这个”从库”拉取数据。

第二步:配置复制链路

-- 第一层:主库 → 从库 1
-- 从库 1 上执行
CHANGE MASTER TO
  MASTER_HOST='192.168.1.10',      -- 这是主库
  MASTER_PORT=3306,
  MASTER_USER='repl',
  MASTER_PASSWORD='password',
  MASTER_AUTO_POSITION = 1;
START SLAVE;

-- 第二层:从库 1 → 从库 2
-- 从库 2 上执行
CHANGE MASTER TO
  MASTER_HOST='192.168.1.11',      -- 这是从库 1(中继节点)
  MASTER_PORT=3306,
  MASTER_USER='repl',
  MASTER_PASSWORD='password',      -- 使用相同的复制账号
  MASTER_AUTO_POSITION = 1;
START SLAVE;

级联复制时的 GTID

GTID 在级联复制中保持不变,可以跨级追踪:

主库 GTID = 3e11fa47:1

事务写入主库:
GTID = 3e11fa47:1

↓ 同步到从库 1

从库 1 执行 GTID = 3e11fa47:1
从库 1 的 Binlog 中包含 GTID = 3e11fa47:1(因为 log_slave_updates=ON)

↓ 从库 2 从从库 1 拉取

从库 2 执行 GTID = 3e11fa47:1

所有节点上的 GTID 是相同的,这有助于排查问题。

级联复制的优缺点

优点

优点 说明
减轻主库压力 主库只需要维护少量 Binlog Dump 线程
支持更多从库 通过多层扩展,可以支持几十甚至上百个从库
单一复制账号 所有节点可以使用相同的复制账号
网络隔离 中间层可以部署在核心网络,下层在边缘网络

缺点

缺点 说明
延迟更大 每多一级就多一次复制延迟
故障面扩大 中间节点故障会影响下层所有从库
排障更复杂 问题可能发生在任何一级,排查链条更长
配置更复杂 需要正确设置 log_slave_updates

延迟分析

主库写入 → 从库 1 同步 → 从库 2 同步 → 从库 3 同步

假设每级延迟 2 秒:
从库 1 延迟 = 主库写入后 2 秒可见
从库 2 延迟 = 主库写入后 4 秒可见
从库 3 延迟 = 主库写入后 6 秒可见

级联深度建议不超过 3 层,否则延迟可能不可接受。

应用场景

场景一:大量从库的读扩展

主库 → [从库 A] → 从库 1 ~ 从库 5(业务 A)
     → [从库 B] → 从库 6 ~ 从库 10(业务 B)
     → [从库 C] → 从库 11 ~ 从库 15(业务 C)

主库只需要 3 个连接(到从库 A/B/C),而非 15 个。

场景二:多机房/多数据中心

北京机房                    上海机房
主库 → 从库 1(跨机房同步) → 从库 2
                ↓
             从库 3

跨机房同步只有一条链路,延迟相对可控。上海机房内部再级联分发。

场景三:读写分离 + 分析库分离

主库 → 从库 A(业务读取)
     → 从库 B(分析/报表)
            ↓
         从库 C(离线备份/ETL)

分析库和离线备份从从库同步,不影响主库和业务从库。

最佳实践

# 中间节点的关键配置
[mysqld]
server-id = 2
log_bin = /var/log/mysql/mysql-bin
log_slave_updates = ON           -- 必须开启,否则下层无法同步
binlog_format = ROW
expire_logs_days = 3             -- 中间节点 Binlog 不需要保留太久
relay_log = /var/log/mysql/relay-log

监控建议

-- 在每一层查看复制状态
SHOW SLAVE STATUS\G

-- 检查从上到下的 GTID 是否一致
-- 主库
SELECT @@GLOBAL.gtid_executed;
-- 从库 1
SELECT @@GLOBAL.gtid_executed;
-- 应该包含主库的 GTID

面试要点

  1. 级联复制 = 从库可以同时作为”主库”,向下层提供 Binlog
  2. log_slave_updates=ON 是关键配置,让从库回放的事务也写入 Binlog
  3. 优点:减轻主库负载,支持更多从库
  4. 缺点:延迟逐级累加,一级故障影响整条链路
  5. 建议级联深度不超过 3 层
  6. GTID 在级联复制中不变(所有节点使用相同的 GTID),便于排障
  7. 典型应用场景:大量从库、多机房、分析库分离
© 版权声明
THE END
喜欢就支持一下吧
点赞10 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容