客戶端的每乙個請求都包含被複製狀態機執行的指令。leader把這個指令作為一條新的日誌條目新增到日誌中,然後並行發起 rpc 給其他的伺服器,讓它們複製這條資訊。假如這條日誌被安全的複製,leader就應用這條日誌到自己的狀態機中,並返回給客戶端。如果follower宕機或者執行緩慢或者丟包,leader會不斷的重試,直到所有的follower最終都複製了所有的日誌條目。
日誌由有序編號(log index)的日誌條目組成。每個日誌條目包含它被建立時的任期號(term)和用於狀態機執行的命令。如果乙個日誌條目被複製到大多數伺服器上,就被認為可以提交(commit)了。
上圖顯示,共有 8 條日誌,提交了 7 條。提交的日誌都將通過狀態機持久化到磁碟中,防止宕機。
當leader接收到由客戶端傳送的請求(請求中包含可以被複製狀態機執行的命令)時,leader將會把該請求作為新的內容新增到日誌中(任期號為當前leader所處的任期號,索引號為當前leader本地儲存的日誌集合中的日誌的最高索引號加1)。
備註:leader在當前任期內最多只能建立乙個給定索引號的日誌(即不可能在乙個任期內建立兩個以上的具有相同索引的日誌條目)
在網路中follower接收到該日誌訊息後則會返回複製成功的回覆。
在leader接收到網路中大部分的follower的成功複製的回覆之後,leader便認為該日誌可以被提交。此時leader將會同時做三件事:
(1)將該日誌應用到leader本地的複製狀態機
(2)向所有follower傳送訊息通知所有接收到該日誌的follower將該日誌進行提交,然後應用到各自本地的複製狀態機
(3)將執行結果通知客戶端
當該日誌訊息成功在網路中大部分follower本地的複製狀態機執行過後,則可認為該日誌已被提交。在當前日誌被提交的過程中,如果leader先前的某些日誌還沒有被提交,則將會一同提交。
一致性檢查是乙個歸納的過程。正常情況下,網路中第一條日誌一定滿足日誌的一致性檢查,然後第二條日誌中包含第一條日誌的任期號與索引號,所以只要leader與follower的第一條日誌保持一致,那麼第二條日誌也會滿足一致性檢查,從而之後的每一條日誌都會滿足一致性檢查。
從而得出了日誌匹配屬性:
(1)如果兩個不同的日誌實體具有相同的索引和任期號,那麼它們儲存有相同的命令。
(2)如果兩個不同的日誌實體具有相同的索引和任期號,則所有先前條目中的日誌都相同。(由一致性檢查結果得出)
Raft演算法系列教程1 Leader選舉
raft演算法中伺服器主要分為三種角色 leader follower candidate,並且三種角色相互獨立,也就是伺服器在同一時間內只可能扮演其中一種角色。leader 用於對所有使用者的請求進行處理以及日誌的複製等等。follower 不會主動傳送訊息,只響應來自leader與candida...
演算法系列教程01 開篇
為什麼要學習演算法呢?我個人覺得最終目的還是為了提高自己的職場競爭力。演算法的本質就是解決問題,所以學習演算法本質上是在提高解決問題的能力,這是職場最重要的能力之一。另外,如果你想在面試中表現得更加出色,也要對演算法有一定程度的掌握。寫教程是很耗費精力的,而且學習演算法是很枯燥的,但如果大家都能參與...
演算法系列3《SHA》
sha是一種資料加密演算法,該演算法經過加密專家多年來的發展和改進已日益完善,現在已成為公認的最安全的雜湊演算法之一,並被廣泛使用。該演算法的思想是接收一段明文,然後以一種不可逆的方式將它轉換成一段 通常更小 密文,也可以簡單的理解為取一串輸入碼 稱為預對映或資訊 並把它們轉化為長度較短 位數固定的...