Nacos 集群的工作原理
Nacos 集群中 Leader 節點是如何產生的?
Nacos 集群采用 Raft 算法實現。它是一種比較簡單的選舉算法,用於選舉出 Nacos 集群中最重要的 Leader(領導)節點。
在 Nacos 集群中,每個節點都擁有以下三種角色中的一種。
-
Leader:領導者,集群中最重要的角色,用於向其他節點下達指令。
-
Candidate:參選者,參與競選 Leader 的節點。
-
Follower:跟隨者,用於接收來自 Leader 或者 Candidate 的請求並進行處理。
在集群中選舉出 Leader 是最重要的工作,產生選舉的時機有三個:
-
在 Nacos 節點啟動后,還沒有產生Leader時選舉;
-
集群成員總量變更時重新選舉;
-
當 Leader 停止服務后重新選舉;
在開始介紹選舉過程前,先理解任期(Term)的含義:
Raft 算法將時間划分成為任意不同長度的任期(Term)。任期用連續的數字進行表示。每一個任期的開始都是一次選舉(Election),一個或多個候選人會試圖成為 Leader。
為了便於理解,我們使用文字+表格的形式說明選舉過程。
-
當最開始的時候,所有 Nacos 節點都沒有啟動。角色默認為 Follower(跟隨者),任期都是 0。
-
當第一個節點(192.168.163.131)啟動后,節點角色會變為 Candidate(參選者),131 節點在每一個任期開始時便會嘗試向其他節點發出投票請求,征求自己能否成為 Leader(領導者)節點。只有算上自己獲得超過半數的選票,這個 Candidate 才能轉正為 Leader。在當前案例,因為 131 發起選舉投票,但 132/133 兩個節點不在線,盡管 131 會投自己一票,但在總 3 票中未過半數,因此無法成為 Leader。因為第一次選舉沒有產生 Leader,過段時間在下一個任期開始時,131 任期自增加 1,同時會再次向其他節點發起投票請求爭取其他節點同意,直到同意票過半。
-
在 Raft 算法中,成為 Leader 的必要條件是某個 Candidate 獲得過半選票,如果 132 節點上線,遇到 131 再次發起投票。132 投票給 131 節點,131 獲得兩票超過半數就會成為 Leader,132 節點自動成為 Follower(跟隨者)。之后 133 節點上線,因為集群中已有 Leader,因此自動成為 Follower。
-
當 Leader 節點宕機或停止服務,會在剩余 2 個 Nacos 節點中產生新的 Leader。如下所示133獲得兩票成為 Leader,132 成為 Follower,131已經下線但角色暫時仍為 Leader。
之后 131 恢復上線,但此時 Nacos 集群已有 Leader 存在,131 自動變為 Follower,且任期歸0。
對於 Nacos 集群來說,只要 UP 狀態節點不少於"1+N/2",集群就能正常運行。但少於“1+N/2”,集群仍然可以提供基本服務,但已無法保證 Nacos 各節點數據一致性。
以上就是 Nacos 基於 Raft 算法的 Leader 選舉過程,確定 Leader 是維持 Nacos 集群數據一致的最重要前提,下面咱們來講解在微服務注冊時 Nacos 集群節點信息同步的過程。
Nacos 節點間的數據同步過程
Nacos 節點間的數據同步過程
在 Raft 算法中,只有 Leader 才擁有數據處理與信息分發的權利。因此當微服務啟動時,假如注冊中心指定為 Follower 節點,則步驟如下:
第一步,Follower 會自動將注冊心跳包轉給 Leader 節點;
第二步,Leader 節點完成實質的注冊登記工作;
第三步,完成注冊后向其他 Follower 節點發起“同步注冊日志”的指令;
第四步,所有可用的 Follower 在收到指令后進行“ack應答”,通知 Leader 消息已收到;
第五步,當 Leader 接收過半數 Follower 節點的 “ack 應答”后,返回給微服務“注冊成功”的響應信息。
此外,對於其他無效的 Follower 節點,Leader 仍會不斷重新發送,直到所有 Follower 的狀態與 Leader 保持同步。