Hyperledger Fabric是由IBM公司主导开发的一个面向企业级客户的开源项目。Hyperledger Fabric自诞生之日起就获得了全球众多企业的关注,它的出现让企业级区块链应用的落地成为可能。
企业级的区块链一般都是围绕业务场景展开,区块链网络中要求所有参与方具有身份对等的架构,并建立共识协议。与比特币和以太坊这类公链不同,Hyperledger Fabric网络中的节点必须经过授权认证后才能加入整个网络。授权认证机制将区块链网络中的各节点透明可控化,有助于企业进行有效控制。
同时为了满足灵活多变的应用场景,Hyperledger Fabric采用了模块化的系统设计理念,它将权限认证模块(MSP)、共识服务模块(Ordering Service)、背书模块(Endorsing peers)、区块提交模块(committing peers)等进行分离,使开发者可以根据具体的业务场景需要,使用各自模块,实现了模块的可插拔设计。在我看来,Hyperledger Fabric更适合作为一个联盟链的开发框架。
*Hyperledger Fabric先后经历两个大版本(0.6和1.x),本文讨论的都是1.x系列的架构。
1. fabric简介
fabric的交易流程图:
交易流程步骤如下:
1) 客户端构造交易提案发送给背书节点
2) 背书节点模拟执行交易,并进行背书
3) 客户端收集背书节点的模拟交易结果
4) 客户端把合法的包含签名背书的交易发送到排序节点
5) 排序节点对交易进行排序打包并生成区块
6) 排序节点将区块广播给各个组织的主节点
7) 各个组织的主节点将交易保存到区块链账本里
8) 主节点同步区块给组织内的其他节点
9) 其他节点将区块保存到账本
为了更加深入了解了整个交易的流程,在此通过手动搭建基于kafka集群的多排序节点的fabric环境进行演示说明。
搭建完成之后架构图如下:
注:搭建流程引自:https://www.cnblogs.com/neomeister/articles/9625762.html
由上图可见orderer节点为整个区块链网络中所有合法交易进行全局排序,并将排序后的交易组合生成区块结构。在目前的设计中,所有合法的交易信息都会从Orderer节点经过,因此Orderer节点在网络中必须处于可靠、可信的地位。那怎样才能保证orderer节点的高可用呢?
2. 高性能排序服务搭建
上面我们在搭建的fabric集群架构的时候,为了实现高可用我们创建了3个orderer节点,但是每次将合法交易发送给排序节点的时候必须指定其中的一个orderer节点进行交易的提交,如上面例子中对智能合约的操作:
peer chaincode invoke -o orderer0.neotest.com:7050 -C neotest1channel -n neotest1cc -c '{"Args":["invoke","a","b","1"]}'
如果指定的orderer节点down机了,本来交易提案验证成功的该笔交易就会提交失败。为了避免这个问题,我们参考了现有的分布式系统的架构的设计理念,引入了nginx做代理,在交易流程第四步,客户端client与orderer集群中间新增了一台nginx做负载均衡,这样我们提交交易的时候只需要往nginx发送交易,并且只要有一台orderer节点运转正常,交易的提交就不会失败。
因区块链底层都是通过gRPC协议进行通信,我们需要使用1.13.10以上版本的nginx才能支持gRPC负载,我们试着搭建一下:
1) 从nginx官网上获取版本号不低于1.13.10的源码包,本文使用的版本为1.14.0。
2) 将nginx源码包拷贝到centos中,并进行解压,得到nginx的源码;
3) 进入nginx源码目录中,执行如下的configure命令:
./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_v2_module
安装nginx的时候我们需要添加http_ssl_module和http_v2_module模块方法(让web服务器支持SSL和http2)
4) make
5) make install
6) 运行以下命令看nginx是否安装成功
进入nginx安装目录,运行./sbin/nginx -v
如显示:
nginx version: nginx/1.14.0
则表示nginx安装成功
7) 编辑nginx.conf文件,搭建负载均衡服务器
http {
server {
listen 8080 http2;
access_log logs/access.log main;
upstream grpcServers{
server orderer0.neotest.com:7050;
server orderer1.neotest.com:7051;
server orderer2.neotest.com:7052;
}
#拦截客户端发送给排序服务器的请求
location /orderer.AtomicBroadcast {
grpc_pass grpc://grpcServers;
}
}
}
8) 启动nginx
完成以上步骤,架构就调整成了下图:
至此,高可用的orderer集群负载已经搭建完成,客户端仅需往nginx机器的8080端口提交交易
peer chaincode invoke -o nginx服务器IP:端口 -C neotest1channel -n neotest1cc -c '{"Args":["invoke","a","b","1"]}'
nginx服务器会将提交的交易请求自动负载到某个orderer节点进行交易打包,提高了系统的性能和可用性以及容灾容错能力。
3. 小结
上面是本人在搭建fabric集群过程中的一点小小的探索。目前区块链还处于技术早期发展阶段,国内的区块链在底层协议、应用和标准等方面都不够成熟,区块链技术和商业仍需不断完善。但是区块链技术是一场技术的革新,我相信它会推动人类社会各个领域创新与多元化,让我们拭目以待吧。
本文仅代表个人观点