Skip to content

第24章:主从复制 ​

本章目标 ​

搭建 Redis 主从架构,实现读写分离


24.1 主从复制是什么 ​

┌──────────┐
│  Master  │ ← 写操作
└────┬─────┘
     │ 复制
  ┌──┴──┐
  │     │
┌─▼──┐ ┌▼───┐
│Slave│ │Slave│ ← 读操作
└─────┘ └─────┘

24.2 配置主从 ​

bash
# 方式一:命令配置(重启失效)
REPLICAOF 192.168.1.100 6379    # 指定主库 IP 和端口

# 方式二:配置文件
replicaof 192.168.1.100 6379
replica-read-only yes           # 从库只读

# 查看复制状态
INFO replication
# role:slave
# master_link_status:up

Docker 快速搭建 ​

bash
# 启动主库
docker run -d --name redis-master -p 6379:6379 redis:7

# 启动从库
docker run -d --name redis-slave --link redis-master:master \
  redis:7 redis-server --replicaof master 6379

24.3 全量复制 vs 增量复制 ​

阶段何时触发数据量
全量复制从库首次连接 / 复制积压缓冲区溢出全部数据
增量复制从库短暂断线重连断线期间的命令
全量复制流程:
Master fork → 子进程生成 RDB → 发 RDB 给 Slave → Slave 加载 RDB
                                          ↓
                              Master 缓存写命令
                              Slave RDB 加载完 → 发缓存命令 → 追平

24.4 读写分离 ​

go
// 写操作 → Master
master.Set(ctx, "key", "value", 0)

// 读操作 → Slave
slave.Get(ctx, "key")

注意事项:

  • 主从延迟:Master 写入后,Slave 可能还没同步(通常毫秒级)
  • 读到旧数据:对实时性要求高的场景需要强制读 Master

常见错误 ​

错误1:主从都写(数据不一致) ​

bash
# ❌ 在从库执行写操作
# 从库默认只读,如果关了只读,写入的数据不会同步到主库
# 导致主从数据不一致!

错误2:主从延迟导致"刚写就读不到" ​

# Master 写入 → 应用认为写完了 → 立即从 Slave 读 → 还没同步!
# 解决:对实时性要求高的读走 Master

本章小结 ​

  • REPLICAOF host port 配置主从
  • 全量复制(首次)+ 增量复制(断线重连)
  • 读写分离:Master 写、Slave 读
  • 主从延迟:毫秒级,敏感场景读 Master

练习题 ​

  1. 用 Docker 搭建 1 主 1 从。
  2. 在主库写入数据,验证从库能否读到。
  3. 用 INFO replication 查看主从状态。

把零散知识,整理成可以反复走的路。