FABIRC高性能排序服务集群实战

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集群过程中的一点小小的探索。目前区块链还处于技术早期发展阶段,国内的区块链在底层协议、应用和标准等方面都不够成熟,区块链技术和商业仍需不断完善。但是区块链技术是一场技术的革新,我相信它会推动人类社会各个领域创新与多元化,让我们拭目以待吧。

本文仅代表个人观点

猜你喜欢

转载自www.cnblogs.com/tatumu/p/9717892.html