前言
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了吧,那今天的文章就到這裡了,下次見。
往期文章推薦: