因爲fabric是分佈式的系統,所以須要共識機制來保障各個節點以相同的順序狀態保存帳本,達成一致性。 在當前fabric1.4版本中,存在三種共識機制,分別是solo,kafka,etcdraft。交易的共識包括3個階段的處理:提議階段、打包階段和驗證階段。算法
Solo共識模式指網絡環境中只有一個排序節點,從Peer節點發送來的消息由一個排序節點進行排序和產生區塊;因爲排序服務只有一個排序節點爲全部Peer節點服務,沒有高可用性和可擴展性,不適合用於生產環境,一般用於開發和測試環境。網絡
Solo共識模式調用過程說明:分佈式
Hyperledger Fabric的核心共識算法經過Kafka集羣實現,簡單來講,就是經過Kafka對全部交易信息進行排序(若是系統存在多個channel,則對每一個channel分別排序)。
Kafka是一個分佈式的流式信息處理平臺,目標是爲實時數據提供統一的、高吞吐、低延遲的性能。
Kafka由如下幾類角色構成:性能
Kafka將消息分類保存爲多個topic,每一個topic中包含多個partition,消息被連續追加寫入partition中,造成目錄式的結構。一個topic能夠被多個consumers訂閱。簡單來講,partition就是一個FIFO的消息管道,一端由producer寫入消息,另外一端由consumer取走消息(注意,這裏的取走並不會移除消息,而是移動consumer的位置指針)。測試
在Hyperledger Fabric中的Kafka實際運行邏輯以下:指針
Raft 是 v1.4.1 中引入的,它是一種基於 etcd 的崩潰容錯(CFT)排序服務。Raft 遵循 「領導者和追隨者」 模型,其中領導者在通道中的orderer節點之間動態選出(這個節點集合稱爲「consenter set」),該領導者將消息複製到跟隨者節點。因爲系統能夠承受節點(包括領導節點)的丟失,只要剩下大多數排序節點(即所謂的「仲裁」),Raft就被稱爲「崩潰容錯」(CFT)。換句話說,若是一個通道中有三個節點,它能夠承受一個節點的丟失(剩下兩個節點)。日誌
日誌條目:Raft排序服務中的主要工做單元是「日誌條目」,這些條目的完整序列稱爲「日誌」。若是成員的多數(法定人數,換言之)成員到條目及其順序達成一致,咱們認爲日誌是一致的。排序
Consenter設置:排序節點主動參與給定信道的共識機制並接收信道的複製日誌。這能夠是全部可用節點(在單個羣集中或在對系統通道有貢獻的多個羣集中),或者是這些節點的子集。接口
有限狀態機(FSM):Raft中的每一個排序節點都有一個FSM,它們共同用於確保各個排序節點中的日誌序列是肯定性的(以相同的順序編寫)。進程
法定人數:描述須要確認提案的最少數量的贊成者,以即可以提交交易。對於每一個consenter集,這是 大多數節點。在具備五個節點的羣集中,必須有三個節點才能存在仲裁。若是因爲任何緣由致使法定數量的節點不可用,則orderer將沒法用於通道上的讀取和寫入操做,而且不能提交新日誌。
Leader:Leader負責提取新的日誌條目,將它們複製到跟隨者訂購節點,以及管理什麼時候認爲條目已提交。這不是特殊類型orderer人。在狀況決定的狀況下,這只是orderer在某些時候可能擁有的角色,而不是其餘角色。
Follower:Follower從Leader那裏接收日誌並肯定性地複製它們,確保日誌保持一致。Follower也會收到來自Leader的「心跳」信息。若是Leader中止在可配置的時間內發送這些消息,則追將發起選舉,其中一個Follower將被選爲新Leader。
每一個通道都在Raft協議的單獨實例上運行,這容許每一個實例選擇不一樣的leader。還容許集羣由不一樣組織控制的排序節點組成的用例中進一步分散服務。雖然全部Raft節點必須是系統通道的一部分,但它們不必定必須是全部應用程序通道的一部分。通道建立者(和通道管理員)能夠選擇可用orderer的子集,並根據須要添加或刪除orderer(一次只能添加或刪除一個節點)。
在Raft中,交易(提案或配置更新的形式)由接收交易的orderer節點自動路由到該信道的當前leader。這意味着peer和應用程序不須要知道leader是誰。只有orderer節點須要知道。
raft節點始終處於如下三種狀態之一:follower,candidate或leader。全部節點最初都是follower。在這種狀態下,他們能夠接受來自leader的日誌條目(若是已經當選),或者爲leader投票。若是在設定的時間內沒有收到日誌條目或心跳(例如,五秒),則節點會自我提高到candidate狀態。在候選狀態中,節點請求來自其餘節點的投票。若是候選人得到法定數量的選票,則將其提高爲leader。leader接受新的日誌條目並將其複製給follower。
雖然能夠無限期地保留全部日誌,但爲了節省磁盤空間,Raft使用一個名爲「snapshotting」的進程,用戶能夠在其中定義將在日誌中保留多少字節的數據。每一個快照將包含必定數量的塊)。