前面關於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