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 org2 --ip 192.168.1.13

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

注: deploy/pkg中存放了所需的鏡像及軟件包,如果有缺失,deploy.sh腳本執行時會自行從網絡下載,所以無需手動配置環境。運行部署腳本後,新增機器會默認部署一個新組織,並啓動所有節點(1CA, 2peer, 2couchdb)。如果需要自定義主機中需要部署的節點,對腳本稍作調整即可。

多機部署組織的所有腳本及配置文件位於:https://github.com/zhayujie/fabric-tools

原文鏈接:https://zhayujie.com/multi-host.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章