天天看點

Hyperledger Fabric 1.0 從零開始(十三)——orderer分布式方案

簡述

本文主要介紹的是采用kafka(分布式隊列)方式實作的共識方案。

使用kafka叢集配置的原因也很簡單,為orderer共識及排序服務提供足夠的容錯空間,當我們向peer節點送出Transaction的時候,peer節點會得到或傳回(基于SDK)一個讀寫集結果,該結果會發送給orderer節點進行共識和排序,此時如果orderer節點突然down掉,緻使請求服務失效而引發的資料丢失等問題,且目前的sdk對orderer發送的Transaction的回調會占用極長的時間,當大批量資料導入的時候該回調可認為不可用。

固此,在部署生産環境時,需要對orderer進行容錯處理,而所謂的容錯即搭建一個orderer節點叢集,該叢集會依賴于kafka和zookeeper。

crypto-config.yaml

該檔案在之前介紹過,将被crytogen工具調用,檔案中包括了網絡拓撲,同時允許我們給organization以及component(隸屬于organization的元件)生成一個證書與私鑰的集合。每一個organization被配置設定一個唯一的根證書(綁定了隸屬于organization的具體的component,包括peers與orderers)。Hyperledger Fabric的transaction與通信均被節點的私鑰(keystore)進行簽名,截止被公鑰進行驗證(signcerts)。

在crypto-comfig中有一個OrdererOrgs配置,在該配置中我們可以設定目前Fabric生産中允許的最大orderer節點數量及名稱,具體在OrdererOrgs-Specs中進行設定,如下圖所示:

Hyperledger Fabric 1.0 從零開始(十三)——orderer分布式方案

在上述配置中,我們假定設定了三台orderer節點伺服器,這個數量根據自身平台可自行設定。

随後,我們可以通過如下指令來生成我們需要的驗證檔案資訊集:

該資訊集在ordererOrganizations目錄下,通過浏覽該目錄下組織機構目錄下的orderers目錄,我們可以看到如下圖所示結構:

Hyperledger Fabric 1.0 從零開始(十三)——orderer分布式方案

即生成所有我們所需的orderer節點驗證檔案。

configtx.yaml

該檔案即本文開頭所述檔案,用于建構創世區塊所需檔案。

結合crypto-comfig檔案的配置内容,既然指定并建立了三個orderer節點服務配置,則根據上述配置結果,我們來定義configtx檔案中的Orderer配置資訊,具體參考如下:

該配置檔案中的主要設定都做了注釋,可參考注釋來對自己的生産平台進行設定,另外OrdererType的value需設定成kafka。

在完成crypto-comfig和configtx配置後,接下來就需要配置zookeeper、kafka和orderer的啟動yaml檔案了。

zookeeper

zookeeper的yaml檔案配置主要約定了叢集内彼此的端口資訊,官方的demo已經比較詳細了,這裡貼出配置内容如下:

zookeeper叢集将會是3個、5個或7個,它的值需要是一個奇數避免split-brain情況,同時選擇大于1的值為了避免單點故障。超過7個zookeeper servers會被認為overkill。

這裡給出了zookeeper1的配置檔案,其它2、3…等配置檔案内容類似,其中的ID禁止相同。

kafka

kafka的配置資訊與zookeeper和orderer都息息相關,具體都已經寫在注釋中了,如還有疑問可留言提問,具體的kafka1的yaml如下:

kafka至少需要4台伺服器來構成叢集,這是為了滿足crash容錯的最小節點數。如果有4個代理,那麼可以容錯一個代理崩潰,一個代理停止服務後,channel仍然可以繼續讀寫,新的channel可以被建立。

如配置資訊中注釋所示,最小寫入同步的副本數量大于1,即最小為2;

如配置資訊中注釋所示,預設副本儲存channel資訊的數量,必須大于最小寫入同步的副本數量,即最小值3;

若要保證容錯,即kafka叢集最少需要4台伺服器來保證,此時允許一個代理出現問題。

orderer

orderer服務節點配置資訊相對于solo有些變化,主要是新增了部分參數,如下所示:

啟動順序

基于zookeeper和kafka的叢集方案,啟動順序主要跟随依賴,先啟動zookeeper叢集,随後啟動kafka叢集,最後啟動orderer叢集。

各位如果還有不明白的地方,可以參考官方demo,具體可以在fabric/bddtests目錄中找到dc-orderer-kafka-base.yml和dc-orderer-kafka.yml兩個配置檔案。

還有個問題,想提醒下各位,在hyperledger的zookeeper分布式部署到多台伺服器的時候,需要在docker-compose的zookeeper配置中修改參數: ZOO_SERVERS後面加上quorumListenOnAllIPs=true,不然很可能會抛出異常:This ZooKeeper instance is not currently serving requests 因為不設定這個參數,zookeeper隻會通路第一塊網卡即127.0.0.1會把此網卡的端口開啟監聽,不會開啟實際ip的網卡的端口監聽

<a href="https://github.com/keenkit/fabric-sample-with-kafka" target="_blank">https://github.com/keenkit/fabric-sample-with-kafka</a>