Dledger是如何實現主從自動切換的

王子發表於2020-09-28

 

前言

hello小夥伴們,今天王子又來繼續和大家聊RocketMQ了,之前的文章我們一直說Broker的主從切換是可以基於Dledger實現自動切換的,那麼小夥伴們是不是很好奇它究竟是如何實現的呢?今天我們就來聊一聊這個話題。

首先我們回顧一下上一篇文章深入研究Broker是如何持久化的中,producer傳送訊息給Broker後,首先將訊息寫入到CommitLog日誌檔案中,然後會把具體的MessageQueue中訊息的位置資訊儲存到ConsumeQueue中。

之後Broker為了實現高可用,是有一個Broker組的,包含Master和Slave,Master接收到資料同步給Slave,一旦出現故障,可以實現主從自動切換。

 

使用Dledger技術替換CommitLog

現在我們就開始聊聊Dledger是如何實現主從自動切換的。

首先我們要知道Dledger是個什麼東西,實際上Dledger自己就有一套CommitLog機制,如果使用了它,它接到資料第一步就是寫入自己的CommitLog。

所以,引入Dledger技術,其實就是使用Dledger的CommitLog來替換掉Broker自己的CommitLog。

然後Broker仍然可以基於Dledger的CommitLog,把訊息的位置資訊儲存到ConsumeQueue中。

 

Dledger是怎麼選舉Leader的

瞭解了Dledger是幹什麼的,那接下來我們就來探索一下,它是如何選舉Leader的。

實際上它是通過Raft協議來進行選舉的,那Raft又是個什麼東東,別急我們慢慢聊。

假設我們的一組Broker中有三臺機器,它們之間首先要選擇一個Leader,這需要發起一輪一輪的投票,三臺機器互相投票最終確定出Leader。

在剛剛啟動的時候,這三臺機器都會投給自己一票,說:"我要當Leader,別跟老子搶",然後把這條訊息通知給其他機器。

為了方便說明,我們把三臺機器分別命名為A,B,C.

那麼經過第一輪投票後,A,B,C分別給自己投了一票,併傳送給了別人。

這個時候A接到訊息一看,好傢伙,每個人都投的自己,都很自私,那算了,這次投票直接無效。

接著,每個人開始一段隨機時間的休眠,比如A休眠了3秒,B休眠了4秒,C休眠了5秒。

那麼3秒過去了,A醒了,抓緊給自己投了一票,又發給別人了。

又過了1秒,B醒了,它也想給自己投票,但是它發現已經有人發給了它訊息,現在A已經有一票了,這個時候B會尊重別人的選擇,也把票投給A,然後傳送給別人。

又過了1秒,C醒了,同樣也想給自己投票,但是發現別人已經投了兩票給A了,那這時候它也會直接尊重別人的選擇,投票給A,然後傳送給別人。

這個時候所有人都收到了投票,全是投票給A的,那麼A就光榮上崗了。

選舉的時候就是誰的票數多,誰就去當老大。

這就是Raft協議中選舉Leader的簡單解釋,總結起來就是,假如一輪投票不能得到結果,那就每個人隨機休眠一下,先醒過來的投給自己,後醒過來的尊重大多數人的意見

依靠這種方式的投票,幾輪下來就能選出一個Leader了。

當然,職位越高,責任越大,選舉出Leader後,所有的接收訊息操作全都由Leader來負責了,Follower只能同步Leader的資料。

 

Dledger的資料同步機制

現在我們瞭解了Dledger的投票選舉機制,那麼Broker接收到訊息後,是如何基於Dledger實現資料同步的呢?

同樣,Dledger也是通過Raft協議進行多副本同步的,簡單來講,資料同步分為兩個階段,uncommitted階段和committed階段

首先,當Leader接到訊息資料後,會先標記訊息為uncommitted狀態,然後通過Dledger的元件把uncommitted狀態的訊息傳送給Follower上的DledgerServer。

接著Follower接到訊息後,會傳送一個ack給Leader上的DledgerServer,然後如果Leader發現超過半數的Follower已經給自己返回了ack,那麼就認為同步成功了,這時候把狀態改為committed。

然後再發訊息給Follower,將Follower上的狀態也改為committed。

這就是基於Dledger的資料同步機制。

 

總結

到這裡,關於Dledger如何實現主從自動切換的問題我們已經聊完了。

可能有的小夥伴會問,如果Leader當機了,它是怎麼實現自動切換的,好像還是沒有說啊。

其實我們只要明白了Dledger是如何通過Raft協議進行選舉的就很容易能夠猜測出這個問題的答案。

Leader當機後,自然是剩餘的Follower重新發起新的一輪的選舉了,然後還是按照老規矩,最後一定會選出一個Leader。

新的訊息就由新選舉出來的Leader來接收就可以了。

同時,由於資料同步是分為兩階段同步的,超過半數的機器返回ack才會認為是同步成功。

所以就算是在同步過程中Leader當機了,其實Follower中已經同步了訊息,只不過狀態是uncommitted而已,新的Leader可以根據這些uncommitted的訊息進行資料的恢復操作,更改訊息狀態為commited。

好了,這下子相信小夥伴們就能更好的理解Dledger了吧,那今天的文章就到這裡了,下次見。

 

往期文章推薦:

什麼是訊息中介軟體?主要作用是什麼?

常見的訊息中介軟體有哪些?你們是怎麼進行技術選型的?

你懂RocketMQ 的架構原理嗎?

聊一聊RocketMQ的註冊中心NameServer

Broker的主從架構是怎麼實現的?

RocketMQ生產部署架構如何設計

RabbitMQ和Kafka的高可用叢集原理

RocketMQ的傳送模式和消費模式

討論一下秒殺系統的技術難點與解決方案

秒殺系統中的扣減庫存和流量削峰

深入研究RocketMQ生產者傳送訊息的底層原理

深入研究Broker是如何持久化的

 

相關文章