Hyperledger fabric应用的多机部署(自动化一键部署)

article/2025/10/30 23:31:03

前面关于fabric部署的介绍都是基于单机环境下的,实际生产环境中一般会根据应用场景将节点分开部署在多台物理机上,面临的难题主要是不同主机间的节点如何通过网络进行通信。文章最后会分享一键完成多机增加组织的自动化部署脚本。

前言

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

在这里插入图片描述

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

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

步骤

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

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

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

多机部署组织的所有脚本及配置文件位于:https://github.com/zhayujie/fabric-tools

原文链接:https://zhayujie.com/multi-host.html


http://chatgpt.dhexx.cn/article/2YkH8hY3.shtml

相关文章

Linux系统编程makefile制作动态库和静态库

目录 制作动态库 制作静态库 首先准备简单的add.c&#xff0c;sub.c,main.c,head.h.具体代码如下 #head.h文件 int Add(int a, int b); int Sub(int a, int b);#add.c文件 #include <stdio.h> int Add(int a, int b) {return a b; }#sub.c文件 #include <stdio.h&…

Linux动态库的下载与配置(以libevent库为例)

** Linux动态库的下载与配置 ** 本章以下载、安装、配置libevent库为例(安装libevent的前提是已经成功安装openssl库) 一、libevent的下载 https://libevent.org/ //官网下载源码包如果学习下载1.0版本为好&#xff0c;使用可以下载2.0版本 1.如果Linux已经进行桥接联网&am…

Linux下编译安装libusb动态库(.so) - libus1-0 vs libusb-0.1

最近在调试代码的过程中&#xff0c;发现libusb库中的一些方法没办法debug到&#xff0c;所以试着下载了一版源码&#xff0c;编译安装到指定的目录。这样&#xff0c;在工程的pro文件中&#xff0c;直接指定库和头文件的目录就可以引用自己编译的libusb库了。 在网上查了相关的…

linux编译生成动态库、静态库,以及使用

一、介绍 在实际开发过程中&#xff0c;当代码的文件较多&#xff0c;可以将一部分代码编译成动态库或者静态库然后再加载到程序中使用 编译过程 1、预编译 2、编译 3、汇编 4、链接 静态库和动态库的差异 1、链接静态库简单理解就是复制目标代码嵌入可执行文件中 2、动态库是…

Linux·libusb源码编译

libusb系列--Linux下libusb源码编译​​ ​ ​源码下载及解压​​ ​​下载源码​​ ​​解压下载的源码压缩包​​ ​​打开终端​​ ​​准备编译环境​​ ​​安装make dh-autoreconf​​ ​​安装 libudev-dev​​ sudo ​./autogen.sh​ ​​​​sudo ./configure --prefi…

ESP32如何用makefile直接编译生成.a静态库

目录 编译痛点前提环境编译准备makefile代码编译痛点 开发过esp系列的攻城狮们都知道,esp32的sdk包含了编译器、组件代码和例程代码,编译都是基于cmake的,都是整体一起编译,CMakeList.txt,component.mk,project.mk等等一系列和编译相关的文件,如果你想要自己编译一个自…

Linux 环境下的静态库生成与使用

目录 一&#xff0c;简介 二&#xff0c;如何生成静态链接库 1.准备测试程序 三&#xff0c;如何使用静态链接库 1.生成静态链接库 2.使用静态链接库 一&#xff0c;简介 这里我们只讲 Linux 环境下的静态库与动态库的生成与使用&#xff0c; Windows直接用VS直接就能生成…

Linux 下libusb编译与生成动态链接库

一、前言 上一篇文章提到了怎样使用Ubuntu 安装libusb&#xff0c;忘了如何将如何编译。 二、libusb使用GCC 编译 正常来讲&#xff0c;使用 gccc xxx.c -o xxx -I/usr/include -lusb-1.0 就可以了&#xff0c;如下图&#xff1a; 但是&#xff0c;当使用Ubuntu 12.04 使用…

关于libusb开源库的使用

关于libusb开源库的使用 文章目录 关于libusb开源库的使用1. 概述1.1 介绍1.2 用法 2. API接口2.1 分类2.2 初始化/反初始化2.3 获取设备2.4 打开/关闭设备2.5 根据ID打开设备2.6 描述符相关函数2.6.1 获得设备描述符2.6.2 获得/释放配置描述符 2.7 detach/attach驱动2.7.1 两种…

【Linux】 自动化编译工具make

