Redis 主从同步的原理——Java全栈知识(21)

Redis 主从同步的原理

上一篇文章我们讲到了 Redis 的三种集群架构:Redis集群模式
接下来我们详细讲以下主从复制的时候,数据同步的原理

主从同步原理

1、全量同步

当主从第一次连接的时候,会进行全量同步,将主节点(master)中的数据以 RDB 持久化的方式进行 copy,然后通过网络 IO 复制到从节点(slave)上。
image.png

如何判断是否是第一次的连接?

这里我们要引入 Redis 的两个参数

  • Replication Id:简称 replid,是数据集的标记,id 一致则说明是同一数据集。每一个 master 都有唯一的 replid,slave 则会继承 master 节点的 replid
  • offset:偏移量,随着记录在 repl_baklog 中的数据增多而逐渐增大。slave 完成同步时也会记录当前同步的 offset。如果 slave 的 offset 小于 master 的 offset,说明 slave 数据落后于 master,需要更新。

因为我们在主从连接之前,从节点是以单点的方式运行,也就是说从节点本身就是一个 master,所以原本的从节点也有自己的 replid,所以说当我们第一次连接的时候判断该 replid 是否与需要连接的主节点相同,如果不同就是第一次连接那么就直接全量同步即可。
并且在全量同步之后,从节点的 replid 将改变为当前 master 节点的 replid,offset 也将与 master 对齐。

完整流程描述:

[!info]

  • slave 节点请求增量同步
  • master 节点判断 replid,发现不一致,拒绝增量同步
  • master 将完整内存数据生成 RDB,发送 RDB 到 slave
  • slave 清空本地数据,加载 master 的 RDB
  • master 将 RDB 期间的命令记录在 repl_baklog,并持续将 log 中的命令发送给 slave
  • slave 执行接收到的命令,保持与 master 之间的同步

注意:主从连接过后从节点的数据将被删除,如果主从连接之后的从节点断开连接,已经同步的数据不会被删除

2、增量同步

全量同步需要先做 RDB,然后将 RDB 文件通过网络传输个 slave,成本太高了。因此除了第一次做全量同步,其它大多数时候 slave 与 master 都是做增量同步
增量同步就是判断 replid 相同的情况下,将 offset 偏移部分的数据同步到从节点中。
image.png

如何进行增量同步 ?

repl_baklog 文件就是增量同步的关键。
rep_baklog 文件是一个环形的数组结构,文件中存储了 master 节点和 salve 节点的 offset 位置作为 index。
image.png

当 Redis 由于从节点宕机,或者网络阻塞等原因需要进行增量同步的时候,读取 repl_baklog 文件中两个 index 中间差的部分同步到从节点即可。
值得注意的是:
因为 repl_baklog 是以一个环形数组来记录数据的,所以如果差异不大,将 offset 差异的部分同步即可,如果差异过大,导致环形数组被填满了,那就只能进行全量同步。

3、主从优化

可以从以下几个方面来优化 Redis 主从就集群:

  • 在 master 中配置 repl-diskless-sync yes 启用无磁盘复制,避免全量同步时的磁盘 IO。
  • Redis 单节点上的内存占用不要太大,减少 RDB 导致的过多磁盘 IO
  • 适当提高 repl_baklog 的大小,发现 slave 宕机时尽快实现故障恢复,尽可能避免全量同步
  • 限制一个 master 上的 slave 节点数量,如果实在是太多 slave,则可以采用主-从-从链式结构,减少 master 压力

[!info]+ 解释
1、无磁盘复制,(正常复制需要写 RDB 文件,也就是需要写到磁盘上。直接写道网络 IO 流直接发送至 slave)(网络带宽充足的情况下)
2、单节点内存上限,(减少 RDB 导致过多的磁盘 IO)
3、尽快恢复从节点(避免全量同步)
4、创建主从从链式结果,将某些从节点的主节点设置为其他从节点,减小 master 压力

4、总结

简述全量同步和增量同步区别?

  • 全量同步:master 将完整内存数据生成 RDB,发送 RDB 到 slave。后续命令则记录在 repl_baklog,逐个发送给 slave。
  • 增量同步:slave 提交自己的 offset 到 master,master 获取 repl_baklog 中从 offset 之后的命令给 slave
    什么时候执行全量同步?
  • slave 节点第一次连接 master 节点时
  • slave 节点断开时间太久,repl_baklog 中的 offset 已经被覆盖时
    什么时候执行增量同步?
  • slave 节点断开又恢复,并且在 repl_baklog 中能找到 offset 时
  • 9
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

东莞呵呵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值