Redis的主从复制
1.主从复制
Redis配置成主从模式,主库(Master)只负责写数据,从库(Slave)只负责读数据。
注意:一个主库可以拥有多个从库,但一个从库只能隶属于一个主库。
将选为Slave的机器上配置:
# REPLICATION
slave of <master ip> <port>
masterauth <password>开启主从关系后,数据会自动进行复制。
2.全量复制和部分复制
Redis的复制方式包括全量复制和部分复制。
2.1 全量复制
流程如下:
- Slave发出一个同步命令,要求Master同步数据;
- Master向Salve发送runid和offset;当Slave上没有offset记录时,执行全量复制;
- Slave执行save masterinfo,保存Master的基本信息;
- Master执行bgsave生成快照;
- Master执行send RDB将快照发送到Slave的缓冲区;
- Slave更新旧的RDB文件,并加载新的RDB;
由上述流程可以看到,全量复制的开销主要在:
- 生成RDB文件,即bgsave;
- RDB服务器间传输;
- 如果有AOF设置,达到重写阈值,会进行AOF重写;
2.2 部分复制
部分复制在Redis 2.8之后开始支持,可以减少全量复制的开销。
部分复制的原理:
- 每台机器启动后都会有一个与当前进程相关的 runid;
- 每个机器在写入数据后会有一个偏移量 master_repl_offset;
- 通过偏移量来判断Slave与Master直接的数据差多少;
部分复制常用在主从连接断开、Master抖动时。
流程如下:
- 主从连接断开;
- Slave尝试连接主机;Master写入复制缓冲区 repl_back_buffer;
- 恢复连接后,Slave将自己当前runid和偏移量传输给Master,并请求同步数据;
- Master检查偏移量是否在缓冲区范围内,如果是,则进行部分复制;如果不是,则进行全量复制;
优点:部分复制直接使用缓冲区的数据进行RDB同步,相比全量复制,减少了RDB的生成和传输开销;同时,也减少了AOF重写阈值达到的几率。
3.主从复制中的问题
3.1 读写分离的问题
复制数据延迟:Slave 延迟导致读写不一致。
- 监控偏移量 offset,如果超出范围就将读节点切换到 Master 上,并重新全量复制Slave节点。
读到过期数据:Redis 采用懒惰性策略和采样式策略。
- 懒惰性策略指 Redis 只有当操作 key时才去看数据是否过期;采样式策略指定期会去采样,如果是过期的,就自动删除。当过期数量非常多的时候,采样速度比不上逻辑数据变化的速度,Slave 没有写权限,只有 Master 可以删除,就会出现过期数据。
- Redis 3.2 以上版本修复此问题。
Slave 节点故障
- Slave 节点通过持久化数据与主节点进行部分复制同步;Redis2.8 实现 Slave 恢复后部分复制同步;
Master 节点故障
- 需要手动切换主从关系;
- 使用 Redis哨兵模式自动完成主从切换;
3.2 复制风暴
Master 重启,多个 Slave 会需要复制。这个时候需要更换复制拓扑,通过在 Slave 下再分从机,减少主机 Master 的压力。
本文内容仅供个人学习/研究/参考使用,不构成任何决策建议或专业指导。分享/转载时请标明原文来源,同时请勿将内容用于商业售卖、虚假宣传等非学习用途哦~感谢您的理解与支持!