Redis 主从复制搭建
本章重点: redis主从复制搭建(不推荐使用,看看练手吧),生产环境建议搭配哨兵模式或集群模式使用。
来源: 豆包ai, redis原理-1,redis 安装与数据模型-2
Redis 主从复制是实现读写分离、数据备份的基础,以下以「1 主 2 从」架构为例,提供 step-by-step 搭建流程,包含环境准备、配置、启动、验证全流程,命令可直接复用。
一、前置准备
-
前置条件
-
3 台服务器均已安装 Redis: 安装参考
-
关闭防火墙或开放 6379 端口(避免主从通信失败):
bash# 临时关闭防火墙(CentOS) systemctl stop firewalld # 永久开放 6379 端口(推荐) firewall-cmd --permanent --add-port=6379/tcp firewall-cmd --reload -
主节点已配置密码(生产环境必配,示例密码:
xiong)。
-
-
服务器规划, 上章编译的redis ,提取码:1234
角色 IP 地址 端口 作用 主节点(Master) 192.168.189.129 6379 处理写操作、同步数据 从节点(Slave1) 192.168.189.134 6379 处理读操作、备份数据 从节点(Slave2) 192.168.189.135 6379 处理读操作、备份数据
二、主从搭建
2.1、主节点
-
主节点需开启「允许从节点连接」「配置密码」,无需额外复杂配置。
-
编辑主节点 Redis 配置文件
bashvim /data/redis/bin/redis.conf # 绑定地址(允许所有IP连接,或指定从节点IP) bind 0.0.0.0 # 端口(默认6379,可自定义) port 6379 # 开启后台运行 daemonize yes # 设置访问密码(生产环境必配,从节点连接需用) requirepass xiong # 允许从节点复制(默认开启,无需修改) replica-serve-stale-data yes # 明确声明主节点可写,增强配置可读性,避免后续误改(默认是yes) replica-read-only no -
启动redis
bash.# 连接主节点客户端 redis-cli -h 192.168.189.129 -p 6379 -a xiong # 执行 info replication 查看复制状态 192.168.189.129:6379> info replication -
输出关键信息(表示主节点就绪,暂无从节点连接):
bashrole:master # 角色为master connected_slaves:0 # 已连接从节点数为0 master_failover_state:no-failover master_replid:6f3d93a2a4175b34de17d3341b029aa4a58ae919 master_replid2:0000000000000000000000000000000000000000 master_repl_offset:0 second_repl_offset:-1 repl_backlog_active:0 repl_backlog_size:1048576 repl_backlog_first_byte_offset:0 repl_backlog_histlen:0
2.2、从节点
-
说明: Slave1/Slave2,操作完全一致
-
编辑从节点 Redis 配置文件
bashvim /data/redis/bin/redis.conf # 绑定地址 bind 0.0.0.0 # 端口(默认6379,若单机多实例需修改为6380、6381等) port 6379 # 开启后台运行 daemonize yes # 从节点连接主节点的密码(需与主节点 requirepass 一致) # masterauth <master-password> <-- 默认在配置的 540行 masterauth xiong # 指定主节点 IP 和端口(核心配置) 默认位置在524-542行之间 # replicaof <masterip> <masterport> 加到这行下面 replicaof 192.168.189.129 6379 # 从节点只读模式(默认yes,禁止写操作,避免数据不一致) replica-read-only yes # 若主节点故障,从节点是否继续提供读服务(默认yes,推荐开启) replica-serve-stale-data yes-
注意:Redis 5.0+ 版本支持用
replicaof(推荐),旧版本用slaveof,功能完全一致。 -
replica-read-only说明参数作用 主节点默认值 从节点默认值 核心逻辑 控制节点是否允许写操作 no(可写)yes(只读)- 主节点的核心职责是处理写请求,默认就是 no(允许写); - 从节点的核心职责是同步数据 + 分担读请求,默认yes(禁止写),避免数据不一致。
-
-
启动redis
bashsystemctl restart redis
三、验证主从复制状态
3.1、正常验证
-
主节点验证
bash]# ./redis-cli -h 192.168.189.129 -a xiong 192.168.189.129:6379> info replication # Replication role:master # 角色:主节点 connected_slaves:2 # 已连接从节点数:2个 slave0:ip=192.168.189.134,port=6379,state=online,offset=28,lag=0 # 从节点1:IP+端口,在线,同步偏移28,延迟0秒 slave1:ip=192.168.189.135,port=6379,state=online,offset=28,lag=0 # 从节点2:IP+端口,在线,同步偏移28,延迟0秒 master_failover_state:no-failover # 故障切换状态:无 master_replid:d12cc8641b7d2bd74285d0f0c292251532843ce1 # 主节点复制ID(唯一标识) master_replid2:0000000000000000000000000000000000000000 # 备用复制ID(未切换过主节点) master_repl_offset:28 # 主节点当前复制偏移量(数据同步进度) second_repl_offset:-1 # 备用复制ID偏移量(无) repl_backlog_active:1 # 复制积压缓冲区:激活 repl_backlog_size:1048576 # 缓冲区大小:1MB repl_backlog_first_byte_offset:1 # 缓冲区起始偏移量:1 repl_backlog_histlen:28 # 缓冲区有效数据长度:28字节 -
从节点两台
bash[root@localhost bin]# ./redis-cli -a xiong 127.0.0.1:6379> info replication # Replication role:slave # 角色:从节点 master_host:192.168.189.129 # 主节点IP master_port:6379 # 主节点端口 master_link_status:up # 主从连接:正常 master_last_io_seconds_ago:9 # 上次通信:9秒前 master_sync_in_progress:0 # 同步中:否 slave_read_repl_offset:140 # 已读同步偏移:140 slave_repl_offset:140 # 已写同步偏移:140 replica_full_sync_buffer_size:0 # 全量同步缓冲区:0(未使用) replica_full_sync_buffer_peak:0 # 缓冲区峰值:0 master_current_sync_attempts:1 # 当前同步尝试:1次 master_total_sync_attempts:1 # 累计同步尝试:1次 master_link_up_since_seconds:95 # 连接时长:95秒 total_disconnect_time_sec:0 # 累计断开时长:0秒 slave_priority:100 # 从节点优先级:100(默认) slave_read_only:1 # 只读模式:开启 replica_announced:1 # 集群宣告:开启 connected_slaves:0 # 下属从节点:0个 master_failover_state:no-failover # 故障切换状态:无 master_replid:d12cc8641b7d2bd74285d0f0c292251532843ce1 # 主节点复制ID master_replid2:0000000000000000000000000000000000000000 # 备用复制ID(无) master_repl_offset:140 # 主节点当前偏移量:140 second_repl_offset:-1 # 备用偏移量:无 repl_backlog_active:1 # 复制积压缓冲区:激活 repl_backlog_size:1048576 # 缓冲区大小:1MB repl_backlog_first_byte_offset:15 # 缓冲区起始偏移:15 repl_backlog_histlen:126 # 缓冲区有效数据:126字节 -
数据同步测试
-
主节点写入数据:
bash192.168.189.129:6379> hset i:ok id 1 name xiong age 100 high 200 (integer) 4 -
从节点读取数据(验证同步成功): 两台都试一下
bash./redis-cli -a xiong # 只管连上来,也不挑节点 127.0.0.1:6379> HGETALL i:ok 1) "id" 2) "1" 3) "name" 4) "xiong" 5) "age" 6) "100" 7) "high" 8) "200"
-
3.2、切换主从
-
模拟,我们把 129 stop
bashsystemctl stop redis -
134上查看集群状态
bash192.168.189.134:6379> INFO replication # Replication role:slave master_host:192.168.189.129 master_port:6379 master_link_status:down <---- 状态已经是down -
主从需要 手动切换状态
bash# 提升134为主节点 (取消主从关系,转为主节点) 192.168.189.134:6379> replicaof no one OK # 改为写状态 192.168.189.134:6379> config set replica-read-only no OK 192.168.189.134:6379> INFO replication # Replication role:master <-- 此时状态已经为master connected_slaves:0 master_failover_state:no-failover master_replid:76cb0bf4cc2d44fc16a151d7e95ba54c12e2afe8 <-- 新的 masterid master_replid2:d12cc8641b7d2bd74285d0f0c292251532843ce1 <-- 上一个master无了 -
再将135修改为134的从节点, 注意 主从是不会改动状态的
bash./redis-cli -h 192.168.189.135 -p 6379 -a xiong # 1. 取消与原主 A 的主从关系(等效于断开旧连接) 192.168.189.135:6379> replicaof no one OK # 2. 重新关联新主 B(B 节点的 IP 和端口) 192.168.189.135:6379> replicaof 192.168.189.134 6379 # B 节点的 IP+端口 OK # 3. 若 B 节点有访问密码(必做!否则 C 无法同步 B 的数据) 192.168.189.135:6379> config set masterauth xiong # 密码替换为 B 节点的 requirepass 值 OK # 4. 查看 状态 192.168.189.135:6379> INFO replication role:slave # 角色仍为从节点 master_host:192.168.189.134 # 主节点 IP 已改为 B 的 IP master_port:6379 # 主节点端口为 B 的端口 master_link_status:up # 与 B 的连接状态为 up(正常) slave_read_repl_offset:1927 # 同步偏移量在增长(表示正在同步 B 的数据) master_replid:76cb0bf4cc2d44fc16a151d7e95ba54c12e2afe8 # id已经改成了 134的 -
以上操作是临时生效的,若 135 节点重启,会恢复为原主 129 的配置。需修改 135 节点的 Redis 配置文件,永久绑定新主 135:
bashvim /data/redis/bin/redis.conf replicaof 192.168.189.129 6379 masterauth xiong # B 节点的访问密码(与 B 的 requirepass 一致) -
操作完成后,架构变为:
134(主节点,可写) ← 135(从节点,只读),原主 129 故障后,通过手动切换实现了集群恢复。生产环境建议搭配哨兵模式(Sentinel),实现主节点故障自动切换,无需手动操作。
四、补充
4.1、配置说明
-
配置项说明
配置项 作用 主 / 从节点 推荐值 replicaof指定主节点 IP: 端口 从节点 主节点实际 IP 和端口 masterauth主节点访问密码 从节点 与主节点 requirepass一致replica-read-only从节点是否只读 从节点 yes(生产环境强制开启) repl-backlog-size复制缓冲区大小(增量同步用) 主节点 1024mb(默认 1mb,高并发场景增大) repl-diskless-sync是否无盘同步(避免生成 RDB 临时文件) 主节点 yes(减少磁盘 IO 压力) -
replica-read-only
- 主节点:
replica-read-only需确保为no(默认就是 no,建议显式配置),否则无法写数据; - 从节点:必须保持
yes(默认值),禁止写操作,避免数据不一致; - 验证优先:通过
config get replica-read-only和实际写测试,确认主节点状态。
- 主节点:
4.2、常见问题排查
- 从节点连接主节点失败
- 检查主节点
bind配置是否为0.0.0.0(允许远程连接); - 验证主节点密码是否正确(从节点
masterauth需与主节点requirepass一致); - 检查防火墙是否开放 6379 端口,或主从节点之间网络是否互通(
ping 主节点IP测试); - 查看从节点日志(默认
/var/log/redis/redis-server.log),排查具体错误。
- 检查主节点
- 从节点同步数据延迟
- 增大主节点
repl-backlog-size(如设为 1GB),避免增量同步缓冲区溢出; - 减少主节点写压力(读写分离,读请求分流到从节点);
- 确保主从节点网络带宽充足(避免跨机房高延迟)。
- 增大主节点
4.3、总结
- 主从复制搭建核心:主节点开启密码和远程连接,从节点通过
replicaof和masterauth关联主节点; - 核心能力:主节点写、从节点读,实现读写分离(减轻主节点压力)和数据备份(避免单点数据丢失);
- 局限性:无自动故障切换,主节点故障后需手动干预,生产环境建议搭配哨兵模式或集群模式使用。