12. 多机部署

12.1. 概述

通过本文你将可以搭建起长安链多节点集群,并使用命令行工具/管理台完成长安链多机部署。

通过源码搭建长安链并且上链查数据需要以下步骤,本文将一一演示

  • 命令行创建集中式多节点链

  • 命令行创建分布式多节点链

  • 管理台创建集中式多节点链

  • 启动多节点集群

  • 使用CMC工具安装、调用、查询一个合约

  • 使用GO SDK验证合约

  • 使用管理台验证合约

12.2. 环境依赖

请查看:【快速入门】

12.3. 多机部署

部署按照PermissionedWithCert模式进行搭建

名词 说明
多机 多台机器部署同一条链
集中式 使用不同根证书在一个服务器(组织)上生成各个节点、组织、用户证书
分布式 使用不同根证书在不同服务器(组织)上生成各个节点、组织、用户证书

12.3.1. 命令行多机部署-集中式

适用于LinuxMacOS 代码部署、编译参考通过命令行搭建链

12.3.1.1. 证书生成

# 进入脚本目录
$ cd ../scripts

# 生成单链4节点集群的证书和配置
$ ./prepare.sh 4 1
begin check params...
begin generate certs, cnt: 4
input consensus type (0-SOLO,1-TBFT(default),3-HOTSTUFF,4-RAFT,5-DPOS):
input log level (DEBUG|INFO(default)|WARN|ERROR):
enable docker vm (YES|NO(default))
begin generate node1 config...
begin generate node2 config...
begin generate node3 config...
begin generate node4 config...

# 查看生成好的节点证书和配置
$ tree -L 3 ../build/
../build/
├── config
│   ├── node1
│   │   ├── certs
│   │   ├── chainconfig
│   │   ├── chainmaker.yml
│   │   └── log.yml
│   ├── node2
│   │   ├── certs
│   │   ├── chainconfig
│   │   ├── chainmaker.yml
│   │   └── log.yml
│   ├── node3
│   │   ├── certs
│   │   ├── chainconfig
│   │   ├── chainmaker.yml
│   │   └── log.yml
│   └── node4
│       ├── certs
│       ├── chainconfig
│       ├── chainmaker.yml
│       └── log.yml
├── crypto-config
│   ├── wx-org1.chainmaker.org
│   │   ├── ca
│   │   ├── node
│   │   └── user
│   ├── wx-org2.chainmaker.org
│   │   ├── ca
│   │   ├── node
│   │   └── user
│   ├── wx-org3.chainmaker.org
│   │   ├── ca
│   │   ├── node
│   │   └── user
│   └── wx-org4.chainmaker.org
│       ├── ca
│       ├── node
│       └── user
└── crypto_config.yml

12.3.1.2. 修改节点内部chainmaker.yml文件

修改build/config/nodeN中所有的chainmaker.yml 如:build\config\node1\chainmaker.yml

net:
  provider: LibP2P
  listen_addr: /ip4/0.0.0.0/tcp/11301
  seeds:
    - "/ip4/127.0.0.1/tcp/11301/p2p/QmeSqRL6N4ZB4YwYho4eBXX3YzHZbtjTh2jashqLZmSPw7"
    - "/ip4/127.0.0.1/tcp/11302/p2p/QmNwkeUaJ4153by2Uf1GDsjHw9W25B8gRjkruoMuCjAGdB"
    - "/ip4/127.0.0.1/tcp/11303/p2p/QmcTJ231F9gTwrNGK8Pm4raSZLWLD1GR7Ura8YoEdeBzMr"
    - "/ip4/127.0.0.1/tcp/11304/p2p/QmSAqwDyHDo9RqTB75ZkKiyRGh1T1onHgJdnXhQKxp79Sx"

将net.seeds下 /ip4/127.0.0.1/tcp/11301/p2p/QmeSqRL6N4ZB4YwYho4eBXX3YzHZbtjTh2jashqLZmSPw7 修改为部署机器的ip/域名和port

eg:
 - "/ip4/192.168.0.1/tcp/11301/p2p/QmeSqRL6N4ZB4YwYho4eBXX3YzHZbtjTh2jashqLZmSPw7"
 - "/dns/cm-node1.com/tcp/11301/p2p/QmeSqRL6N4ZB4YwYho4eBXX3YzHZbtjTh2jashqLZmSPw7"

