网站首页 > 教程文章 正文
Redis 的主从同步(Master-Slave Replication)是实现数据备份、读写分离和高可用性的重要机制。以下是主从同步的核心流程、原理及相关细节:
一、主从同步的核心流程
Redis 的主从同步分为 全量同步 和 增量同步 两个阶段,首次同步通常执行全量同步,后续通过增量同步维持数据一致性。
1. 全量同步(首次同步)
当从节点首次连接主节点或数据严重不一致时,会触发全量同步,流程如下:
- 从节点向主节点发送 SYNC 命令
从节点通过配置 slaveof <master_ip> <master_port> 连接主节点,并发送 SYNC 命令(Redis 2.8 后改为 PSYNC 命令,支持全量和增量同步)。 - 主节点执行 BGSAVE 生成 RDB 快照主节点收到命令后,首先在后台执行 BGSAVE 生成当前数据库的 RDB 快照文件。期间主节点会将新收到的写命令(如 SET、DEL 等)缓存到 缓冲区(backlog) 中,确保数据不丢失。
- 主节点传输 RDB 快照到从节点RDB 生成完成后,主节点将快照文件通过网络传输给从节点。从节点接收到 RDB 后,会先清空本地数据库(除非配置 slave-read-only no),然后加载 RDB 数据到内存。
- 主节点将缓冲区的写命令同步到从节点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:防止主节点数据丢失后无法恢复。
四、常见问题与解决方案
- 全量同步耗时过长原因:RDB 文件过大或网络带宽不足。解决:启用无盘复制、优化网络带宽、分批次添加从节点。
- 增量同步失败(触发全量同步)原因:积压缓冲区太小,无法容纳断开期间的写操作。解决:增大 repl-backlog-size,或减少从节点断开时间。
- 从节点内存不足原因:全量同步时加载 RDB 导致内存峰值。解决:限制从节点数量、使用 AOF 持久化(需结合 no-appendfsync-on-rewrite 配置)。
总结
Redis 主从同步通过全量 + 增量的机制实现数据一致性,结合复制偏移量和积压缓冲区确保高效同步。合理配置缓冲区大小、启用无盘复制,并结合监控和高可用方案(如 Sentinel),可显著提升 Redis 集群的可靠性和性能。
- 上一篇: 峰哥分享:个人总结快速掌握Redis使用
- 下一篇: 十年之重修Redis原理
猜你喜欢
- 2025-05-15 Redis大Key分析利器:支持TOP N、批量分析与从节点优先
- 2025-05-15 别再说Redis是单线程了!面试官挖坑高频题,答对这3点直接满分
- 2025-05-15 Java面试官最爱问的那些Redis面试题盘点
- 2025-05-15 Redis主从同步与故障切换的常见问题及解决方案
- 2025-05-15 你必须懂的Redis十大应用场景
- 2025-05-15 Redis主从,集群,哨兵你了解多少?
- 2025-05-15 Redis持久化技术深度解析及适用场景分析
- 2025-05-15 思考:为什么数据库会丢失数据?
- 2025-05-15 Redis单机安装以及集群搭建
- 2025-05-15 十年之重修Redis原理
- 05-15Redis大Key分析利器:支持TOP N、批量分析与从节点优先
- 05-15别再说Redis是单线程了!面试官挖坑高频题,答对这3点直接满分
- 05-15Java面试官最爱问的那些Redis面试题盘点
- 05-15Redis主从同步与故障切换的常见问题及解决方案
- 05-15你必须懂的Redis十大应用场景
- 05-15Redis主从,集群,哨兵你了解多少?
- 05-15Redis持久化技术深度解析及适用场景分析
- 05-15思考:为什么数据库会丢失数据?
- 最近发表
- 标签列表
-
- location.href (44)
- document.ready (36)
- git checkout -b (34)
- 跃点数 (35)
- 阿里云镜像地址 (33)
- qt qmessagebox (36)
- md5 sha1 (32)
- mybatis plus page (35)
- semaphore 使用详解 (32)
- update from 语句 (32)
- vue @scroll (38)
- 堆栈区别 (33)
- 什么是容器 (33)
- sha1 md5 (33)
- navicat导出数据 (34)
- 阿里云acp考试 (33)
- 阿里云 nacos (34)
- redhat官网下载镜像 (36)
- srs服务器 (33)
- pico开发者 (33)
- https的端口号 (34)
- vscode更改主题 (35)
- 阿里云资源池 (34)
- os.path.join (33)
- redis aof rdb 区别 (33)