Redis 同步机制详解

Redis 采用主从复制(Replication)机制来进行数据同步,同时在 Redis Cluster(集群模式)下也使用 Gossip 协议进行节点间数据同步和状态传播。主要的同步方式包括全量同步和增量同步。

1. Redis 主从同步机制(Replication)

Redis 通过主从复制(Master-Slave Replication)保证数据一致性,支持多个从节点(Slave)复制一个主节点(Master)的数据。

1.1 同步方式

Redis 的主从同步主要分为全量同步(Full Synchronization)和增量同步(Partial Synchronization):

同步方式 触发时机 执行过程 性能影响
全量同步(Full Sync) Slave 第一次连接 Master 或数据丢失时 Master 生成 RDB 并发送给 Slave,Slave 加载 RDB 并应用数据 开销大,影响 Master 性能
增量同步(Partial Sync) Slave 断线后短时间内重连 Master Master 仅发送最近的写操作(基于 Replication Backlog) 开销小,适用于短时间断连

2. Redis 全量同步过程

全量同步通常发生在:

  • Slave 第一次连接 Master
  • Slave 复制偏移量(offset)落后太多,无法进行增量同步
  • 手动执行 SLAVEOF 命令

执行过程如下:

  1. Slave 发送 PSYNC 请求:当从节点(Slave)启动时,会向主节点(Master)发送 PSYNC ? -1(初次连接)。
  2. Master 触发 RDB 快照:Master 执行 bgsave 生成 RDB 快照文件,并存储当前缓存的写命令(repl backlog)。
  3. Master 发送 RDB 快照给 Slave
    • RDB 通过 socket 传输到 Slave
    • Slave 加载 RDB 快照到内存
  4. Master 发送 backlog 中的增量命令:发送在 bgsave 过程中积累的写命令,以保证 Slave 数据完整。
  5. Slave 继续复制 Master 的写入操作:之后 Master 产生的数据变更都会实时同步到 Slave。

Redis 同步机制详解_第1张图片

3. Redis 增量同步过程

增量同步一般用于短暂断连后重连,Redis 通过复制积压缓冲区(Replication Backlog)记录增量数据。

执行过程如下:

  1. Slave 重新连接 Master:Slave 发送 PSYNC 请求,告知 Master 其最新的 offset。
  2. Master 检查 Replication Backlog
    • 如果 offset 在 backlog 内 → 直接发送 backlog 里的数据(增量同步)。
    • 如果 offset 不在 backlog 内 → 触发全量同步(Full Sync)。
  3. Slave 应用增量数据:Slave 接收 backlog 数据,并执行 Redis 命令。

优化

  • Replication Backlog 默认 1MB,可调整 repl_backlog_size。
  • 合理配置 backlog 大小,可避免频繁触发全量同步,提高同步效率。

4. Redis Cluster 同步(集群模式)

在 Redis Cluster(分片集群)中,主从复制仍然适用,同时增加了 Gossip 协议进行状态同步。

4.1 Gossip 协议

Redis Cluster 使用 Gossip 协议进行节点状态传播:

  • 每 1 秒,每个节点会随机与其他节点交换数据(心跳包 PING / PONG)。
  • 故障检测:若 50% 以上主节点发现某个 Master 挂掉,则触发故障转移(Failover),将其某个 Slave 提升为 Master。
  • 数据同步:仍然使用主从复制进行数据同步,但不同 slot 由不同主节点管理。

5. Redis 持久化(RDB & AOF)对同步的影响

Redis 通过 RDB(快照)和 AOF(日志)进行持久化,但对主从同步有不同影响:

  • 全量同步时,Master 生成 RDB 并传输给 Slave。
  • AOF 只影响 Master 持久化,不影响主从复制,但 Slave 也可以开启 AOF 以减少数据丢失。

6. 断线恢复机制

如果 Master/Slave 断线后重新连接,Redis 会自动尝试恢复:

  • 短时间断开(offset 在 backlog 内) → 增量同步
  • 长时间断开(offset 超出 backlog) → 全量同步

优化策略

  1. 增大 repl_backlog_size,避免频繁全量同步。
  2. 配置 repl-diskless-sync,减少 RDB 传输对 Master 的影响:
repl-diskless-sync yes

7. Redis 相关配置参数

参数 作用 默认值
repl-backlog-size 复制积压缓冲区大小 1MB
repl-timeout 复制超时时间(秒) 60
repl-diskless-sync 是否使用无磁盘同步 no
repl-diskless-sync-delay 无磁盘同步的延迟时间 5

机制 作用 适用场景
全量同步(Full Sync) 传输整个 RDB 快照 Slave 初次连接、长时间断线
增量同步(Partial Sync) 仅同步丢失的命令 短时间断连恢复
Replication Backlog 缓存主节点最近的操作 提高增量同步成功率
Gossip 协议 Redis Cluster 状态传播 Redis 分片集群
  • 主从复制是 Redis 同步的核心机制,分为全量同步(RDB 传输)和增量同步(backlog)。
  • Replication Backlog 记录增量数据,避免 Slave 频繁进行全量同步。
  • Gossip 协议主要用于 Redis Cluster 的故障检测和状态同步。
  • 合理调整 repl_backlog_size 和 repl-diskless-sync 以优化同步性能。

你可能感兴趣的:(Redis,redis,数据库,缓存)