1. 程式人生 > >[原始碼閱讀] 阿里SOFA服務註冊中心MetaServer(3)

[原始碼閱讀] 阿里SOFA服務註冊中心MetaServer(3)

# [原始碼閱讀] 阿里SOFA服務註冊中心MetaServer(3) [toc] ## 0x00 摘要 SOFARegistry 是螞蟻金服開源的一個生產級、高時效、高可用的服務註冊中心。本系列將帶領大家一起分析其MetaServer的實現機制。本文為第三篇,介紹MetaServer如何基於raft實現了資料一致性。 因為篇幅限制,本文不會涉及 Raft 和 JRaft 的原理和實現,只是講解MetaServer如何基於 JRaft 的實現。 ## 0x01 概念 ### 1.1 分散式一致性 分散式一致性 (distributed consensus) 是分散式系統中最基本的問題,用來保證一個分散式系統的可靠性以及容災能力。 簡單的來講,就是如何在多個機器間對某一個值達成一致,並且當達成一致之後,無論之後這些機器間發生怎樣的故障,這個值能保持不變。抽象定義上, 一個分散式系統裡的所有程序要確定一個值 v,如果這個系統滿足如下幾個性質,就可以認為它解決了分散式一致性問題,幾個性質分別是 : - Termination: 所有正常程序都會決定 v 具體的值,不會存在一直在迴圈的程序。 - Validity: 任何正常程序如果有一個確定的值 v’,那麼 v’ 肯定是某個程序提交的。比如隨機數生成器就不滿足這個性質。 - Agreement: 所有正常程序選擇的值都是一樣的。 ### 1.2 SOFAJRaft SOFAJRaft 是一個基於 Raft 一致性演算法的生產級高效能 Java 實現,支援 MULTI-RAFT-GROUP,適用於高負載低延遲的場景。 因為 SOFARegistry 叢集節點列表資料並不是很多,因此不需要使用資料分片的方式在 MetaServer 中儲存。叢集節點列表儲存在 Repository 中,通過 Raft 強一致性協議對外提供節點註冊、續約、列表查詢等 Bolt 請求,從而保障叢集獲得的資料是強一致性的。 ## 0x02 基礎架構 這裡的基礎架構指的是 :基於JRaft之上的,在SOFARegistry之中構建的基礎架構,包括StateMachine,Handler,RaftServer,RaftClient 等等。 ### 2.1 RaftExchanger Exchange 作為 Client / Server 連線的抽象,負責節點之間的連線。RaftExchanger就是Raft協議連線的抽象,可以看到其中包含配置,Registry和Raft元件。 ```java public class RaftExchanger { @Autowired private MetaServerConfig metaServerConfig; @Autowired private NodeConfig nodeConfig; @Autowired private Registry metaServerRegistry; private RaftServer raftServer; private RaftClient raftClient; private CliService cliService; } ``` 在系統啟動時候,會把Raft這幾個元件啟動。 ```java private void initRaft() { raftExchanger.startRaftServer(executorManager); raftExchanger.startRaftClient(); raftExchanger.startCliService(); } ``` ### 2.2 RaftServer RaftServer是Raft協議的服務端,主要有如下成員或者行為: - 啟動一個 raft node節點,提供分散式服務。 - 內部使用 jraft 提供的 `RaftGroupService` 服務框架。 - fsm是業務狀態機,其實現類是`ServiceStateMachine`,其行為handler針對Leader和follower分別有leaderProcessListener 和 followerProcessListener。 - boltServer 是Blot服務。因為JRraft基於bolt,所以設定了`RaftServerHandler`和`RaftServerConnectionHandler`。 具體類實現如下: ```java public class RaftServer { private RaftGroupService raftGroupService; // jraft 服務端服務框架 private Node node; // raft 節點 private ServiceStateMachine fsm; // 業務狀態機 private PeerId serverId; private Configuration initConf; private String groupId; private String dataPath; priv