基于docker-compose部署tendermint多节点集群

一.我们可以通过 docker-compose 来启动多个 container
通过官方文档我们知道启动 tendermint 集群需要下面几个步骤:

  • 每个 node 都需要通过 tendermint init 来进行初始化;
  • 需要有一个包含所有 validator 节点 public key 的 genesis.json 文件, 然后用这个文件覆盖所有节点对应的文件; 在我们的示例中所有的节点都是 validator 节点;
  • 通过 tendermint show_node_id 获取节点的 ID, 并通过参数 --p2p.persistent_peers=ID1@node1:46656,ID2@node2:46656 来传入种子 peer;

对应于上面环境准备需要做的工作, 我通过脚本文件 ./init_data.sh 做了自动化的处理:

node_cnt=4
tendermint_img="tendermint/tendermint:latest"

is_osx () {
    [[ "$OSTYPE" =~ ^darwin ]] || return 1
}

init() {
    SED=sed
    if [[ "$OSTYPE" =~ ^darwin ]]; then
        SED=gsed
        if ! which gsed &> /dev/zero ; then
            brew install gnu-sed
        fi

        if ! which jq &> /dev/zero; then
            brew install jq
        fi
    else
        if ! which jq &> /dev/zero; then
            sudo apt-get install jq -y
        fi
    fi

    if is_osx; then
        rm -rf *data
    else
        sudo rm -rf *data
    fi
}
init

default_genesis="./node1_data/config/genesis.json"

for (( i = 1; i <= $node_cnt; i++ )); do
    if ! is_osx; then
        mkdir -p node${i}_data
        chmod 777 node${i}_data
    fi

    docker run --rm -v `pwd`/node${i}_data:/tendermint $tendermint_img init

    if ! is_osx; then
        sudo chmod -R 777 node${i}_data
    fi

    node_id=$(docker run --rm -v `pwd`/node${i}_data:/tendermint $tendermint_img show_node_id)
    echo "Node$i ID: $node_id"
    $SED -i "s/[0-9a-f]\{40\}@tm_node$i/$node_id@tm_node$i/g" ./docker-compose.yml

    if [[ $i != 1 ]]; then
        echo $(cat $default_genesis | jq ".validators |= .+ $(cat node${i}_data/config/genesis.json | jq '.validators')") > $default_genesis
    fi

    echo $(cat $default_genesis | jq ".validators[$i-1].name = \"tm_node$i\" ") > $default_genesis
done

for (( i = 2; i <= $node_cnt; i++ )); do
    cp -f $default_genesis ./node${i}_data/config/genesis.json
done

其中打印出来的节点 ID 会在后面的 docker-compose.yml 文件中用到。然后我们就可以通过 docker-compose.yml 启动多个 container 了, 这里我们启动四个节点,注意tendermint的端口设置:
1)26658
#TCP or UNIX socket address of the ABCI application, for the name of an ABCI application compiled in with the Tendermint binary
proxy_app = "tcp://127.0.0.1:26658”
2)26657
TCP or UNIX socket address for the RPC server to listen on laddr = "tcp://0.0.0.0:26657”
3)26656
Address to listen for incoming connections
#侦听外部节点传入连接的地址
laddr = “tcp://0.0.0.0:26656”

version: '2.0'

services:

  tm_node1:
    image: tendermint/tendermint:latest
    container_name: tm_node1
    hostname: tm_node1
    tty: true
    extends:
      file:  base/docker-compose-base.yaml
      service: tm_node1
    extra_hosts:
      - "tm_node4:192.168.5.60"
      - "tm_node3:192.168.5.57"
      - "tm_node2:192.168.5.58"
      - "tm_node5:192.168.5.61"
      - "tm_node6:192.168.5.62"
      - "tm_node7:192.168.5.63"
      - "tm_node8:192.168.5.66"
    ports:
      - 26667:26657
      - 26656:26656
     volumes:
      - ./node1_data:/tendermint
    entrypoint: ["sh", "-c", "tendermint node --p2p.persistent_peers=857d0e11e916436e7c74e2bdd863195c4e1c135b@192.168.5.58:26656,ee4841fc73b0038fcd3c8c8346630757d6bc868f@192.168.5.57:26656,e0c4a27bba185d915564137250cad8111968d2ac@192.168.5.60:26656,14bdb70f2338244c4d3326bf0e44d04e0686f6b6@192.168.5.61:26656,8d11f90100babec7819ee7a22d9b6e9063af98cf@192.168.5.62:26656,4f21d70f5c020fdfdb30a329916436863313932e@192.168.5.63:26656,18de7bcf7295baddc684de13840970850f77b3e9@192.168.5.66:26656 --moniker=`hostname` --proxy_app=persistent_kvstore --consensus.create_empty_blocks=false"]

接下来我们就可以通过下面的步骤来启动有四个节点的 tendermint 集群:

./init_data.sh

在这里插入图片描述
用上面脚本的输出的节点 ID 分别去替换 docker-compose.yml 文件中的节点 ID

docker-compose up -d

在这里插入图片描述
用docker ps查看容器内的信息
在这里插入图片描述
成功启动之后我们可以通过 curl -s localhost:26667/net_info 中的结果来判断两个节点有没有相互识别。也可用CONTAINER ID查看登陆日志

在这里插入图片描述```
docker logs a6c2b0220899



![在这里插入图片描述](https://img-blog.csdnimg.cn/20181129165509141.png)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以通过以下步骤使用docker-compose部署Ceph集群: 1. 创建一个新的文件夹,用于存docker-compose文件和Ceph配置文件。 2. 在该文件夹中创建一个名为`docker-compose.yml`的文件,并添加以下内容: ```yaml version: '3' services: mon: image: ceph/daemon:latest container_name: ceph-mon command: mon environment: - MON_IP=<mon_IP> - CEPH_PUBLIC_NETWORK=<public_network> volumes: - ./ceph:/etc/ceph networks: - ceph-net osd: image: ceph/daemon:latest container_name: ceph-osd command: osd privileged: true environment: - OSD_DEVICE=/dev/sdb - OSD_TYPE=disk - OSD_FORCE_ZAP=1 volumes: - /dev:/dev - ./ceph:/etc/ceph networks: - ceph-net networks: ceph-net: ``` 请确保将`<mon_IP>`替换为mon节点的IP地址,并将`<public_network>`替换为Ceph集群的公共网络CIDR。 3. 在该文件夹中创建一个名为`ceph.conf`的文件,并添加以下内容: ``` [global] fsid = $(uuidgen) mon_initial_members = mon mon_host = <mon_IP> auth_cluster_required = cephx auth_service_required = cephx auth_client_required = cephx [mon] log file = /var/log/ceph/ceph-mon.log chdir = "" [osd] log file = /var/log/ceph/ceph-osd.log chdir = "" osd_journal_size = 100 ``` 请确保将`<mon_IP>`替换为mon节点的IP地址。 4. 在终端中导航到该文件夹,并运行以下命令来启动Ceph集群: ``` docker-compose up -d ``` 这将使用docker-compose启动一个名为`ceph-mon`的容器作为mon节点,以及一个名为`ceph-osd`的容器作为osd节点。 5. 确保Ceph集群已成功启动,可以使用以下命令来检查: ``` docker exec -it ceph-mon ceph -s ``` 这将显示Ceph集群的状态信息。 以上是使用docker-compose部署Ceph集群的基本步骤。你可以根据自己的需求进行自定义配置和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值