Redis的主从复制是一种异步复制机制,用于实现数据冗余、读写分离和高可用性。其核心原理可分为以下几个关键步骤和机制。
1. 建立主从关系
-
配置方式:通过
SLAVEOF <master_ip> <master_port>命令或在从节点配置文件中设置,使从节点连接到主节点。 -
身份验证(可选):若主节点配置了
requirepass,从节点需提供密码(masterauth配置项)。
2. 数据同步过程
全量同步(Full Resynchronization)
-
触发条件:从节点首次连接主节点,或复制偏移量(Replication Offset)不在主节点的复制积压缓冲区中。
-
步骤:
-
从节点发送
PSYNC命令(旧版本为SYNC)请求同步。 -
主节点执行
BGSAVE生成RDB快照,并缓存此期间的写命令至复制缓冲区。 -
主节点将RDB文件传输给从节点,从节点清空旧数据后加载RDB。
-
主节点发送缓冲区中的写命令,使从节点数据与主节点完全一致。
-
部分同步(Partial Resynchronization)
-
触发条件:从节点断开后重连,且其复制偏移量仍存在于主节点的复制积压缓冲区(Replication Backlog)。
-
机制:
-
主节点仅发送从节点缺失的增量命令,避免全量同步开销。
-
依赖复制ID(Replication ID)和复制偏移量判断同步起点。
-
3. 命令传播(Propagation)
-
同步完成后,主节点持续将写命令异步发送给从节点,从节点执行相同命令以保持数据一致。
-
异步复制特性:主节点不等待从节点确认,可能存在短暂数据延迟(最终一致性)。
4.核心组件
-
复制积压缓冲区:
-
主节点维护的环形内存缓冲区,默认大小1MB(可配置)。
-
存储最近的写命令及对应的复制偏移量。
-
缓冲区大小需根据网络中断时长调整,避免频繁全量同步。
-
-
复制偏移量:
-
主节点和从节点各自维护,记录已复制的数据量。
-
主节点每次传播命令后递增偏移量;从节点接收后更新自身偏移量。
-
-
复制ID:
-
主节点唯一标识符。故障切换后,新主节点生成新复制ID,旧复制ID用于兼容部分同步。
5 断线重连处理
-
从节点断线后,通过
PSYNC命令携带旧复制ID和最后复制偏移量重新连接。 -
主节点根据偏移量判断执行全量或部分同步。
6 优化与注意事项
-
无盘复制(Diskless Replication):主节点直接将RDB数据通过Socket发送给从节点,避免磁盘IO(配置
repl-diskless-sync yes)。 -
读写分离:从节点默认
read-only,可通过replica-read-only no配置为可写(不推荐,易导致数据不一致)。 -
链式复制:从节点可作为其他从节点的主节点,形成树状结构,减轻主节点压力。
-
复制超时:通过
repl-timeout控制超时时间(默认60秒),超时后触发重同步。
7. 局限性
-
数据延迟:异步复制导致从节点数据可能滞后。
-
脑裂问题:主节点宕机后,若未及时切换,可能引发数据不一致(需配合Sentinel或Cluster解决)。
总结流程
-
从节点发起连接,发送
PSYNC命令。 -
主节点根据复制ID和偏移量决定全量或部分同步。
-
全量同步:生成RDB文件并传输,随后发送缓冲命令。
-
部分同步:直接发送积压缓冲区中的增量命令。
-
进入命令传播阶段,主节点持续推送写命令。
6327

被折叠的 条评论
为什么被折叠?



