这是一篇简要翻译的文章,亲测有效,因为目前关于搭建多主机hyperledger fabric的文章除了像 (http://www.cnblogs.com/studyzy/tag/Fabric/) 使用官方的 e2e_cli 代码进行部署外,其他并没有见到别的什么方式。这篇博客获得了不少的✨,所以自己搭了一遍,当然做这个的直接看原链接就可以,就当留个笔记。原文地址链接: https://medium.com/@wahabjawed/hyperledger-fabric-on-multiple-hosts-a33b08ef24f
Hyperledger Fabric 1.0及到目前最新的1.2的版本与之前的0.6版本在架构上又很大的不同,进行了模块化的解耦及对节点角色的重新定义。0.6的使用过程相对简单,简要记录一下:
- 启动网络:包括启动根节点,然后其他peer节点加入
- 部署(deploy) chaincode:可以使用SDK,也可以直接使用postman之类的可以操作restful API的工具发送POST请求,deploy结束会返回一个ChainID的字符串。
- 利用上一步返回的chainID,调用SDK或者使用postman实现Invoke,query,get_chainlist等操作。
1.0以后的版本中取消了restful的方式,只能使用SDK了!
如何在单机上运行
Hyperledger Fabric
的运行是依赖于Docker
的,各组件运行在不同的容器中,为了使这些容器彼此通信,可以通过创建一个网络然后将容器加入进去,当运行官方示例fabric-samples
的First Network
时,主要是运行 docker-compose-cli.yaml
文件,从中可以看出,创建了一个byfn
网络,然后所有容器attach到这个网络中。
Hyperledger Fabric
给出了很好的关于单机运行的示例,即在同一主机上运行多个不同的docker
容器,通过不同端口来模拟多主机之间的通信,但在实际环境中,我们需要将服务运行在多主机的分布式系统中。
如何在多主机上运行
当需要在多主机上运行hyperledger fabric
时,容器之间不能直接进行互相通信(因为docker
会自动分配不同的子网地址给每个容器)。因此,需要有一种方式使得这多个主机上的容器能相互进行通信(其实跨主机容器通信可以通过一些方法来实现,比如使用OVS+GRE
,Flannel
或者直接路由
等方式)。现在,我们直接可以使用docker swarm
来实现(具体可查看docker swarm的官方文档)。
网络拓扑结构
将要构建的网络架构如下图所示,该架构中包含了最基本的Hyperledger Fabric 1.0的组件,我们只需要两台主机,组件分布为包括:
- 1个
CA
服务(在节点 1 上) - 1个
Orderer
排序服务(在节点 1 上) - 1个普通节点
Peer0
(组织 1 的节点 0, 在节点 1 上) - 一个
CouchDB0
(连接到Peer0
来存储状态,在节点 1上) - 一个
CouchDB1
(连接到Peer1
来存储状态,在节点 2上) - 1个普通节点
Peer1
(组织 1 的节点 1, 在节点 2 上) - 1个客户端
Cli
(在节点 2 上)
对于这两台主机:
节点1: 192.168.245.235 (Ubuntu 16.04)
节点2:192.168.245.236 (Ubuntu 16.04)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pN48v2f8-1596319710406)(https://cdn-images-1.medium.com/max/1600/1*3-DR8ffADZyN3k_hyv_1fQ.png)]
现在开始整个搭建过程。
创建 Docker Swarm Mode 网络
- 初始化
swarm
(更多详情参见docker swarm官方文档),在节点1上执行
$ docker swarm init
后续过程概述为:节点1创建swarm
,然后节点2以manager
身份加入创建的swarm
中。
- 在节点1上执行:
$ docker swarm join-token manager
输出就会像是:
docker swarm join — token SWMTKN-1–3as8cvf3yxk8e7zj98954jhjza3w75mngmxh543llgpo0c8k7z-61zyibtaqjjimkqj8p6t9lwgu 192.168.245.235:2377
复制这段命令,然后在节点2中执行,成功输出结果会是一个字符串,这个不再理会。
- 在节点1上执行如下命令创建网络:
$ docker network create --attachable --driver overlay mynet