12.3.1.3. 编译及安装包制作

  • 生成证书(prepare.sh脚本)后执行build_release.sh脚本,将编译chainmaker-go模块,并打包生成安装,存于路径chainmaker-go/build/release

$ ./build_release.sh
$ tree ../build/release/
../build/release/
├── chainmaker-v2.0.0-wx-org1.chainmaker.org-20210406194833-x86_64.tar.gz
├── chainmaker-v2.0.0-wx-org2.chainmaker.org-20210406194833-x86_64.tar.gz
├── chainmaker-v2.0.0-wx-org3.chainmaker.org-20210406194833-x86_64.tar.gz
├── chainmaker-v2.0.0-wx-org4.chainmaker.org-20210406194833-x86_64.tar.gz
└── crypto-config-20210406194833.tar.gz

12.3.1.4. 启动节点

  • 通过scp复制节点到部署的机器上,进入部署机器进行解压,然后启动节点内部bin目录下start.sh脚本

$ scp ./xxx.tar.gz username@ip:/路径
$ tar -zxvf xxx.tar.gz
$ cd xxx/bin && ./start.sh
  • 若需要关闭节点,在部署机器上的节点bin目录下启动stop.sh脚本:

$ ./stop.sh

12.3.1.5. 查看节点启动使用正常

  • 查看进程是否存在

$ ps -ef|grep chainmaker | grep -v grep
25261  2146  4 19:55 pts/20   00:00:01 ./chainmaker start -c ../config/wx-org1.chainmaker.org/chainmaker.yml
  • 查看端口是否监听

$ netstat -lptn | grep 1230
tcp6       0      0 :::12301                :::*                        
  • 检查节点是否有ERROR日志

# 进入节点部署的位置
$ cd /data/multiMachineDeployment/hainmaker-v2.2.1-wx-orgN.chainmaker.org
$ cat bin/panic.log
$ cat log/system.log
$ cat log/system.log |grep "ERROR\|put block\|all necessary"

12.3.2. 命令行分布式多机部署

适用于LinuxMacOS 代码部署、编译参考通过命令行搭建链

12.3.2.1. 证书生成, 修改节点内部chainmaker.yml文件

# 进入脚本目录
$ cd ../scripts
  • 执行4次证书生成操作

# 生成次单链节点集群的证书和配置
$ ./prepare.sh 1 1
begin check params...
begin generate certs, cnt: 1
input consensus type (0-SOLO,1-TBFT(default),3-HOTSTUFF,4-RAFT,5-DPOS):0
input log level (DEBUG|INFO(default)|WARN|ERROR):
enable docker vm (YES|NO(default))
begin generate node1 config...

# 移出对应的config文件
$ mv chainmaker-go/build/config /data/tmp/node1/
$ mv chainmaker-go/build/crypto_config /data/tmp/node1/
  • 进入到文件生成位置/data/tmp/,将4次文件生成的chainmaker.yml(chainmaker-go/build/config/node1)进行整理,收集各个节点下的seeds,合并成一个,修改对应的ip和port,并放置全部部署机器上

net:
  provider: LibP2P
  listen_addr: /ip4/0.0.0.0/tcp/11301
  seeds:
    - "/ip4/127.0.0.1/tcp/11301/p2p/QmeSqRL6N4ZB4YwYho4eBXX3YzHZbtjTh2jashqLZmSPw7"
    
# 修改之后    
net:
  provider: LibP2P
  listen_addr: /ip4/0.0.0.0/tcp/11301
  seeds:
    - "/ip4/192.168.0.170/tcp/11301/p2p/QmaMxoZbUaxeMSaSY5fsaUx9KFg9wJcQAcnSUxFtxGhMAv"
    - "/ip4/192.168.0.171/tcp/11302/p2p/QmVRbLmQHcPU2oWpgubespZoL1gw7Z1UktRHnTiX7ENXnD"
    - "/ip4/192.168.0.172/tcp/11303/p2p/QmSvgJ6UKJVasKZkbtu1xBnDfRPoY9wPmUWgWPY8PoSHRE"
    - "/ip4/192.168.0.173/tcp/11304/p2p/QmNcjPyjZ1jRAwEj6uZ34pZGQ5jVtUBAd6hJt99YySwcJL"

