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(多副本) 之日志追加流程
由于微信公众号单篇文章的字数限制,故本文由如下两篇文章组成:
源码分析 RocketMQ DLedger(多副本) 之日志复制-上篇
源码分析 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 官方提供的单元测试用例。