第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:upDocker 快速搭建
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 637924.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
练习题
- 用 Docker 搭建 1 主 1 从。
- 在主库写入数据,验证从库能否读到。
- 用 INFO replication 查看主从状态。