柴震宇 鐘旭 楊碩 于七龍
(東北大學(xué)秦皇島分校 計(jì)算機(jī)與通信工程學(xué)院 河北省秦皇島市 066004)
Hyperledger Fabric[4]是當(dāng)前流行的企業(yè)級(jí)開源區(qū)塊鏈開發(fā)框架,具備良好的可拓展性,支持在豐富的應(yīng)用場(chǎng)景下提供服務(wù)。在實(shí)際生產(chǎn)環(huán)境中,為提高效率,一般會(huì)根據(jù)應(yīng)用場(chǎng)景將Fabric節(jié)點(diǎn)分散部署在多臺(tái)服務(wù)器中,搭建Fabric區(qū)塊鏈網(wǎng)絡(luò)過程中的復(fù)雜的環(huán)境配置通常是開發(fā)者進(jìn)行快速開發(fā)的瓶頸。針對(duì)此問題,已經(jīng)有一些實(shí)踐方案,2020年,林劍宏[5]提供了單機(jī)部署Fabric網(wǎng)絡(luò)的實(shí)踐方案,但該方案適用于初學(xué)者體驗(yàn)Fabric網(wǎng)絡(luò)系統(tǒng)核心功能,不適用于多機(jī)搭建。此外,方案[6]提出了通過指定節(jié)點(diǎn)IP的方式多機(jī)快速部署Fabric節(jié)點(diǎn),但方案無法多節(jié)點(diǎn)進(jìn)行有效管理。2019年,鐘紹柏[7]提出利用Ubuntu、Docker、Docker Compose搭建Fabric鏈碼運(yùn)行環(huán)境,并進(jìn)行鏈碼調(diào)用測(cè)試,但該方案為討論Fabric多機(jī)部署與管理情況。方案[8]提出了基于Kubernetes的云化部署,該方案管理效率較高,但Kubernetes學(xué)習(xí)難度大,且運(yùn)維成本高。
針對(duì)管理效率與實(shí)施成本問題,本文提出了基于Docker swarm實(shí)現(xiàn)Hyperledger Fabric的容器化部署與管理。方案具有以下特點(diǎn):
(1)利用Docker容器技術(shù)部署Fabric節(jié)點(diǎn),實(shí)現(xiàn)Fabric計(jì)算節(jié)點(diǎn)的快速部署;
(2)利用Docker Swarm管理容器工作負(fù)載與維護(hù)集群狀態(tài),保證系統(tǒng)的高可用性與容錯(cuò)性,因swarm兼容Docker API,使得其學(xué)習(xí)成本低,同時(shí)架構(gòu)簡(jiǎn)單,部署與運(yùn)維成本低,適用于中小規(guī)模的集群管理。本方案配置簡(jiǎn)單且管理效率高效,可直接應(yīng)用于各類生產(chǎn)環(huán)境。
如圖1所示為基于Docker Swarm部署Fabric分布式網(wǎng)絡(luò)拓?fù)鋱D,網(wǎng)絡(luò)具有5個(gè)排序節(jié)點(diǎn)(Orderer)、6個(gè)組織(Org),每個(gè)組織下有2個(gè)peer節(jié)點(diǎn)。其中,排序節(jié)點(diǎn)通過廣播(broadcast)接口,接收客戶端發(fā)送的交易,并將交易進(jìn)行排序;組織用于維護(hù)與管理peer節(jié)點(diǎn);組織用于管理peer節(jié)點(diǎn),當(dāng)peer節(jié)點(diǎn)較多時(shí),可通過組織統(tǒng)一管理,同時(shí),組織還為同組織內(nèi)peer節(jié)點(diǎn)通信機(jī)密性提供保護(hù);peer節(jié)點(diǎn)包含了賬本和鏈碼,并維護(hù)賬本和鏈碼、處理事務(wù)提案(transaction proposal)及響應(yīng)(proposal response),且通過不間斷申請(qǐng)更新事務(wù)使賬本適中處于最新狀態(tài)。每個(gè)排序節(jié)點(diǎn)間可相互通信,每個(gè)組織內(nèi)部節(jié)點(diǎn)及組織間也可相互通信。
圖1:基于Docker Swarm部署Fabric分布式網(wǎng)絡(luò)拓?fù)?/p>
系統(tǒng)中主要將Hyperledger Fabric中的各個(gè)組件不屬于Docker容器中運(yùn)行,并通過Docker Swarm作為容器編排工具實(shí)現(xiàn)集中管理各容器,同時(shí)構(gòu)造一個(gè)自定義的虛擬網(wǎng)絡(luò)實(shí)現(xiàn)內(nèi)部通信,通過docker-compose啟動(dòng)Fabric的相關(guān)組件,對(duì)運(yùn)行中的Fabric組件容器進(jìn)行管理與調(diào)度。
方案中Docker Swarm內(nèi)置的跨主機(jī)容器通信方案是overlay網(wǎng)絡(luò),overlay通過虛擬出一個(gè)子網(wǎng),讓處于不同主機(jī)的容器能透明地使用該子網(wǎng),所以跨主機(jī)的容器通信就變成了在同一個(gè)子網(wǎng)下的容器通信,邏輯上形成同一主機(jī)下的bridge網(wǎng)絡(luò)通信。構(gòu)建Hyperledger Fabric分布式網(wǎng)絡(luò)的核心在于使各個(gè)節(jié)點(diǎn)都處于同一個(gè)overlay網(wǎng)絡(luò)中,使其中的有關(guān)組件能夠與其他分布式節(jié)點(diǎn)進(jìn)行通信。
2.3 兩組心率變異性和心率減速力指標(biāo)分析 研究組SDNN、SDANN、RMSSD、LF、HF及心率減速力水平明顯低于對(duì)照組,差異有統(tǒng)計(jì)學(xué)意義(P<0.05),見表3。
如表1所示為圖1中網(wǎng)絡(luò)節(jié)點(diǎn)地址規(guī)劃,基于Fabric多機(jī)使用環(huán)境,表1中每一個(gè)主機(jī)用于構(gòu)建一個(gè)組織(Org),即每個(gè)組織對(duì)應(yīng)一個(gè)IP地址,組織間可通過物理網(wǎng)絡(luò)通信,組織內(nèi)部的peer節(jié)點(diǎn)通過overlay網(wǎng)絡(luò)相互通信,每個(gè)peer不對(duì)應(yīng)具體IP地址,peer之間通過虛擬內(nèi)網(wǎng)間有效的域名通信。
表1:網(wǎng)絡(luò)節(jié)點(diǎn)地址
如圖2所示為系統(tǒng)部署流程,主要內(nèi)容有:
圖2:應(yīng)用部署流程
(1)安裝Docker并拉取鏡像:安裝Docker及與應(yīng)用有關(guān)依賴軟件、拉取基本鏡像為前置條件,本方案中為Hyperledger Fabric官方鏡像;
(2)組建Docker Swarm集群:將各個(gè)服務(wù)主機(jī)加入相同的Docker Swarm集群中;
(3)創(chuàng)建overlay network:各個(gè)節(jié)點(diǎn)所需要共同加入overlay network,以實(shí)現(xiàn)節(jié)點(diǎn)間通信;
(4)配置Docker-compose文件:該文件定義了需要管理的服務(wù)與相關(guān)環(huán)境,本文中主要為Hyperledger Fabric中的orderer節(jié)點(diǎn)、peer節(jié)點(diǎn)與客戶端(Client)控制臺(tái);
(5)啟動(dòng)Docker節(jié)點(diǎn):配置完畢后,可用上一步生成的Docker-compose的相關(guān)文件啟動(dòng)Docker容器,容器內(nèi)部運(yùn)行節(jié)點(diǎn)服務(wù);
(6)應(yīng)用部署:該流程部署相關(guān)的Hyperledger fabric分布式應(yīng)用,到此為止,Hyperledger Fabric的分布式網(wǎng)絡(luò)就構(gòu)建完畢,開發(fā)者可基于此開發(fā)應(yīng)用程序。
方案測(cè)試環(huán)境采用6臺(tái)虛擬機(jī)用于分布式節(jié)點(diǎn)部署,節(jié)點(diǎn)操作系統(tǒng)為Ubuntu20.04,分配1核(vCPU),2G內(nèi)存,20G硬盤。部署操作主要參考圖2中的核心流程,部署中的核心步驟如下所示:
(1)環(huán)境安裝與鏡像拉取,在每一個(gè)組織(Org)的主機(jī)中拉取docker、docker swarm鏡像,拉取成功后可驗(yàn)證相關(guān)組件版本信息,如圖3所示為主機(jī)中Docker版本信息,如圖4所示為Docker compose,如圖5所示為Docker images的版本信息,為了保持系統(tǒng)安全性與可擴(kuò)展性,各類基礎(chǔ)組件安裝時(shí)應(yīng)選擇穩(wěn)定版本部署。
圖3:Docker版本
圖4:Docker-compose版本
圖5:Docker images信息
(2)組建Docker swarm集群。在各個(gè)主機(jī)中分別通過“docker swarm init --advertise-addr <host-1 ip address>”、“docker swarm join-token manager”、“<o(jì)utput from jointoken manager> --advertise-addr <host-2 ip address>”命令構(gòu)建Docker swarm,部署成功可查看部署后的集群。如圖6所示為通過“docker node ls”查看本項(xiàng)目中集群節(jié)點(diǎn)信息,其中,每個(gè)節(jié)點(diǎn)的“Ready”狀態(tài)代表節(jié)點(diǎn)狀態(tài)正常,管理狀態(tài)(MANAGER STATUS)為“Leader”表示該節(jié)點(diǎn)可進(jìn)行集群任務(wù)調(diào)度,當(dāng)Leader節(jié)點(diǎn)發(fā)生故障時(shí),其它主機(jī)將重新推舉產(chǎn)生新的Leader管理集群。
圖6:Docker swarm集群
(3)創(chuàng)建overlay network。在主機(jī)中通過“docker network create --attachable --driver overlay basic-network”命令構(gòu)建overlay網(wǎng)絡(luò),如圖7所示為構(gòu)建網(wǎng)絡(luò)完畢后通過“docker network ls”命令查看網(wǎng)絡(luò)信息,其中,DRIVER為“overlay”、SCOPE為“swarm”的網(wǎng)絡(luò)為新建的overlay network。創(chuàng)建overlay network之后,運(yùn)行在多個(gè)節(jié)點(diǎn)(nodes)上的容器(container)可通過內(nèi)部網(wǎng)絡(luò)進(jìn)行通信與訪問。
圖7:創(chuàng)建overlay network的目錄
(4)配置Docker-compose文件。如表2所示為各主機(jī)的Docker-compose文件與節(jié)點(diǎn)信息,compose文件是一個(gè)YAML文件,用于定義services、network和volumes等參數(shù)。本方案中有6臺(tái)主機(jī),對(duì)應(yīng)需要配置6臺(tái)主機(jī)的dockercompose文件。配置相關(guān)文件可啟動(dòng)Hyperledger Fabric節(jié)點(diǎn)。
表2:主機(jī)Docker-compose文件
(5)啟動(dòng)節(jié)點(diǎn)。在各主機(jī)輸入“docker-compose -f < hostn.yaml> -f <o(jì)rdern.yaml> up -d”命令啟動(dòng)節(jié)點(diǎn),其中“-f”參數(shù)表示指定文件,“-d”參數(shù)表示后臺(tái)啟動(dòng)。如圖8所示,為節(jié)點(diǎn)啟動(dòng)成功后在Host1中通過“docker ps -a”命令查看容器運(yùn)行情況,其中,STATUS為“up”表示節(jié)點(diǎn)正常啟動(dòng)與運(yùn)行。
圖8:Host 1節(jié)點(diǎn)啟動(dòng)情況
(6)應(yīng)用部署。根據(jù)Hyperledger Fabric的業(yè)務(wù)流程,首先需要完成加入通道(peer channel join)、更新錨節(jié)點(diǎn)(peer channel update)、安裝鏈碼(install chaincode)、審批鏈碼(approve chaincode)、提交鏈碼(commit chaincode)、初始化鏈碼(init chaincode)等步驟完成之后,才能進(jìn)入業(yè)務(wù)核心流程調(diào)用鏈碼。其中,通道分為系統(tǒng)通道與應(yīng)用通道,分別用于傳輸管理與交易信息;錨節(jié)點(diǎn)是每個(gè)組織中若干個(gè)peer節(jié)點(diǎn)的代表,負(fù)責(zé)與其它組織通信;安裝鏈碼即部署Fabric智能合約,鏈碼被編譯成一個(gè)獨(dú)立的應(yīng)用程序,運(yùn)行于隔離的Docker容器中;審批鏈碼用于允許向通道提交鏈碼,F(xiàn)abric中需要超過一般的組織審批鏈碼后才可向通道提交鏈碼;鏈碼的初始化只需要執(zhí)行一次,在任意節(jié)點(diǎn)上執(zhí)行即可。
如圖9所示為Fabric多機(jī)部署測(cè)試,部署完畢后,可驗(yàn)證各排序節(jié)點(diǎn)間與組織內(nèi)部節(jié)點(diǎn)間網(wǎng)絡(luò)是否暢通,圖9(a)為驗(yàn)證排序節(jié)點(diǎn)間網(wǎng)絡(luò)連接,圖9(b)為驗(yàn)證組織內(nèi)部節(jié)點(diǎn)間網(wǎng)絡(luò)連接。
圖9
以上部署及測(cè)試結(jié)果表明,基于Docker Swarm的Hyperledger Fabric多機(jī)部署具有可行性。因Docker swarm是Docker官方社區(qū)開發(fā)的原生集群管理工具,其使用標(biāo)準(zhǔn)的docker API,使得Docker swarm學(xué)習(xí)成本低,同時(shí)架構(gòu)簡(jiǎn)單,運(yùn)維成本低,有利于快速部署與二次開發(fā)。
本文針對(duì)Fabric多機(jī)的管理效率低與實(shí)施成本高問題,研究了基于容器技術(shù)的Hyperledger Fabric的多機(jī)部署,并通過實(shí)驗(yàn)的方式驗(yàn)證了有關(guān)Hyperledger Fabric節(jié)點(diǎn)在Docker Swarm的容器編排管理的可行性。方案具有可快速部署、易于管理等特點(diǎn),針對(duì)于普通規(guī)模的Fabric集群部署與管理具有一定優(yōu)勢(shì),且可直接應(yīng)用于各類生產(chǎn)環(huán)境。方案未對(duì)部署規(guī)模較大集群效率與性能進(jìn)行測(cè)試,下一步將針對(duì)規(guī)模較大集群時(shí)的精細(xì)管理做出探索。