Redis 复制

105 阅读5分钟

Redis通过主从异步复制实现数据冗余与读写分离,支持级联及PSYNC增量同步,优化配置保障高可用性。


一、Redis 复制的基本概念

复制(Replication) 是 Redis 实现高可用和负载均衡的核心机制,通过将主节点(Master)的数据同步到从节点(Replica),实现数据冗余和读写分离。

核心特性

  • 异步复制:主节点异步推送数据变更到从节点。
  • 级联复制:从节点可再作为其他节点的主节点(Redis 4.0+)。
  • 只读模式:从节点默认禁止写入(通过 replica-read-only yes 配置)。

二、复制的使用方式

1. 建立复制

  • 命令方式

    # 在从节点执行(Redis 5.0 前使用 SLAVEOF)
    REPLICAOF <master-ip> <master-port>
    
  • 配置文件方式

    # 从节点的 redis.conf
    replicaof 192.168.1.100 6379
    

2. 断开复制

  • 临时断开

    REPLICAOF NO ONE  # 从节点断开复制,并升级为主节点
    
  • 永久断开:删除配置文件中的 replicaof 项并重启。

3. 安全性

  • 主节点认证

    # 主节点配置密码
    requirepass master_password
    ​
    # 从节点配置密码认证
    masterauth master_password
    

4. 只读模式

  • 从节点默认禁止写操作(replica-read-only yes),可通过以下方式修改:

    CONFIG SET replica-read-only no  # 允许写入(不推荐,可能引发数据不一致)
    

三、复制的拓扑结构

拓扑类型结构说明适用场景
单层结构一主多从,所有从节点直接连接主节点简单读写分离、数据备份
树状结构主 → 从1 → 从2(级联复制)减少主节点压力,跨机房同步
双主结构两个节点互为主从(需特殊配置)双活数据中心(需谨慎处理数据冲突)
环形复制多个节点形成环形复制链(Redis 不推荐)实验性场景(易导致数据不一致)

四、复制的核心原理

1. 复制建立流程

  1. 连接建立

    • 从节点向主节点发送 REPLCONF listening-port <port> 告知监听端口。
    • 主节点验证权限(若配置了 requirepass)。
  2. 数据同步

    • 主节点执行 BGSAVE 生成 RDB 快照,发送给从节点(全量复制)。
    • 从节点清空旧数据,加载 RDB 文件。
  3. 增量同步

    • 主节点将后续写命令存入 复制缓冲区(Repl Backlog Buffer)
    • 从节点持续接收并执行缓冲区中的命令(部分复制)。

2. 全量复制

  • 触发条件

    • 从节点首次连接主节点。
    • 主从复制积压缓冲区(Repl Backlog Buffer)不足(从节点偏移量超出缓冲区范围)。
  • 流程

    1. 主节点 fork 子进程生成 RDB 文件。
    2. RDB 文件通过网络传输到从节点。
    3. 从节点加载 RDB 后,主节点发送缓冲区中的增量命令。

3. 部分复制(PSYNC)

  • 触发条件:从节点断线重连,且主节点的复制积压缓冲区包含断线期间的写命令。

  • 核心机制

    • 主节点维护 复制积压缓冲区(固定大小,环形结构)。
    • 从节点通过 PSYNC <runid> <offset> 告知主节点上次同步的偏移量。
    • 主节点根据偏移量返回增量数据。

4. 心跳检测

  • 主 → 从:每 10 秒发送 PING 检测从节点存活状态。
  • 从 → 主:每秒发送 REPLCONF ACK <offset>,汇报当前复制偏移量(用于检测延迟和超时)。

五、复制中的常见问题与解决方案

1. 读写分离问题

  • 问题:从节点数据延迟导致读取旧数据。

  • 解决

    • 监控 master_repl_offsetslave_repl_offset 的差值。
    • 业务层根据一致性要求选择读取主节点(强一致性)或从节点(最终一致性)。

2. 数据不一致

  • 原因

    • 主从网络延迟或故障。
    • 从节点未开启只读模式,误写入数据。
  • 解决

    • 确保从节点配置 replica-read-only yes
    • 使用 WAIT 命令阻塞客户端直到数据同步到 N 个从节点(强一致性,但性能下降)。

3. 全量复制风险

  • 风险点

    • 主节点生成 RDB 时内存翻倍(fork 操作)。
    • 大 Key 导致 RDB 传输时间过长。
  • 规避方法

    • 增大 repl-backlog-size(默认 1MB,建议提升至 100MB 以上)。
    • 避免使用超大 Key,或拆分 Key。

4. 主节点重启导致复制中断

  • 问题:主节点重启后,runid 变化,触发从节点全量复制。
  • 解决:通过 持久化 runid(需第三方工具)或使用故障转移机制(如 Redis Sentinel)。

六、配置优化与监控

1. 关键配置

# 主节点配置
repl-backlog-size 100mb     # 增大复制积压缓冲区
repl-backlog-ttl 3600       # 缓冲区保留时间(秒)
client-output-buffer-limit replica 256mb 64mb 60  # 从节点输出缓冲区限制

# 从节点配置
repl-ping-replica-period 10  # 从节点 ping 主节点频率(秒)
repl-timeout 60             # 复制超时时间(秒)

2. 监控命令

# 查看主节点复制状态
INFO replication
​
# 查看从节点延迟
redis-cli -h <slave-ip> info replication | grep lag

七、生产环境最佳实践

  1. 拓扑选择

    • 单数据中心:一主多从 + Sentinel 哨兵。
    • 多数据中心:树状级联复制(主 → 跨机房从 → 下级从)。
  2. 规避全量复制

    • 定期检查主从 offset 差值。
    • 监控 master_link_down_since_seconds 判断主从连接状态。
  3. 容灾演练

    • 模拟主节点故障,验证从节点升级流程。

通过合理配置复制拓扑、优化复制缓冲区大小,并监控主从同步状态,可显著提升 Redis 集群的可用性和数据可靠性。