RocketMQ DLedger 多副本即主从切换专栏总共包含9篇文章,时间跨度大概为2个月的时间,笔者以为授人以鱼不如授人以渔,借以这个系列来展现该系列的创做始末,展现笔者阅读源码的技巧。服务器
首先在下决心研读 RocketMQ DLedger 多副本(主从切换)的源码以前,首先仍是要经过官方的分享、百度等途径对该功能进行一些基本的了解。源码分析
咱们了解到 RocketMQ 在 4.5.0 以前提供了主从同步功能,即当主节点宕机后,消费端能够继续从从节点上消费消息,但没法继续向该复制组发送消息。RocketMQ 4.5.0版本引入了多副本机制,即 DLedger,支持主从切换,即当一个复制组内的主节点宕机后,会在该复制组内触发从新选主,选主完成后便可继续提供消息写功能。同时还了解到 rocketmq 主从切换是基于 raft 协议的。post
raft 协议是何许人也,我猜测大部分读者对这个名词并不陌生,但像笔者同样只是听过其大致做用但并未详细学习的应该也不在少数,故我以为看 RocketMQ DLedger 多副本即主从切换以前应该重点了解 raft 协议。单元测试
本文主要根据 raft 官方提供的动画来学习了解 raft 协议,从本文基本得知了 raft 协议主要包含两个重要部分:选主 以及 日志复制。在了解了 raft 协议的选主、日志复制的基本实现后,而后就能够步入到 RocketMQ DLedger 多副本即主从切换的源码研究了,以探究大神是如何实现 raft 协议的。同时在了解到了 raft 协议的选主部份内容后,本身也能够简单的思考,若是本身去实现 raft 协议,应该要实现哪些关键点,当时个人思考以下: 测试
二、源码分析 RocketMQ DLedger 多副本之 Leader 选主动画
本文按照上一篇的思路,重点对 DLedgerLeaderElector 的实现进行了详细分析,特别是其内部的状态机流转,最后也给出一张流程图对选主过程进行一个简单的梳理与总结。.net
舒适提示:若是在阅读源码的过程当中一时没法理解,能够容许其提供的单元测试,DEBUG一下,能够起到拨云见雾之效。debug
三、源码分析 RocketMQ DLedger 多副本存储实现设计
在学习完 DLedger 选主实现后,接下来将重点突破 raft 协议的另一个部分:日志复制。由于日志复制将涉及到存储,故在学习日志复制以前,先来看一下 DLedger 与存储相关的设计,例如 DLedger 日志条目的存储协议、日志在服务器的组织等关系,这部分类比 RocketMQ commitlog 等的存储。
四、源码分析 RocketMQ DLedger(多副本) 之日志追加流程
在学习完DLedger 多副本即主从切换 日志存储后,咱们将正式进入到日志复制部分,从上图咱们能够简单了解,日志复制其实包含两个比较大的阶段,第一阶段是指主节点(Leader)接受客户端请求后,将数据先存储到主服务器中,而后再将数据转发到它的全部从节点。故本篇文章中的关注第一阶段:日志追加。
五、源码分析 RocketMQ DLedger(多副本) 之日志复制(传播) 本文继续关注日志复制的第二个阶段,包含主节点日志转发、从节点接收日志、主节点对日志转发进行仲裁,即须要实现只有超过集群半数节点都存储成功才认为该消息已成功提交,才会对客户端承偌消息发送成功。
六、基于 raft 协议的 RocketMQ DLedger 多副本日志复制设计原理
源码解读 raft 协议的日志复制部分毕竟比较枯燥,故本文梳理了3张流程图,并对日志的实现要点作一个总结,以此来介绍 rocketmq Dledger 多副本即主从切换部分的 raft 协议的解读。
七、RocketMQ 整合 DLedger(多副本)即主从切换实现平滑升级的设计技巧
前面6篇文章都聚焦在 raft 协议的选主与日志复制。从本节开始将介绍 rocketmq 主从切换的实现细节,基于 raft 协议已经能够实现主节点的选主与日志复制,主从切换的另一个核心就是主从切换后元数据的同步,例如topic、消费组订阅信息、消息消费进度等。另外主从切换是rocketmq 4.5.0 版本才引入的,若是从老版本升级到 4.5.0,直接兼容原先的消息是重中之中,故本文将详细剖析其设计要点。
八、源码分析 RocketMQ DLedger 多副本即主从切换实现原理
从设计上理解了平滑升级的技巧,本篇就从源码角度剖析主从切换的实现要点,即重点关注元数据的同步(特别是消息消费进度的同步)。
通过前面8篇文章的铺垫,我相信你们对 DLedger 的实现原理有了一个全新的认识,本篇做为该系列的收官之做,介绍如何从主从同步集群平滑升级到DLedger,即主从切换版本,并对功能进行验证。
总体总结一下就是首先从总体上认识其核心要点,而后逐步展开,逐步分解造成一篇一篇的文章,在遇到看不懂的时候,能够 debug 官方提供的单元测试用例。
若是本文对你们有所帮助的话,麻烦帮忙点个赞,谢谢。
舒适提示:本专栏是《RocketMQ技术内幕》做者倾力打造的又一个精彩系列,也是《RocketMQ技术内幕》第二版的原始素材。
做者简介:《RocketMQ技术内幕》做者,RocketMQ 社区布道师,维护公众号:中间件兴趣圈,可扫描以下二维码与做者进行互动。