1. 程式人生 > >Hyperledger fabric應用的多機部署

Hyperledger fabric應用的多機部署

前面關於fabric部署的介紹都是基於單機環境下的,實際生產環境中一般會根據應用場景將節點分開部署在多臺物理機上,面臨的難題主要是不同主機間的節點如何通過網路進行通訊。

前言

這裡仍然以balance-transfer v1.0為例,嘗試將兩個組織分佈到內網中的兩臺機器上,部署示意圖如下:

在這裡插入圖片描述

使用的是solo模式的排序服務,orderer節點和Org1位於一臺機器上,Org2位於另一臺機器上,每個組織有一個CA節點和兩個Peer節點,整個應用程式程式碼也部署在第一臺機器上(圖中未標出)。為了簡便只用了兩臺機器,實際中也可以根據需要將每一個節點分開部署在一臺物理機上。

如果使用kafka模型的排序服務,部署就更為複雜一些,需要增加機器來部署更多的排序相關節點以保證排序服務的崩潰故障容錯。

步驟

一、編寫docker-compose檔案

當前由於是單機部署,所以共七個容器的配置都是寫在一個docker-compose.yaml中的,現在需要拆分成兩份,用於在兩臺機器上分別啟動節點。

拆分的過程很簡單,只需要在一份docker配置檔案中保留Orderer節點,Org1的1個CA節點、2個Peer節點的配置,在另一份配置檔案中保留Org2的1個CA、2個Peer的配置。

這一步的重點,也是整個多級部署的關鍵,就是需要在每個Peer容器中新增extra_hosts引數,這個引數提供需要連線的節點的主機名hostname和ip的對映。在單機環境中是無須設定這個引數的,因為所有容器處於同一機器同一網路,可以直接通過主機名來連線其他容器,但是如果處於不同機器,就必須提供IP地址才能跨主機通訊。

對於extra_hosts的設定,網上的一些資料看法不一,有的人認為peer節點的該引數要設定其餘所有節點的ip地址。經過一些測試後我發現:只需要設定位於不同機器上的Orderer節點以及同組織其他節點的ip

這裡Org1與Orderer節點處於同一機器,組織內的兩個節點也沒有分開,所以無需新增extra_hosts;而Org2的兩個Peer節點則只需要新增Orderer節點的IP,就可以正常接收到區塊了。

extra_hosts:
    - "orderer.example.com:192.168.1.66"

如果把Org2的兩個Peer分開到兩個機器上,則這兩個Peer還需要新增上彼此的IP對映,因為Orderer節點只會分發區塊給組織的Leader節點,所以其他節點需要訪問Leader節點來獲取區塊。

之所以我們沒有新增其他組織的節點ip,是因為不同組織間只能通過錨節點(anchor peers)進行通訊,這裡在沒有設定錨節點的情況下就算我們添加了其他組織的ip也無濟於事,在後面會研究如何設定錨節點來進行跨組織的通訊。

二、分發配置檔案

現在機器二執行節點所需要的配置檔案。我們先在機器一上操作,這裡新建了一個artifacts目錄,首先從crypto-config目錄複製過來Org2的msp目錄,然後是兩個容器配置的檔案,最後如果我們的組織名稱不是Org1或Org2,則需要手動建立一個CA配置檔案(由於要修改affiliation欄位)。

artifacts
    ├── org2.example.com	            // Org2的msp目錄
    ├── base.yaml				      
    ├── docker-compose.yaml		     
    └── fabric-ca-server-config.yaml    // 如果組織名是自定義的則需要這個檔案

這裡的目錄名稱需要命名為artifacts,因為將來要在此目錄下執行docker-compose up命令,而該命令建立的網路id預設就是當前所在目錄的名稱,為了讓兩臺機器節點處於同一網路,就必須使該目錄名稱保持一致。

此時docker-compose.yaml還要做相應修改,因為新機器的msp目錄的相對路徑發生了改變(位於同一目錄下),注意CA容器和Peer容器的volumes對映部分和environment部分的某些引數要根據實際路徑稍作調整。

準備完成後,就可以將整個artifacts目錄傳送到新的機器上去,有多種方法,可以在命令列使用scp命令,也可以用FileZilla等遠端連線客戶端以sftp方式進行檔案傳輸。

