百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

Fabric多机部署

bigegpt 2024-08-19 12:13 2 浏览

前言

前面关于fabric部署的介绍都是基于单机环境下的,实际生产环境中一般会根据应用场景将节点分开部署在多台物理机上,面临的难题主要是不同主机间的节点如何通过网络进行通信。

这里仍然以balance-transfer v1.0为例,尝试将两个组织分布到内网中的两台机器上,部署示意图如下:

这里使用的是solo模式的排序服务,orderer节点和Org1位于一台机器上,Org2位于另一台机器上,每个组织有一个CA节点和两个Peer节点,整个应用程序代码也部署在第一台机器上(图中未标出)。这里为了简便只用了两台机器,实际中也可以根据需要将每一个节点分开部署在一台物理机上。

如果使用kafka模型的排序服务,部署就更为复杂一些,需要增加机器来部署更多的排序相关节点以保证排序服务的崩溃故障容错。

说明:本篇文章是基于我的朋友的这篇文章进行修改的:http://zhayujie.com

步骤

一、编写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 archain --ip 192.168.1.13

执行完后新机器上的新组织即可成功加入当前网络。

注: deploy/pkg中存放了所需的镜像及软件包,如果有缺失,deploy.sh脚本执行时会自行从网络下载,所以无需手动配置环境。运行部署脚本后,新增机器会默认部署一个新组织,并启动所有节点(1CA, 2peer, 2couchdb)。如果需要自定义主机中需要部署的节点,对脚本稍作调整即可。

结语

如果您认为我的文章对您有帮助,欢迎关注我的头条号「BlockChainDeveloper」。

如果您想要和我联系,后台回复「骚扰」即可获取我的联系方式。

您的支持是对我的最大的鼓励。

相关推荐

悠悠万事,吃饭为大(悠悠万事吃饭为大,什么意思)

新媒体编辑:杜岷赵蕾初审:程秀娟审核:汤小俊审签:周星...

高铁扒门事件升级版!婚宴上‘冲喜’老人团:我们抢的是社会资源

凌晨两点改方案时,突然收到婚庆团队发来的视频——胶东某酒店宴会厅,三个穿大红棉袄的中年妇女跟敢死队似的往前冲,眼瞅着就要扑到新娘的高额钻石项链上。要不是门口小伙及时阻拦,这婚礼造型团队熬了三个月的方案...

微服务架构实战:商家管理后台与sso设计,SSO客户端设计

SSO客户端设计下面通过模块merchant-security对SSO客户端安全认证部分的实现进行封装,以便各个接入SSO的客户端应用进行引用。安全认证的项目管理配置SSO客户端安全认证的项目管理使...

还在为 Spring Boot 配置类加载机制困惑?一文为你彻底解惑

在当今微服务架构盛行、项目复杂度不断攀升的开发环境下,SpringBoot作为Java后端开发的主流框架,无疑是我们手中的得力武器。然而,当我们在享受其自动配置带来的便捷时,是否曾被配置类加载...

Seata源码—6.Seata AT模式的数据源代理二

大纲1.Seata的Resource资源接口源码2.Seata数据源连接池代理的实现源码3.Client向Server发起注册RM的源码4.Client向Server注册RM时的交互源码5.数据源连接...

30分钟了解K8S(30分钟了解微积分)

微服务演进方向o面向分布式设计(Distribution):容器、微服务、API驱动的开发;o面向配置设计(Configuration):一个镜像,多个环境配置;o面向韧性设计(Resista...

SpringBoot条件化配置(@Conditional)全面解析与实战指南

一、条件化配置基础概念1.1什么是条件化配置条件化配置是Spring框架提供的一种基于特定条件来决定是否注册Bean或加载配置的机制。在SpringBoot中,这一机制通过@Conditional...

一招解决所有依赖冲突(克服依赖)

背景介绍最近遇到了这样一个问题,我们有一个jar包common-tool,作为基础工具包,被各个项目在引用。突然某一天发现日志很多报错。一看是NoSuchMethodError,意思是Dis...

你读过Mybatis的源码?说说它用到了几种设计模式

学习设计模式时,很多人都有类似的困扰——明明概念背得滚瓜烂熟,一到写代码就完全想不起来怎么用。就像学了一堆游泳技巧,却从没下过水实践,很难真正掌握。其实理解一个知识点,就像看立体模型,单角度观察总...

golang对接阿里云私有Bucket上传图片、授权访问图片

1、为什么要设置私有bucket公共读写:互联网上任何用户都可以对该Bucket内的文件进行访问,并且向该Bucket写入数据。这有可能造成您数据的外泄以及费用激增,若被人恶意写入违法信息还可...

spring中的资源的加载(spring加载原理)

最近在网上看到有人问@ContextConfiguration("classpath:/bean.xml")中除了classpath这种还有其他的写法么,看他的意思是想从本地文件...

Android资源使用(android资源文件)

Android资源管理机制在Android的开发中,需要使用到各式各样的资源,这些资源往往是一些静态资源,比如位图,颜色,布局定义,用户界面使用到的字符串,动画等。这些资源统统放在项目的res/独立子...

如何深度理解mybatis?(如何深度理解康乐服务质量管理的5个维度)

深度自定义mybatis回顾mybatis的操作的核心步骤编写核心类SqlSessionFacotryBuild进行解析配置文件深度分析解析SqlSessionFacotryBuild干的核心工作编写...

@Autowired与@Resource原理知识点详解

springIOCAOP的不多做赘述了,说下IOC:SpringIOC解决的是对象管理和对象依赖的问题,IOC容器可以理解为一个对象工厂,我们都把该对象交给工厂,工厂管理这些对象的创建以及依赖关系...

java的redis连接工具篇(java redis client)

在Java里,有不少用于连接Redis的工具,下面为你介绍一些主流的工具及其特点:JedisJedis是Redis官方推荐的Java连接工具,它提供了全面的Redis命令支持,且...