Redis主从复制 #
一、主从复制概述 #
1.1 什么是主从复制 #
Redis主从复制是指将一个Redis服务器的数据复制到其他Redis服务器:
- 主节点(Master):负责写操作
- 从节点(Slave):负责读操作,复制主节点数据
text
主从复制架构:
┌─────────────────────────────────────────────────────────┐
│ 主节点 (Master) │
│ 读写操作 │
│ 192.168.1.100:6379 │
└─────────────────────────────────────────────────────────┘
│
┌─────────────┼─────────────┐
│ │ │
▼ ▼ ▼
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ 从节点1 │ │ 从节点2 │ │ 从节点3 │
│ 只读操作 │ │ 只读操作 │ │ 只读操作 │
│ .101:6379 │ │ .102:6379 │ │ .103:6379 │
└─────────────┘ └─────────────┘ └─────────────┘
1.2 主从复制作用 #
text
主从复制作用:
┌─────────────────────────────────────────────┐
│ 1. 数据冗余 │
│ - 多份数据副本 │
│ - 数据备份 │
│ │
│ 2. 读写分离 │
│ - 主节点写 │
│ - 从节点读 │
│ - 提高读性能 │
│ │
│ 3. 高可用基础 │
│ - 故障转移 │
│ - 哨兵机制 │
└─────────────────────────────────────────────┘
二、配置主从复制 #
2.1 配置文件方式 #
bash
# 从节点配置文件 redis.conf
# 方式1:replicaof(Redis 5.0+)
replicaof 192.168.1.100 6379
# 方式2:slaveof(旧版本)
slaveof 192.168.1.100 6379
# 主节点密码
masterauth yourpassword
# 从节点只读
replica-read-only yes
# 复制超时时间
repl-timeout 60
2.2 命令行方式 #
bash
# 连接从节点
redis-cli -h 192.168.1.101 -p 6379
# 设置主节点
REPLICAOF 192.168.1.100 6379
# OK
# 或使用旧命令
SLAVEOF 192.168.1.100 6379
# OK
# 取消主从关系
REPLICAOF NO ONE
# OK
2.3 Docker方式 #
bash
# 主节点
docker run -d --name redis-master \
-p 6379:6379 \
redis:7.0
# 从节点1
docker run -d --name redis-slave1 \
-p 6380:6379 \
redis:7.0 \
redis-server --replicaof redis-master 6379
# 从节点2
docker run -d --name redis-slave2 \
-p 6381:6379 \
redis:7.0 \
redis-server --replicaof redis-master 6379
三、复制原理 #
3.1 复制过程 #
text
Redis主从复制过程:
┌─────────────────────────────────────────────────────────┐
│ 1. 建立连接 │
│ 从节点连接主节点 │
│ 发送SYNC命令 │
├─────────────────────────────────────────────────────────┤
│ 2. 全量复制 │
│ 主节点执行BGSAVE生成RDB │
│ 主节点发送RDB给从节点 │
│ 从节点加载RDB │
├─────────────────────────────────────────────────────────┤
│ 3. 增量复制 │
│ 主节点发送写命令给从节点 │
│ 从节点执行写命令 │
├─────────────────────────────────────────────────────────┤
│ 4. 持续同步 │
│ 主节点持续发送写命令 │
│ 从节点持续执行 │
└─────────────────────────────────────────────────────────┘
3.2 全量复制 #
text
全量复制触发条件:
1. 从节点第一次连接主节点
2. 从节点断开后重连,但复制偏移量不在主节点缓冲区
3. 主节点无法进行部分复制
全量复制过程:
┌─────────────────────────────────────────────┐
│ 主节点 │
│ 1. BGSAVE生成RDB │
│ 2. 缓存写命令到缓冲区 │
│ 3. 发送RDB给从节点 │
│ 4. 发送缓冲区命令给从节点 │
└─────────────────────────────────────────────┘
3.3 部分复制 #
text
部分复制触发条件:
1. 从节点断开后重连
2. 复制偏移量在主节点缓冲区范围内
部分复制过程:
┌─────────────────────────────────────────────┐
│ 从节点 │
│ 1. 发送PSYNC命令和偏移量 │
│ │
│ 主节点 │
│ 2. 检查偏移量是否在缓冲区 │
│ 3. 如果在,发送缺失的命令 │
│ 4. 如果不在,执行全量复制 │
└─────────────────────────────────────────────┘
3.4 复制积压缓冲区 #
bash
# 配置复制积压缓冲区大小
# redis.conf
repl-backlog-size 1mb
# 缓冲区越大,部分复制概率越大
# 但占用更多内存
四、查看复制状态 #
4.1 主节点状态 #
bash
# 连接主节点
redis-cli -h 192.168.1.100 -p 6379
# 查看复制信息
INFO replication
# 输出示例:
# role:master
# connected_slaves:2
# slave0:ip=192.168.1.101,port=6379,state=online,offset=1234,lag=0
# slave1:ip=192.168.1.102,port=6379,state=online,offset=1234,lag=1
4.2 从节点状态 #
bash
# 连接从节点
redis-cli -h 192.168.1.101 -p 6379
# 查看复制信息
INFO replication
# 输出示例:
# role:slave
# master_host:192.168.1.100
# master_port:6379
# master_link_status:up
# master_last_io_seconds_ago:1
# master_sync_in_progress:0
# slave_repl_offset:1234
4.3 复制相关命令 #
bash
# 查看复制状态
INFO replication
# 查看主节点信息
ROLE
# 1) "master"
# 2) (integer) 2
# 3) 1) 1) "192.168.1.101"
# 2) "6379"
# 3) "1234"
# 从节点查看
ROLE
# 1) "slave"
# 2) "192.168.1.100"
# 3) (integer) 6379
# 4) "connected"
# 5) (integer) 1234
五、读写分离 #
5.1 读写分离架构 #
text
读写分离架构:
┌─────────────────────────────────────────────────────────┐
│ 应用程序 │
│ 写操作 读操作 │
└─────────────────────────────────────────────────────────┘
│ │
▼ ▼
┌─────────────────┐ ┌─────────────────┐
│ 主节点 │ │ 从节点 │
│ 写操作 │ │ 读操作 │
│ 192.168.1.100 │ │ 192.168.1.101 │
└─────────────────┘ └─────────────────┘
5.2 客户端配置 #
python
# Python示例
import redis
# 主节点连接(写)
master = redis.Redis(host='192.168.1.100', port=6379)
# 从节点连接(读)
slave = redis.Redis(host='192.168.1.101', port=6379)
# 写操作使用主节点
master.set('key', 'value')
# 读操作使用从节点
value = slave.get('key')
5.3 注意事项 #
text
读写分离注意事项:
1. 复制延迟
┌─────────────────────────────────────────────┐
│ 主从复制有延迟 │
│ 刚写入的数据可能从节点还没同步 │
│ 强一致性场景需要直接读主节点 │
└─────────────────────────────────────────────┘
2. 从节点只读
┌─────────────────────────────────────────────┐
│ 从节点默认只读 │
│ 写操作会报错 │
│ 可以配置允许写(不推荐) │
└─────────────────────────────────────────────┘
3. 主节点故障
┌─────────────────────────────────────────────┐
│ 主节点故障后需要手动或自动故障转移 │
│ 使用哨兵或集群实现自动故障转移 │
└─────────────────────────────────────────────┘
六、级联复制 #
6.1 级联复制架构 #
text
级联复制架构:
┌─────────────────────────────────────────────────────────┐
│ 主节点 │
│ 192.168.1.100 │
└─────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────┐
│ 从节点1 │
│ 192.168.1.101 │
└─────────────────────────────────────────────────────────┘
│
┌─────────────┼─────────────┐
▼ ▼ ▼
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ 从节点2 │ │ 从节点3 │ │ 从节点4 │
│ .102 │ │ .103 │ │ .104 │
└─────────────┘ └─────────────┘ └─────────────┘
优点:减轻主节点压力
缺点:增加复制延迟
6.2 配置级联复制 #
bash
# 从节点2配置
redis-cli -h 192.168.1.102 -p 6379
REPLICAOF 192.168.1.101 6379
七、最佳实践 #
7.1 网络配置 #
bash
# 主节点配置
bind 0.0.0.0
protected-mode no
# 或使用密码认证
requirepass yourpassword
masterauth yourpassword
7.2 性能优化 #
bash
# 关闭主节点持久化(可选)
# 如果从节点开启持久化,主节点可以关闭
save ""
appendonly no
# 从节点开启持久化
save 900 1
appendonly yes
# 增大复制缓冲区
repl-backlog-size 100mb
7.3 监控指标 #
bash
# 监控复制延迟
INFO replication
# 关注 slave_repl_offset 和 master_repl_offset 差值
# 监控复制状态
# master_link_status: up/down
八、总结 #
主从复制命令:
| 命令 | 说明 |
|---|---|
| REPLICAOF | 设置主节点 |
| SLAVEOF | 设置主节点(旧) |
| INFO replication | 查看复制状态 |
| ROLE | 查看角色 |
配置要点:
| 配置项 | 说明 |
|---|---|
| replicaof | 主节点地址 |
| masterauth | 主节点密码 |
| replica-read-only | 从节点只读 |
| repl-backlog-size | 复制缓冲区大小 |
应用场景:
| 场景 | 实现方式 |
|---|---|
| 读写分离 | 主写从读 |
| 数据备份 | 从节点持久化 |
| 高可用 | 配合哨兵 |
下一步,让我们学习Redis集群!
最后更新:2026-03-27