Redis高可用之主从复制原理演进分析( 三 )


Redis高可用之主从复制原理演进分析

文章插图
四、Redis4.0的同源增量同步先看两个问题
1.从节点重启后丢失了原主节点的节点编号和复制偏移量 , 这导致重启后需要全量复制,这个很好办,把这些信息保存下来
2.主从切换后,主节点信息变化了,导致从节点需要全量数据同步,这个也好办,只要能确认新主节点数据是从原主节点复制过来就可以了
Redis4.0 后,对 PSYNC 进行了改进,提出了同源增量复制解决方案,来解决上面提到的两个全量复制问题 。
第1个:从节点重启后 , 需要跟主节点全量数据同步,为什么?本质原因 , 是从节点丢失了主节点的编号信息和偏移量信息 。Redis4.0后 , 就把主节点的编号信息写入到 RDB 中持久化保存 。
第2个:主从切换后,从节点需要和主节点全量同步,为什么?原因就是新的主节点不认识原来主节点的编号信息 。切换后怎么才能识别到呢?Redis4.0 后,主从切换后,新的主节点会将先前的主节点信息记录下来,这样新主节点就知道自己原先数据是从哪个旧主节点同步来的,大家都是从同一个地方出来的,应该接受部分数据同步策略 。
五、Redis6.0无盘同步复制什么叫无盘?
原先的同步复制是通过 fork 一个子进程生成 RDB 快照文件,RDB 存储在磁盘上,然后传输 RDB 文件,从节点服务器在恢复 RDB 文件数据 。
无盘,就是说不生成 RDB 文件,不通过 RDB 来传输数据 。而是直接通过网络来传输数据 。
怎么做到无盘呢?
Redis6.0 后 , 它也是先 fork 一个子进程,这个子进程 dump 数据,它通过管道回写给主节点,主节点在将数据发送给从节点,这样的过程就是无盘传输 。
六、Redis7.0共享复制缓冲区6.1 多从库时主库占用内存过多问题
Redis高可用之主从复制原理演进分析

文章插图
(from: https://mp.weixin.qq.com/s/UlHksrqFq0yfKh1uMFvYNg 作者:shooterIT)
如图所示,对于 Redis 主库,当用户的写请求到达时,主库会将变更命令分别写入所有从库的缓冲区(OutputBuffer),以及复制积压缓冲区(ReplicationBacklog) 。全量同步也会执行该逻辑 。所以在全量同步阶段经常会触发 client-output-buffer-limit,主库断开与从库的连接 , 导致主从同步失败,甚至出现循环持续失败的情况 。
所有从库的连接在主库上是独立的,也就是说每个从库 OutputBuffer 占用的内存空间也是独立的,那么主从复制消耗的内存就是所有从库缓冲区内存大小之和 。如果我们设定从库的 client-output-buffer-limit 为 1GB,如果有三个从库,则在主库上可能会消耗 3GB 的内存用于主从复制 。另外,真实环境中从库的数量不是确定的,这也导致 Redis 实例的内存消耗不可控 。
from: https://mp.weixin.qq.com/s/UlHksrqFq0yfKh1uMFvYNg 作者:shooterIT
6.2 OutputBuffer 拷贝和释放的堵塞问题
  • ReplicationBacklog 的限制
  • OutputBuffer 拷贝和释放的堵塞问题
具体内容请看这里:https://mp.weixin.qq.com/s/UlHksrqFq0yfKh1uMFvYNg
6.3 解决方案:共享复制缓冲区
Redis高可用之主从复制原理演进分析

文章插图
具体方案请看这里:https://mp.weixin.qq.com/s/UlHksrqFq0yfKh1uMFvYNg 作者:shooterIT
七、参考
  • https://redis.io/docs/manual/replication/ redis 复制功能
  • https://mp.weixin.qq.com/s/a4JTKKTCEyz1W0FIF5fVZA Redis 主从复制的演进历程与百度实践 - 百度
  • https://mp.weixin.qq.com/s/UlHksrqFq0yfKh1uMFvYNg Redis 7.0 共享复制缓冲区的设计与实现-ShooterIT
  • 《Redis设计与实现》

推荐阅读