文档章节

源码阅读技巧篇:RocketMQ DLedger 多副本即主从切换专栏回顾

中间件兴趣圈
 中间件兴趣圈
发布于 11/05 20:52
字数 1759
阅读 134
收藏 1

RocketMQ DLedger 多副本即主从切换专栏总共包含9篇文章,时间跨度大概为2个月的时间,笔者觉得授人以鱼不如授人以渔,借以这个系列来展示该系列的创作始末,展示笔者阅读源码的技巧。

首先在下决心研读 RocketMQ DLedger 多副本(主从切换)的源码之前,首先还是要通过官方的分享、百度等途径对该功能进行一些基本的了解。

我们了解到 RocketMQ 在 4.5.0 之前提供了主从同步功能,即当主节点宕机后,消费端可以继续从从节点上消费消息,但无法继续向该复制组发送消息。RocketMQ 4.5.0版本引入了多副本机制,即 DLedger,支持主从切换,即当一个复制组内的主节点宕机后,会在该复制组内触发重新选主,选主完成后即可继续提供消息写功能。同时还了解到 rocketmq 主从切换是基于 raft 协议的。

raft 协议是何许人也,我猜想大部分读者对这个名词并不陌生,但像笔者一样只是听过其大体作用但并未详细学习的应该也不在少数,故我觉得看 RocketMQ DLedger 多副本即主从切换之前应该重点了解 raft 协议。

1、RocketMQ 多副本前置篇:初探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 多副本即主从切换实现原理

从设计上理解了平滑升级的技巧,本篇就从源码角度剖析主从切换的实现要点,即重点关注元数据的同步(特别是消息消费进度的同步)。

9、RocketMQ DLedger 多副本即主从切换实战

经过前面8篇文章的铺垫,我相信大家对 DLedger 的实现原理有了一个全新的认识,本篇作为该系列的收官之作,介绍如何从主从同步集群平滑升级到DLedger,即主从切换版本,并对功能进行验证。

整体总结一下就是首先从整体上认识其核心要点,然后逐步展开,逐步分解形成一篇一篇的文章,在遇到看不懂的时候,可以 debug 官方提供的单元测试用例。

如果本文对大家有所帮助的话,麻烦帮忙点个赞,谢谢。

>温馨提示:本专栏是《RocketMQ技术内幕》作者倾力打造的又一个精彩系列,也是《RocketMQ技术内幕》第二版的原始素材。


>作者简介:《RocketMQ技术内幕》作者,RocketMQ 社区布道师,维护公众号:中间件兴趣圈,重点关注JAVA集合、JAVA并发包、Netty、Dubbo、RocketMQ、Mybatis、Elasticsearch、Netty。可扫描如下二维码与作者进行互动。

© 著作权归作者所有

中间件兴趣圈

中间件兴趣圈

粉丝 26
博文 23
码字总数 62086
作品 0
青浦
私信 提问
源码阅读技巧篇:RocketMQ DLedger 多副本即主从切换专栏回顾

RocketMQ DLedger 多副本即主从切换专栏总共包含9篇文章,时间跨度大概为2个月的时间,笔者觉得授人以鱼不如授人以渔,借以这个系列来展示该系列的创作始末,展示笔者阅读源码的技巧。 首先在...

丁威
10/21
0
0
RocketMQ 平滑升级到主从切换实战

本文主要介绍如何将 RocketMQ 集群从原先的主从同步升级到主从切换。 首先介绍与 DLedger 多副本即 RocketMQ 主从切换相关的核心配置属性,然后尝试搭建一个主从同步集群,再从原先的 Rocket...

丁威
10/13
0
0
RocketMQ 整合 DLedger(多副本)即主从切换实现平滑升级的设计技巧

源码分析 RocketMQ DLedger 多副本系列已经进行到第 8 篇了,前面的章节主要是介绍了基于 raft 协议的选主与日志复制,从本篇开始将开始关注如何将 DLedger 应用到 RocketMQ中。 摘要:详细分...

丁威
10/10
0
0
源码分析 RocketMQ DLedger 多副本即主从切换实现原理

DLedger 基于 raft 协议,故天然支持主从切换,即主节点(Leader)发生故障,会重新触发选主,在集群内再选举出新的主节点。 RocketMQ 中主从同步,从节点不仅会从主节点同步数据,也会同步元数...

丁威
10/11
0
0
基于 raft 协议的 RocketMQ DLedger 多副本日志复制设计原理

上一篇 源码分析 RocketMQ DLedger(多副本) 之日志复制(传播) ,可能有不少读者朋友们觉得源码阅读较为枯燥,看的有点云里雾里,本篇将首先梳理一下 RocketMQ DLedger 多副本关于日志复制的三...

丁威
10/09
0
0

没有更多内容

加载失败,请刷新页面

加载更多

方法重载和重写是什么?有什么区别?

重写:在子类中将父类的成员方法的名称保留,重新编写成员方法的实现内容,更改方法的访问权限,修改返回类型的为父类返回类型的子类。 一些规则: 重写发生在子类继承父类 参数列表必须完全...

ConstXiong
14分钟前
2
0
Spring-Framework 目录

ls spring-orm/src/main/java/org/springframework/orm/hibernate5/ ObjectRetrievalFailureException.java jpa/ ......

MtrS
33分钟前
3
0
大学慕课

Visual C,Turbo C,Dev C的关系 不管是 Visual C、Turbo C 还是 Dev C,本质都是C语言,不存在高下之分。 三种叫法不同是因为 C 语言在三种不同的开发环境中拥有一些不同的开发习惯的区别。...

电子197徐泽彬
51分钟前
3
0
GC偏方 强行fullgc

转自 https://www.jianshu.com/p/be5389ca93f7 FullGC这么恐怖,有办法缓解么,或者说尽量避免它在白天,甚至业务高峰期出现?有!笔者给你分享一个歪门邪道,不记得是多少年前,在哪里道听途...

os_m
55分钟前
4
0
源码分析Mybatis MappedStatement的创建流程

上文源码分析Mybatis MapperProxy创建流程重点阐述 MapperProxy 的创建流程,但并没有介绍 *.Mapper.java(UserMapper.java) 是如何与 *Mapper.xml 文件中的 SQL 语句是如何建立关联的。本文将...

中间件兴趣圈
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部