目录 一&#xff1a;make工具 二&#xff1a;Makefile 三&#xff1a;Makefile基本规则 四&#xff1a;make是如何工作的 五&#xff1a;示例(五个阶段的Makefile) 5.1 第一阶段Makefile 5.2 第二阶段Makefile 5.3 第三阶段Makefile 5.4 第四阶段Makefile 5.5 第五阶…

【Linux操作系统】动态库,静态库的制作和使用,软链接、硬链接简介

目录 软硬链接咋创建一个软链接&#xff1f;咋创建一个软链接&#xff1f; 文件的三个时间动静态库制作静态库静态库的使用制作动态库动态库的使用 秃头侠们好呀&#xff0c;今天来说 软硬连接&#xff0c;动静态库 软硬链接 咋创建一个软链接&#xff1f; ln -s log.txt log…

【Linux】零基础学习动静态库打包

文章目录 一、软硬链接二、动静态库理解动静态库静态库的打包使用静态库打包Makefile编写动态库的打包使用动态库打包Makefile编写对于小版本的理解 总结 一、软硬链接 站在先前的讲过的文件系统的角度来看&#xff0c;下图test这个文件有自己独立的inode&#xff0c;在他的ino…

Linux | 动静态库 | 动静态链接 | makefile库打包 | 第三方库使用

文章目录 何为动静态库库文件的链接静态链接静态库打包动态链接动态库打包 第三方库的使用静态库的使用动态库的使用 在系统层面上的动态链接理解 何为动静态库 静态库(.a)&#xff1a;在程序编译链接时将静态库二进制码拷贝到程序代码中&#xff0c;程序运行时不再需要外部的静…

覆盖libc.so.6的惨痛教训

覆盖libc.so.6的惨痛教训 背景问题原因解决1、当前session未断开2、OS崩溃重启&#xff0c;所有ssh session断开 惨痛教训1、对于上产环境的内核依赖库文件不能随意覆盖、删除。2、 scp 文件覆盖问题 总结参考 背景 发生时间: 2022年11月28日08:55:20 偷了个懒&#xff0c;在安…

【Linux】自动生成makefile(ubuntu)

文章目录 前言一、Automake工具二、具体步骤1.下载Automake2.autoscan3.重命名configure.scan为configure.ac4.修改重命名后的configure.ac5.执行aclocal命令6.autoheader7.autoconf8.创建Makefile.am9.automake10.执行configure11.执行make12.执行Makefile编译完生成的可执行文…

【Linux】基础IO —— 下(实现动静态库)

&#x1f387;Linux&#xff1a;基础IO 博客主页&#xff1a;一起去看日落吗分享博主的在Linux中学习到的知识和遇到的问题博主的能力有限&#xff0c;出现错误希望大家不吝赐教分享给大家一句我很喜欢的话&#xff1a; 看似不起波澜的日复一日&#xff0c;一定会在某一天让你看…

【Linux】第九章 动态库和静态库(生成原理+生成和使用+动态链接)

&#x1f3c6;个人主页&#xff1a;企鹅不叫的博客 ​ &#x1f308;专栏 C语言初阶和进阶C项目Leetcode刷题初阶数据结构与算法C初阶和进阶《深入理解计算机操作系统》《高质量C/C编程》Linux ⭐️ 博主码云gitee链接&#xff1a;代码仓库地址 ⚡若有帮助可以【关注点赞收藏】…

Linux——自动化编译(make的使用)、库文件(静态库和共享库的使用)

一、make的使用&#xff08;自动化编译&#xff09; make是Linux上的工程管理工具&#xff0c;可以实现自动化编译&#xff1b;make可以提高我们的编译效率。 1.安装make 命令&#xff1a;sudo apt install make 2.make的用法 &#xff08;1&#xff09;创建makefile文件&am…

rpc系列-ZooKeeper

一.简介 Zookeeper是一个分布式协调服务&#xff0c;就是为用户的分布式应用程序提供协调服务。 Zookeeper本身就是一个分布式程序&#xff08;只要有半数以上节点存活&#xff0c;zk就能正常服务&#xff09;。 Zookeeper所提供的服务涵盖&#xff1a;主从协调、服务器节点…

HBase 一文读懂

本文基于《尚硅谷大数据技术之HBase》编写。 HBase 简介 HBase定义 HBase是一种分布式、可扩展、支持海量数据存储的NoSQL数据库。 HBase数据模型 HBase的数据模型同关系型数据库&#xff08;RDMS&#xff09;很类似&#xff0c;数据存储在一张表中&#xff0c;有行有列。但从H…