云计算、AI、云原生、大数据等一站式技术学习平台

网站首页 > 教程文章 正文

redis的主从之间是如何进行同步的

jxf315 2025-05-15 18:41:46 教程文章 3 ℃

Redis 的主从同步(Master-Slave Replication)是实现数据备份、读写分离和高可用性的重要机制。以下是主从同步的核心流程、原理及相关细节:

一、主从同步的核心流程

Redis 的主从同步分为 全量同步增量同步 两个阶段,首次同步通常执行全量同步,后续通过增量同步维持数据一致性。

1. 全量同步(首次同步)

当从节点首次连接主节点或数据严重不一致时,会触发全量同步,流程如下:

  1. 从节点向主节点发送 SYNC 命令
    从节点通过配置 slaveof <master_ip> <master_port> 连接主节点,并发送 SYNC 命令(Redis 2.8 后改为 PSYNC 命令,支持全量和增量同步)。
  2. 主节点执行 BGSAVE 生成 RDB 快照主节点收到命令后,首先在后台执行 BGSAVE 生成当前数据库的 RDB 快照文件。期间主节点会将新收到的写命令(如 SET、DEL 等)缓存到 缓冲区(backlog) 中,确保数据不丢失。
  3. 主节点传输 RDB 快照到从节点RDB 生成完成后,主节点将快照文件通过网络传输给从节点。从节点接收到 RDB 后,会先清空本地数据库(除非配置 slave-read-only no),然后加载 RDB 数据到内存。
  4. 主节点将缓冲区的写命令同步到从节点RDB 加载完成后,主节点会将同步期间缓存的写命令(增量数据)依次发送给从节点,从节点执行这些命令以保证数据一致。

2. 增量同步(持续同步)

全量同步完成后,主从节点进入增量同步阶段,确保后续数据变化实时同步:

  • 主节点记录写操作:主节点将每一个写命令(如 SET、HSET 等)写入 复制积压缓冲区(replication backlog),这是一个固定大小的环形缓冲区(默认大小为 1MB,可通过 repl-backlog-size 配置)。
  • 从节点定期发送心跳:从节点通过向主节点发送 PSYNC 命令报告自己当前的复制偏移量(offset)。
  • 主节点对比偏移量:若从节点的 offset 在积压缓冲区范围内,主节点会将 offset 之后的写命令发送给从节点(增量同步)。若 offset 超出缓冲区范围(如主节点重启导致缓冲区清空,或从节点断开时间过长),则重新触发全量同步。

二、关键概念与机制

1. 复制偏移量(Replication Offset)

  • 主节点:每执行一个写命令,就将当前偏移量递增(例如,写入 512 字节数据,偏移量增加 512)。
  • 从节点:每次接收主节点的写命令后,更新自己的偏移量。
  • 作用:主从节点通过对比偏移量判断数据是否一致,是增量同步的核心依据。

2. 复制积压缓冲区(Replication Backlog)

  • 结构:一个固定大小的环形缓冲区,用于记录主节点最近的写操作。
  • 配置:通过 repl-backlog-size 设置缓冲区大小,建议根据写操作频率调整(例如,高并发场景可设为 1GB)。
  • 作用:当从节点断开后重新连接时,若断开期间的写操作未超出缓冲区范围,可直接通过增量同步恢复,避免全量同步的开销。

3. 无盘复制(Diskless Replication)

  • 背景:传统全量同步需要生成 RDB 文件到磁盘,可能存在磁盘 I/O 瓶颈。
  • 原理:Redis 4.0 引入无盘复制,主节点直接通过网络流式传输 RDB 数据,无需写入磁盘。
  • 配置:通过 repl-diskless-sync 设置为 yes 启用,适用于磁盘性能较差的场景。

4. 主从角色切换

  • 主节点故障后,从节点可通过手动(SLAVEOF NO ONE)或自动(如 Sentinel 集群)升级为新主节点。
  • 切换后,原从节点会断开与旧主节点的连接,并开始接受新的写请求,其他从节点可重新指向新主节点。

三、配置与最佳实践

1. 基础配置

  • 主节点配置:无需特殊配置,默认支持主从模式。
  • 从节点配置(在 redis.conf 中):
  • ini
  • slaveof <master_ip> <master_port> # 指向主节点 slave-read-only yes # 从节点默认只读(推荐) repl-backlog-size 1gb # 设置积压缓冲区大小 repl-timeout 180 # 同步超时时间(秒)

2. 高可用性建议

  • 多从节点:主节点配置多个从节点,提高数据冗余和读性能。
  • 避免单主节点压力过大:读请求路由到从节点,写请求集中在主节点。
  • 监控偏移量:通过 INFO replication 命令检查主从节点的偏移量是否一致,判断同步状态。
  • 定期备份主节点 RDB:防止主节点数据丢失后无法恢复。

四、常见问题与解决方案

  1. 全量同步耗时过长原因:RDB 文件过大或网络带宽不足。解决:启用无盘复制、优化网络带宽、分批次添加从节点。
  2. 增量同步失败(触发全量同步)原因:积压缓冲区太小,无法容纳断开期间的写操作。解决:增大 repl-backlog-size,或减少从节点断开时间。
  3. 从节点内存不足原因:全量同步时加载 RDB 导致内存峰值。解决:限制从节点数量、使用 AOF 持久化(需结合 no-appendfsync-on-rewrite 配置)。

总结

Redis 主从同步通过全量 + 增量的机制实现数据一致性,结合复制偏移量和积压缓冲区确保高效同步。合理配置缓冲区大小、启用无盘复制,并结合监控和高可用方案(如 Sentinel),可显著提升 Redis 集群的可靠性和性能。

最近发表
标签列表