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