💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。
- 持续学习,不断总结,共同进步,活到老学到老
- 人生的本质是追寻自我的提升,包括思想、能力、意志等等。
- 直面变化,找到背后更基础的东西,更基础的东西是用户的需求。
- 我们的成功是我们的现在和将来决定的。今天和明天已经由昨天决定,你还可以决定后天。
非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。💝💝💝 ✨✨ 欢迎订阅本专栏 ✨✨
博客目录
6.部分重同步实现
部分重同步功能由以下三个部分构成:
主服务器
的复制偏移量
和从服务器的复制偏移量(
replication offset)- 主服务器的
复制积压缓冲区(replication backlog)
服务器的运行 ID(run ID)
复制偏移量
主服务器和从服务器会分别维护一个复制偏移量:
- 主服务器每次向从服务器传播
N 个字节
的数据时,就将自己的复制偏移量
的值加上N
- 从服务器每次收到主服务器传播的
N 个字节
数据时,就将自己的复制偏移量加上N
通过对比偏移量
可以知道主从服务器是否处于一致状态。
复制积压缓冲区
复制积压缓冲区
是由主服务器
维护的一个固定长度(fixed-size)
先进先出(FIFO)队列,默认为 1 MB,模型是滑动窗口
。
当主服务器
进行命令传播
时,不仅会将写命令发给所有从服务器,还会将写命令入队到复制积压缓冲区
里面,且队列中每个字节记录相应的复制偏移量
当从服务器重新连上主服务器后,从服务器
会通过 PSYNC
命令将自己发复制偏移量 offset
发送给主服务器,主服务器根据此来决定对服务器执行何种同步操作:
- 如果
offset
之后的数据仍在复制积压缓冲区
中,则进行部分重同步
操作 - 相反,如果已经不存在
复制缓冲区
中则进行完整重同步
操作
根据需要调整复制缓冲区大小
默认为 1 MB,最小跟由公式 second * write_size_per_second 估算
second:服务器断线后重新连上主服务器的平均时间,单位秒
write*size_per_second:服务器平均每秒产生的写命令数据量(协议格式的写命令的长度总和)
安全起见,实际大小可以设置为:2 * second _ write_size_per_second,可以保证绝大部分断线情况都能用部分重同步处理
服务器运行 ID
- 每个服务器都有自己的运行 ID
- 运行 ID 在服务器启动时自动生成,由 40 个随机的十六进制字符组成
当从服务器
进行初次复制时,主服务器
会将自己的运行 ID 传送给从服务器
,而从服务器会将其保存,当从服务器断线并重新连上一个主服务器时,从服务器将当前连接的主服务器
发送之前保存的运行 ID:
- 如果 ID 与当前连接的主服务器 ID 相同,则说明断线之前就是与这个主服务器连接,则继续尝试
部分重同步
操作 - 如果 ID 不同,断线之前不是这个主服务器,执行
完整重同步
操作
觉得有用的话点个赞
👍🏻
呗。
❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍
🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