三、修改network-config.json檔案

接下來修改網路配置檔案,需要修改每個組織CA和Peer的IP地址,由於APP和組織一是同一機器,所以這裡Org1節點的ip保持為localhost即可,無需修改。下面是Org2的第一個節點的設定,由於這裡兩臺機器處於同一內網,所以寫內網ip就可以。

"peer1": {
    "requests": "grpcs://192.168.1.13:7051",
    "events": "grpcs://192.168.1.13:7053",
    "server-hostname": "peer0.org2.example.com",
    "tls_cacerts": "../artifacts/channel/crypto-config/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt"
},

四、在兩臺機器上分別啟動節點

新加入機器所需的環境有:fabric映象(ca,peer,ccenv),docker,docker-compose。所有準備工作都已完成後,可以開始啟動節點了,在兩臺主機的artifacts目錄下分別執行一下命令啟動所有容器:

docker-compose up -d

接下來需要初始化網路,要完成的操作有:註冊使用者、建立通道、將所有節點加入通道、在所有節點上安裝鏈碼、在通道上例項化鏈碼。這些步驟可以通過執行balance-transfer提供的指令碼runApp.sh來完成,也可以手動一步步提交請求完成。

到這一步,多機部署的fabric網路就建立成功了,可以測試下兩臺機器上的節點是否維護相同賬本,可以指定Org1的節點發起交易,在Org2的節點上進行查詢,檢視是否賬本資料能夠同步。

實際應用:多機增加組織

上面提到的多機部署過程,需要在fabric網路建立之前就確定哪些節點應該部署在哪些機器上。而實際開發中更多的情況是:在網路建立之初可能無法預估有哪些網路成員,有些存在不同主機上的組織或節點需要在後續依次加入,並且不能破壞當前網路的正常執行。

這就需要結合多機部署和動態增加組織兩種場景,將新的機器上的新組織節點加入到當前網路中。動態增加組織在前面的文章中已經詳細介紹過了,多機增加組織則需要加上本文上述的一些步驟,可概括為以下幾步:

  • 為新組織生產msp目錄,包含證書、私鑰;
  • 傳送增加新組織的請求,更新通道配置(已經呼叫SDK寫成了介面);
  • 將新組織的配置檔案置於目標機器,包括msp目錄、容器配置檔案;
  • 修改network-config.json檔案,新增新組織節點資訊;
  • 在新加機器上啟動所有容器;
  • 傳送請求將新組織節點加入通道,安裝鏈碼,有需要還可以升級鏈碼。

為了更簡便地在任意主機上建立新組織並加入到網路,我寫了一些指令碼來實現一鍵部署。需要的機器作業系統為CenhtOS 7.4+Ubuntu 16.04+,無需下載任何先決條件。現提供了兩個目錄deploy和new-org,new-org目錄需要提前置於應用程式所在伺服器上(位於App專案根目錄),而deploy目錄將會分發到每一個新加機器中,只需要簡單兩步就可以完成多機動態增加的部署:

一、將deploy目錄拷貝至新加入的機器,在目錄下執行:

sudo ./deploy.sh --domain <domain>  --order <ordererIP>

(domain引數:新加組織的域名, order引數:orderer節點所在的ip地址)

e.g.   sudo ./deploy.sh --domain org2.example.com --order 192.168.1.66

二、將deploy/artifacts目錄下生成的msp目錄(org2.example.com)拷貝到app所在伺服器的new-org目錄中

並在new-org目錄下執行:

sudo ./add_org.sh - -org <orgName> --ip <IP>

(org引數:新加組織的名稱,ip引數:新組織所在機器的ip地址)

e.g.     sudo ./add_org.sh --org archain --ip 192.168.1.13

執行完後新機器上的新組織即可成功加入當前網路。

注: deploy/pkg中存放了所需的映象及軟體包,如果有缺失,deploy.sh指令碼執行時會自行從網路下載,所以無需手動配置環境。執行部署指令碼後,新增機器會預設部署一個新組織,並啟動所有節點(1CA, 2peer, 2couchdb)。如果需要自定義主機中需要部署的節點,對指令碼稍作調整即可。