Redis 主从同步(Replication)是指将一台 Redis 服务器(主节点)的数据复制到其他 Redis 服务器(从节点)的过程。
以下是 Redis 主从同步的实现原理和配置方式。
一、主从同步工作原理
1. 全量同步(初始同步)
当从节点第一次连接主节点,或从节点与主节点断开连接时间过久时,会触发全量同步:
-
从节点发送
PSYNC ? -1命令请求全量同步。 -
主节点执行
BGSAVE生成 RDB 文件,同时缓存新写入的命令。 -
主节点将 RDB 文件发送给从节点,从节点清空旧数据并加载 RDB。
-
主节点将缓存的写命令(Replication Buffer)发送给从节点执行。
2. 增量同步(断线重连)
当从节点短线重连后,如果条件允许,会进行增量同步:
-
从节点保存了主节点的
runID和复制偏移量offset。 -
从节点发送
PSYNC <runID> <offset>命令。 -
主节点判断
offset是否在复制积压缓冲区(Repl Backlog Buffer)中:-
如果在,则发送缓冲区中从
offset到最新的写命令。 -
如果不在,则触发全量同步。
-
二、配置主从同步
1. 临时配置(重启失效)
在从节点上执行命令:
bash
# 设置主节点地址和端口
SLAVEOF <master-ip> <master-port>
# 取消复制,恢复为主节点
SLAVEOF NO ONE
2. 永久配置
修改从节点的 redis.conf:
bash
# 指定主节点
replicaof <master-ip> <master-port>
# 如果主节点有密码,需配置
masterauth <master-password>
# 从节点只读(默认)
replica-read-only yes
三、关键配置参数
| 参数 | 说明 |
|---|---|
repl-backlog-size |
复制积压缓冲区大小(影响断线重连能否增量同步) |
repl-timeout |
复制超时时间(默认 60 秒) |
min-replicas-to-write |
主节点至少写入的从节点数量 |
replica-serve-stale-data |
从节点与主节点失联时是否响应旧数据 |
四、主从同步流程示例
bash
# 1. 启动主节点(默认端口 6379)
redis-server
# 2. 启动从节点并连接主节点
redis-server --port 6380 --replicaof 127.0.0.1 6379
# 3. 查看主从状态
redis-cli -p 6379 info replication # 主节点
redis-cli -p 6380 info replication # 从节点
五、常见问题与优化
1. 主从数据不一致
-
原因:网络延迟、从节点负载过高。
-
解决 :监控
master_repl_offset和slave_repl_offset差值。
2. 全量同步频繁
-
原因:复制积压缓冲区大小不足或从节点频繁重启。
-
解决 :增大
repl-backlog-size,避免频繁重启。
3. 主节点内存溢出
-
原因 :
BGSAVE生成 RDB 时内存翻倍。 -
解决:主节点内存预留一半,或使用磁盘缓冲。
六、相关命令
bash
# 查看复制信息
INFO replication
# 手动触发全量同步(从节点)
REPLICAOF <master-ip> <master-port>
# 提升从节点为主节点(故障转移时)
REPLICAOF NO ONE
通过以上配置和原理,Redis 主从同步可以实现数据的高可用备份和读写分离(从节点处理读请求)。