【Redis】主从复制:配置、管理与优化

发布于:2025-06-23 ⋅ 阅读:(14) ⋅ 点赞:(0)

主从复制

分布式系统中为了解决单点问题,通常会把数据复制多个副本部署到其他服务器,满足故障恢复和负载均衡等需求。

Redis 也提供了复制的功能,实现了相同数据的多个 Redis 副本。复制功能是高可用 Redis 的基础,哨兵和集群都是在复制的基础上构建的。


1. 建立复制

Redis 复制机制允许将数据从一个 Redis 实例(主节点/master)同步到一个或多个 Redis 实例(从节点/slave)。复制具有以下特点:

  • 复制关系是单向的:数据只能从主节点流向从节点
  • 每个从节点只能有一个主节点
  • 一个主节点可以拥有多个从节点

在这里插入图片描述

有三种方式可以建立 Redis 复制关系:

  1. 配置文件方式:在配置文件中添加 slaveof {masterHost} {masterPort} 指令,随 Redis 启动生效
  2. 启动命令方式:在 redis-server 启动时加入 --slaveof {masterHost} {masterPort} 参数
  3. 运行时命令方式:在 Redis 运行后使用 slaveof {masterHost} {masterPort} 命令

2. 配置从节点实例

以下是在 Linux 系统上配置 Redis 从节点的步骤:

  1. 复制主配置文件:

    cp /etc/redis/redis.conf /etc/redis/redis-slave.conf
    
  2. 修改从节点配置文件:

    # 启用守护进程模式
    sed -i "s/daemonize no/daemonize yes/" /etc/redis/redis-slave.conf
    
  3. 启动从节点实例:

    # Ubuntu 系统
    redis-server /etc/redis/redis-slave.conf --port 6380 --slaveof 127.0.0.1 6379
    
    # CentOS 系统
    redis-server /etc/redis-slave.conf --port 6380 --slaveof 127.0.0.1 6379
    

注意:主节点配置通常保持不变,主要修改从节点的配置。


3. 验证复制状态

  1. 检查 Redis 实例是否正常运行:

    netstat -nlpt
    

    预期输出应显示两个 Redis 实例:

    Proto Recv-Q Send-Q Local Address    Foreign Address   State       PID/Program name
    tcp   0      0      127.0.0.1:6379   0.0.0.0:*         LISTEN      49264/redis-server
    tcp   0      0      127.0.0.1:6380   0.0.0.0:*         LISTEN      272418/redis-server
    
  2. 测试数据同步:

    • 连接到主节点(6379端口):

      redis-cli
      

      执行命令:

      127.0.0.1:6379> set hello world
      OK
      127.0.0.1:6379> get hello
      "world"
      
    • 连接到从节点(6380端口):

      redis-cli -p 6380
      

      验证数据同步:

      127.0.0.1:6380> get hello
      "world"
      

4. 复制流程说明

当复制关系建立后,主节点的所有写操作都会自动同步到从节点。从节点会持续接收并应用主节点发送的数据更新,保持与主节点的数据一致性。

在这里插入图片描述

使用 info replication 命令可以查看 Redis 实例的复制状态信息,这对于监控和维护复制关系非常重要。

主节点 (6379) 复制状态示例:

127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=127.0.0.1,port=6380,state=online,offset=100,lag=0
master_replid:2fbd35a8b8401b22eb92ff49ad5e42250b3e7a06
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:100
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:100

关键字段说明

  • role:master:标识当前节点为主节点
  • connected_slaves:显示已连接的从节点数量
  • slave0:详细显示第一个从节点的连接信息
  • master_repl_offset:主节点的复制偏移量

从节点 (6380) 复制状态示例:

127.0.0.1:6380> info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6379
master_link_status:up
master_last_io_seconds_ago:1
master_sync_in_progress:0
slave_repl_offset:170
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:2fbd35a8b8401b22eb92ff49ad5e42250b3e7a06
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:170
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:170

关键字段说明

  • role:slave:标识当前节点为从节点
  • master_link_status:显示与主节点的连接状态
  • slave_read_only:从节点默认处于只读模式
  • slave_repl_offset:从节点已复制的数据偏移量

5. 断开复制关系

在从节点上执行 slaveof no one 命令可以断开与主节点的复制关系:

127.0.0.1:6380> slaveof no one
OK

断开复制的流程

  1. 终止与主节点的复制连接
  2. 从节点晋升为独立的主节点
  3. 保留断开时的所有数据,但不再接收原主节点的更新

注意:断开复制后,从节点将成为独立节点,原有数据不会被清除,但不再与原主节点保持同步。


6. 切换主节点

从节点可以通过 slaveof 命令切换到新的主节点:

127.0.0.1:6380> slaveof 127.0.0.1 6479
OK

切换主节点的流程

  1. 断开与当前主节点的复制关系
  2. 建立与新主节点的连接
  3. 清空当前所有数据(危险操作)
  4. 开始从新主节点进行完整同步

重要注意事项

  • 切换主节点会导致从节点现有数据被完全清除
  • 在生产环境中执行此操作前应充分评估影响
  • 建议在低峰期执行主节点切换操作
  • 切换后应密切监控复制状态和数据一致性

7. 安全配置

主从认证机制:

对于存储重要数据的 Redis 节点,必须配置访问密码以确保数据安全:

  1. 主节点配置
    redis.conf 中设置:

    requirepass strong_password
    
  2. 从节点配置
    在从节点的 redis.conf 中添加:

    masterauth strong_password
    

操作说明

  • 所有客户端访问主节点必须使用 AUTH 命令认证
  • 从节点通过特殊客户端连接主节点,必须配置匹配的 masterauth 才能建立复制
  • 建议使用强密码(长度≥16位,包含大小写字母、数字和特殊字符)

安全建议:定期更换密码,并在配置文件中设置严格的文件权限(如 600)


8. 只读模式配置

从节点写保护:

Redis 从节点默认配置为只读模式:

slave-read-only yes

关键注意事项

  1. 任何对从节点的写操作都会导致主从数据不一致
  2. 生产环境严禁修改此配置,避免以下风险:
    • 数据不一致导致业务逻辑错误
    • 从节点数据在故障转移时丢失
    • 复制中断风险

特殊场景处理
若必须临时启用从节点写入,应:

  1. 断开复制关系 (slaveof no one)
  2. 明确告知所有客户端此节点状态变化
  3. 记录操作日志备查

9. 网络传输优化

  1. 延迟与带宽权衡:

通过 repl-disable-tcp-nodelay 参数控制网络传输行为:

repl-disable-tcp-nodelay no  # 默认值
  1. 配置策略对比:
配置值 网络行为 延迟影响 带宽消耗 适用场景
no (默认) 立即发送小数据包 延迟低 带宽高 同机房/优质网络
yes 合并数据包(约40ms间隔) 延迟增加 带宽优化 跨机房/复杂网络

部署建议

  1. 同机房部署:保持默认 no 配置
    repl-disable-tcp-nodelay no
    
  2. 跨地域部署:建议启用优化
    repl-disable-tcp-nodelay yes
    
  3. 监控指标:
    • 通过 info replication 观察 lag
    • 网络延迟应稳定在可接受范围内(通常<100ms)

网站公告

今日签到

点亮在社区的每一天
去签到