12.3.2.2. 编译及安装包制作

  • 复制之前移出的配置文件到对应的configcrypto_configchainmaker-go/build目录下

  • 执行build_release.sh脚本,将编译chainmaker-go模块,并打包生成安装,存于路径chainmaker-go/build/release

# 移出对应的config文件
$ cp -R  /data/tmp/node1/config chainmaker-go/build/config
$ cp -R  /data/tmp/node1/crypto_config chainmaker-go/build/crypto_config
# 移出对应的config文件
$ cp chainmaker-go/script
$ ./build_release.sh

$ tree -L 1 chainmaker-go/build/release
├── chainmaker-v2.2.1-wx-org.chainmaker.org
├── chainmaker-v2.2.1-wx-org.chainmaker.org-20220728121113-x86_64.tar.gz
└── crypto-config-20220728121113.tar.gz

12.3.2.3. 启动节点

  • 通过scp复制节点到各个机器上,启动节点内部bin目录下start.sh脚本

$ scp ./xxx.tar.gz username@ip:/路径
$ tar -zxvf xxx.tar.gz
$ cd xxx/bin && ./start.sh

12.3.2.4. 关闭节点

  • 若需要关闭节点,在部署机器上的节点bin目录下启动stop.sh脚本:

$ ./stop.sh

12.3.3. 管理台多机部署-集中式

12.3.3.1. 构建组织、节点、用户证书

  • 申请4个组织证书、4个节点证书、4个用户证书

12.3.3.2. 创建链

  • 新建链, 选择多机部署

12.3.3.3. 部署链

  • 对链进行下载

  • 将链部署到机器上

# 进入下载目录
$ cd download

# 同步链到部署机器上
$ scp chain1.zip root@192.168.0.170:/data/multiMachineDeployment
...

# 进入链当前目录
$ ssh root@192.168.0.170
$ cd /data/multiMachineDeployment
# 解压
$ unzip chain1.zip
# 进入当前部署机器的节点,启动当前节点
$ cd cd release/wx-org1.chainmaker.org-node1/bin/ && sh start.sh

12.4. 功能验证

为了验证所搭建的链功能是否正常,可以通过cmc命令行工具或sdk的单元测试用例来进行验证。

12.4.1. cmc命令行工具验证

请参看:【命令行工具】

12.4.2. go sdk验证

12.4.2.1. 下载go sdk源码

chainmaker-go工程同级目录,执行下面命令获取go sdk

$ git clone -b v2.2.1 https://git.chainmaker.org.cn/chainmaker/sdk-go.git

12.4.2.2. 关联证书

将通过prepare.sh工具生成的crypto-config目录,软连接到sdk-go/testdata目录

$ cd sdk-go/testdata

# 这里我们使用新生成的用户证书,请先将testdata已有的crypto-config移除
$ /bin/rm -rf crypto-config
# 软连接使用prepare.sh脚本生成的证书目录
$ ln -s ../../chainmaker-go/build/crypto-config/ .

12.4.2.3. 配置修改

修改sdk单元测试使用的配置文件:sdk-go/testdata/sdk_config.yml

根据需要修改节点地址:

    nodes:
      - # 节点地址,格式为:IP:端口:连接数
        node_addr: "127.0.0.1:12301"

如果证书路径有调整,修改对应的证书路径配置:

    # 客户端用户私钥路径
    user_key_file_path: "./testdata/crypto-config/wx-org1.chainmaker.org/user/client1/client1.tls.key
    # 客户端用户证书路径
    user_crt_file_path: "./testdata/crypto-config/wx-org1.chainmaker.org/user/client1/client1.tls.crt"
    # 客户端用户交易签名私钥路径(若未设置,将使用user_key_file_path)
    user_sign_key_file_path: "./testdata/crypto-config/wx-org1.chainmaker.org/user/client1/client1.sign.key"
    # 客户端用户交易签名证书路径(若未设置,将使用user_crt_file_path)
    user_sign_crt_file_path: "./testdata/crypto-config/wx-org1.chainmaker.org/user/client1/client1.sign.crt"

12.4.2.4. 执行存证合约example

该单测会进行存证合约的部署、调用和查询。

$ cd sdk-go/examples/user_contract_claim
$ go run main.go

看到success或OK等类似输出,说明功能验证成功。

12.4.3. 管理台验证

请查看:【管理台】

如果需要配置自拉起方式启动,请参考:【自拉起服务】