linux服务-redis 主从复制搭建-3

Redis 主从复制搭建

本章重点: redis主从复制搭建(不推荐使用,看看练手吧),生产环境建议搭配哨兵模式或集群模式使用。

来源: 豆包airedis原理-1redis 安装与数据模型-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、主节点

  1. 主节点需开启「允许从节点连接」「配置密码」,无需额外复杂配置。

  2. 编辑主节点 Redis 配置文件

    bash 复制代码
    vim /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
  3. 启动redis

    bash. 复制代码
    # 连接主节点客户端
    redis-cli -h 192.168.189.129 -p 6379 -a xiong
    # 执行 info replication 查看复制状态
    192.168.189.129:6379> info replication
  4. 输出关键信息(表示主节点就绪,暂无从节点连接):

    bash 复制代码
    role: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 配置文件

    bash 复制代码
    vim /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

    bash 复制代码
    systemctl 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字节
  • 数据同步测试

    • 主节点写入数据

      bash 复制代码
      192.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

    bash 复制代码
    systemctl stop redis
  • 134上查看集群状态

    bash 复制代码
    192.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:

    bash 复制代码
    vim /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、常见问题排查

  1. 从节点连接主节点失败
    • 检查主节点 bind 配置是否为 0.0.0.0(允许远程连接);
    • 验证主节点密码是否正确(从节点 masterauth 需与主节点 requirepass 一致);
    • 检查防火墙是否开放 6379 端口,或主从节点之间网络是否互通(ping 主节点IP 测试);
    • 查看从节点日志(默认 /var/log/redis/redis-server.log),排查具体错误。
  2. 从节点同步数据延迟
    • 增大主节点 repl-backlog-size(如设为 1GB),避免增量同步缓冲区溢出;
    • 减少主节点写压力(读写分离,读请求分流到从节点);
    • 确保主从节点网络带宽充足(避免跨机房高延迟)。

4.3、总结

  • 主从复制搭建核心:主节点开启密码和远程连接,从节点通过 replicaofmasterauth 关联主节点;
  • 核心能力:主节点写、从节点读,实现读写分离(减轻主节点压力)和数据备份(避免单点数据丢失);
  • 局限性:无自动故障切换,主节点故障后需手动干预,生产环境建议搭配哨兵模式或集群模式使用。
相关推荐
伯明翰java4 小时前
Redis学习笔记-List列表(2)
redis·笔记·学习
a123560mh4 小时前
国产信创操作系统银河麒麟常见软件适配(MongoDB、 Redis、Nginx、Tomcat)
linux·redis·nginx·mongodb·tomcat·kylin
赖small强4 小时前
【Linux驱动开发】Linux MMC子系统技术分析报告 - 第二部分:协议实现与性能优化
linux·驱动开发·mmc
SongYuLong的博客4 小时前
Ubuntu24.04搭建GitLab服务器
运维·服务器·gitlab
guygg885 小时前
Linux服务器上安装配置GitLab
linux·运维·gitlab
RokFile5 小时前
SysInfoKeeper是一款面向 Linux/Unix 的硬件变动检测 CLI 工具
运维
地球没有花5 小时前
gitlab cicd 模块解释
运维·ci/cd·gitlab
Elias不吃糖5 小时前
总结我的小项目里现在用到的Redis
c++·redis·学习
百***35515 小时前
Linux(CentOS)安装 Nginx
linux·nginx·centos
一个处女座的程序猿O(∩_∩)O5 小时前
Spring Boot、Redis、RabbitMQ 在项目中的核心作用详解
spring boot·redis·java-rabbitmq