天天看點

源碼閱讀技巧篇:RocketMQ DLedger 多副本即主從切換專欄回顧

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 協定,應該要實作哪些關鍵點,當時我的思考如下:
源碼閱讀技巧篇:RocketMQ DLedger 多副本即主從切換專欄回顧

這樣在看源碼時更加有針對性,不至于在閱讀源碼過程中“迷失”。

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技術内幕》第二版的原始素材。

原文釋出時間為:2019-10-20

本文作者:丁威,《RocketMQ技術内幕》作者。

本文來自

中間件興趣圈

,了解相關資訊可以關注