源码阅读技巧篇:RocketMQ DLedger 多副本即主从切换专栏回顾
RocketMQ DLedger 多副本即主从切换专栏总共包含9篇文章,时间跨度大概为2个月的时间,笔者觉得授人以鱼不如授人以渔,借以这个系列来展示该系列的创作始末,展示笔者阅读源码的技巧。
首先在下决心研读 RocketMQ DLedger 多副本(主从切换)的源码之前,首先还是要通过官方的分享、百度等途径对该功能进行一些基本的了解。
我们了解到 RocketMQ 在 4.5.0 之前提供了主从同步功能,即当主节点宕机后,消费端可以继续从从节点上消费消息,但无法继续向该复制组发送消息。RocketMQ 4.5.0版本引入了多副本机制,即 DLedger,支持主从切换,即当一个复制组内的主节点宕机后,会在该复制组内触发重新选主,选主完成后即可继续提供消息写功能。同时还了解到 rocketmq 主从切换是基于 raft 协议的。
raft 协议是何许人也,我猜想大部分读者对这个名词并不陌生,但像笔者一样只是听过其大体作用但并未详细学习的应该也不在少数,故我觉得看 RocketMQ DLedger 多副本即主从切换之前应该重点了解 raft 协议。
本文主要根据 raft 官方提供的动画来学习了解 raft 协议,从本文基本得知了 raft 协议主要包含两个重要部分:选主 以及 日志复制。在了解了 raft 协议的选主、日志复制的基本实现后,然后就可以步入到 RocketMQ DLedger 多副本即主从切换的源码研究了,以探究大神是如何实现 raft 协议的。同时在了解到了 raft 协议的选主部分内容后,自己也可以简单的思考,如果自己去实现 raft 协议,应该要实现哪些关键点,当时我的思考如下:
这样在看源码时更加有针对性,不至于在阅读源码过程中“迷失”。
2、源码分析 RocketMQ DLedger 多副本之 Leader 选主
本文按照上一篇的思路,重点对 DLedgerLeaderElector 的实现进行了详细分析,特别是其内部的状态机流转,最后也给出一张流程图对选主过程进行一个简单的梳理与总结。
> 温馨提示:如果在阅读源码的过程中一时无法理解,可以允许其提供的单元测试,DEBUG一下,可以起到拨云见雾之效。
3、源码分析 RocketMQ DLedger 多副本存储实现
在学习完 DLedger 选主实现后,接下来将重点突破 raft 协议的另外一个部分:日志复制。因为日志复制将涉及到存储,故在学习日志复制之前,先来看一下 DLedger 与存储相关的设计,例如 DLedger 日志条目的存储协议、日志在服务器的组织等关系,这部分类比 RocketMQ commitlog 等的存储。
4、源码分析 RocketMQ DLedger(多副本) 之日志追加流程
在学习完DLedger 多副本即主从切换 日志存储后,我们将正式进入到日志复制部分,从上图我们可以简单了解,日志复制其实包含两个比较大的阶段,第一阶段是指主节点(Leader)接受客户端请求后,将数据先存储到主服务器中,然后再将数据转发到它的所有从节点。故本篇文章中的关注第一阶段:日志追加。
5、源码分析 RocketMQ DLedger(多副本) 之日志复制(传播) 本文继续关注日志复制的第二个阶段,包含主节点日志转发、从节点接收日志、主节点对日志转发进行仲裁,即需要实现只有超过集群半数节点都存储成功才认为该消息已成功提交,才会对客户端承偌消息发送成功。
6、基于 raft 协议的 RocketMQ DLedger 多副本日志复制设计原理
源码解读 raft 协议的日志复制部分毕竟比较枯燥,故本文梳理了3张流程图,并对日志的实现要点做一个总结,以此来介绍 rocketmq Dledger 多副本即主从切换部分的 raft 协议的解读。
7、RocketMQ 整合 DLedger(多副本)即主从切换实现平滑升级的设计技巧
前面6篇文章都聚焦在 raft 协议的选主与日志复制。从本节开始将介绍 rocketmq 主从切换的实现细节,基于 raft 协议已经可以实现主节点的选主与日志复制,主从切换的另外一个核心就是主从切换后元数据的同步,例如topic、消费组订阅信息、消息消费进度等。另外主从切换是rocketmq 4.5.0 版本才引入的,如果从老版本升级到 4.5.0,直接兼容原先的消息是重中之中,故本文将详细剖析其设计要点。
8、源码分析 RocketMQ DLedger 多副本即主从切换实现原理
从设计上理解了平滑升级的技巧,本篇就从源码角度剖析主从切换的实现要点,即重点关注元数据的同步(特别是消息消费进度的同步)。
经过前面8篇文章的铺垫,我相信大家对 DLedger 的实现原理有了一个全新的认识,本篇作为该系列的收官之作,介绍如何从主从同步集群平滑升级到DLedger,即主从切换版本,并对功能进行验证。
整体总结一下就是首先从整体上认识其核心要点,然后逐步展开,逐步分解形成一篇一篇的文章,在遇到看不懂的时候,可以 debug 官方提供的单元测试用例。
如果本文对大家有所帮助的话,麻烦帮忙点个赞,谢谢。
>温馨提示:本专栏是《RocketMQ技术内幕》作者倾力打造的又一个精彩系列,也是《RocketMQ技术内幕》第二版的原始素材。
>作者简介:《RocketMQ技术内幕》作者,RocketMQ 社区布道师,维护公众号:中间件兴趣圈,重点关注JAVA集合、JAVA并发包、Netty、Dubbo、RocketMQ、Mybatis、Elasticsearch、Netty。可扫描如下二维码与作者进行互动。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
微软官宣 Chromium Edge for Linux 即将发布
9月份,我们曾报道“微软意图将新版 Edge 浏览器引入 Linux”,Edge团队制作了一份调查问卷,该问卷内容主要关于被调查者对 Linux 发行版的偏好、在 Linux 上使用 Web 浏览器的场景和需求等等。当时猜测微软有想将 Edge 浏览器引入 Linux 的意图,但鉴于对新浏览器的公开测试还处于起步阶段,存在许多不确定因素,微软官方也没有确切的声明。 不过,在近日的 Ignite 2019大会上,微软正式宣布 Edgefor Linux不久后将会发布。Windows 中央高级编辑 Zac Bowden 在推特上发布了演示文稿的照片。根据微软的说法,新的 Edge 是完全跨平台的,该浏览器将是支持 Windows 平台,包括服务器和客户端,以及 MacOS、Android、IOS 和 Linux。 至于具体的发布时间线,目前并未透露。Edge团队很少公开浏览器的具体发布细节,但在近日的 Ignite 2019大会上,他们明确了 Chromium Edge通用版的发布日期,Chromium Edge稳定版将于明年 1月 15日正式发布,且在Windows 和 MacOS可用。...
- 下一篇
在移动硬盘中安装win10和macos双系统
本文通过在SSD移动硬盘中安装win10和macos双系统,实现操作系统随身携带 小慢哥的原创文章,欢迎转载 目录 ▪ 目标 ▪ 准备工作 ▪ Step1. 清空分区,转换为GPT ▪ Step2. 安装win10 ▪ Step3. 压缩win10分区容量 ▪ Step4. 创建2个分区 ▪ Step5. 将bootcamp驱动放置到exFAT分区中 ▪ Step6. 将macos分区格式化 ▪ Step7. 安装macOS ▪ Step8. 验证双系统 ▪ 附. win10初始化及bootcamp驱动安装 目标 在SSD移动硬盘中安装win10和macos双系统,在安装完成后,通过移动硬盘引导启动,达到如下效果 ▷ 在非macbook电脑上,可以进入移动硬盘上的win10系统 ▷ 在macbook电脑上,可以选择进入移动硬盘上的win10系统或macos系统 准备工作 以下准备工作很重要,务必提前做好 ▷ 移动硬盘:笔者采用的是品牌为Samsung T5,容量为1TB的SSD固态硬盘 ▷ 一台装有windows系统的电脑,笔者采用的是宏基笔记本电脑,型号为V3-571G,系统为win...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- CentOS6,CentOS7官方镜像安装Oracle11G
- 设置Eclipse缩进为4个空格,增强代码规范
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- CentOS7,CentOS8安装Elasticsearch6.8.6
- Linux系统CentOS6、CentOS7手动修改IP地址
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作