Tendermint多节点部署的三种方式
- 本地部署Tendermint网络
- 使用Docker在本地部署Tendermint网络
- 远程云部署Tendermint网络
本地部署Tendermint网络
1.建立host映射(在/etc/hosts文件中加入如下映射)
192.167.10.2 node0
192.167.10.3 node1
192.167.10.4 node2
192.167.10.5 node3
2.生成配置文件
使用如下命令可以一键在当前目录下生成4个节点(node0、node1、node2、node3)的配置文件:
tendermint testnet --v 4
3.修改各节点的rpc端口和p2p端口
可以将四节点的rpc端口号设置为:26657、26661、26663、26665
可以将四节点的p2p端口号设置为:26656、26659、26662、26664
4.修改配置文件中[p2p]的persistent_peers字段
persistent_peers = “f429cff611611bd0e1922b16ce9e4bdf6ca9ecba@node0:26656,804284b394087406481f0815d4597294b3432964@node1:26659,707a2791c4b100a79939d48dbd697e92529440aa@node2:26662,805178e480c0132aa1d1655b84b24d3c8a4d6ea7@node3:26664”
5.启动节点
进入mytestnet目录
分别在对应节点上运行以下命令启动节点:
tendermint start --proxy_app=kvstore --home=./node0
tendermint start --proxy_app=kvstore --home=./node1
tendermint start --proxy_app=kvstore --home=./node2
tendermint start --proxy_app=kvstore --home=./node3
使用Docker在本地部署Tendermint网络
若要使用ClevelDB可先安装ClevelDB
sudo apt-get update
sudo apt install build-essential
sudo apt-get install libsnappy-dev
wget https://github.com/google/leveldb/archive/v1.20.tar.gz && \
tar -zxvf v1.20.tar.gz && \
cd leveldb-1.20/ && \
make && \
sudo cp -r out-static/lib* out-shared/lib* /usr/local/lib/ && \
cd include/ && \
sudo cp -r leveldb /usr/local/include/ && \
sudo ldconfig && \
rm -f v1.20.tar.gz
修改配置文件,数据库后端设置为cleveldb
db_backend = “cleveldb”
build tendermint 支持cleveldb
CGO_LDFLAGS="-lsnappy" make install TENDERMINT_BUILD_OPTIONS=cleveldb
1.使用如下命令在build目录下生成tendermint二进制文件
make build-linux
2.使用如下命令建立tendermint/localnode image(此项可选择,启动网络时会自动建立docker image)
make build-docker-localnode
Makefile入门:
Makefile与Cmake的联系与区别:
Cmake是一种跨平台编译工具,比make方便
CMake是一种跨平台编译工具,比make更为高级,使用起来要方便得多。CMake主要是编写CMakeLists.txt文件,然后用cmake命令将CMakeLists.txt文件转化为make所需要的makefile文件,最后用make命令编译源码生成可执行程序或共享库
Makefile文件中的命令有一定规范,一旦该文件编写好以后在Linux命令行中执行一条make命令即可自动编译整个工程。make命令和Makefile文件:
make命令:make -C转到目录
make命令会读取makefile文件的内容,make命令会根据makefile文件来确定目标文件的创建顺序以及正确的规则调用顺序。
Makefile文件中的命令:
$(CURDIR) 是一个 GNU Make 内置的 Makefile 变量,用于获取当前工作目录的绝对路径。
定义$(MAKE)宏变量的意思是,也许我们的make需要一些参数,所以定义成一个变量比较有利于维护。两个例子意思都是先进入"subdir"目录,然后执行make命令
- 变量:$ 符号表示取变量的值
- 变量赋值:
“=”赋值
“:=”表示直接赋值,赋予当前位置的值。
"?="表示如果该变量没有被赋值,赋值予等号后面的值。
"+="和平时写代码的理解是一样的,表示将符号后面的值添加到前面的变量上 - 回显问题,Makefile中的命令都会被打印出来。如果不想打印命令部分 可以使用@去除回显
@echo "clean done!"
- 伪目标.PHONY
伪目标只是一个标签,伪目标的作用:(1)避免命令与目录下的文件名重复;(2)make的并行和递归执行过程中;(3)生成多个应用程序 - 嵌套执行Makefile
Docker知识:
- docker build
//从Dokcerfile文件建立镜像,寻找Dockerfile文件,Dockerfile是一个文本格式的配置文件,可以使用Dockerfile来快速创建自定义的镜像,包含一条条的指令。Dockerfile结构大致分为四个部分:基础镜像信息、维护者信息、构建镜像的指令信息、容器启动时执行指令信息
Dockerfile常用指令:
from:基础镜像 run:RUN command为shell命令 RUN
[“executable”, “param1”, “param2”] executable为可执行程序,param1,param2分别为参数
CMD:CMD [“executable”,“param1”,“param2”] (首选形式) CMD command param1
param2 (shell命令形式) 在Dockerfile中,只能有一条CMD指令,如果出现多个CMD命令,则只有最后一个命令会生效。
LABEL:使用LABEL指令来添加镜像的作者信息等
EXPOSE:EXPOSE [/…]
EXPOSE指令通知Docker容器在运行时监听指定的网络端口,可以指定端口的协议(TCP/UDP),如果不指定默认为TCP协议
COPY:docker默认会在上下文目录的根目录去找Dockerfile文件
ENTRYPOINT:ENTRYPOINT [“executable”, “param1”, “param2”]
ENTRYPOINT command param1 param2
Docker运行时,可以使用–entrypoint来覆盖ENTRYPOINT指令
VOLUME:[ /tendermint ]
Docker运行会在宿主机生成数据卷并挂载VOLUME指令指定的位置。
WORKDIR:/tendermint
WORKDIR指令为任意的RUN、CMD、ENTRYPOINT、ADD、COPY指令设置工作目录。如果指定的目录不存在,将会被默认创建。
2.使用Dockerfile构建项目镜像
上下文目录:发出docker build指令所在目录就是上下文目录。默认情况下,docker会在当前目录中寻找Dockerfile文件,我们也可以使用-f参数来指定Dockerfile的位置。无论Dockerfile处于什么位置,上下文目录以及子目录的所有内容都会被发送到Docker daemon中。:Z 命令是用于设置 SELinux 安全上下文的选项,它在 Docker 中用于提高容器中数据的安全性。
docker run --rm/如果容器存在的话自动移除容器
docker run -v /
docker build --tag tendermint/localnode localnode //创建docker image标签
docker-compose up //创建和开启容器
docker-compose down//停止和移除容器和网络
tendermint test命令参数:
--config /etc/tendermint/config-template.toml: 使用指定路径下的 config-template.toml 配置文件来配置 Tendermint 节点
--o .: 将生成的测试网络配置文件输出到当前目录(.)中,以便将其用于启动测试网络
--starting-ip-address 192.167.10.2: 指定测试网络的起始 IP 地址,用于为测试网络中的节点分配 IP 地址
make build-docker-localnode
执行流程如下:
(1)如果以前开启过网络,则会执行localnet-stop关闭网络,(2)然后执行build-docker-localnode,通过Docker建立网络,build-docker-localnode命令先进入networks/local目录下,然后执行make命令,makefile文件中的命令“docker build --tag tendermint/localnode localnode”(3) 通过[ -f build/node0/config/genesis.json ]判断build/node0/config/genesis.json是否存在,若不存在,执行“docker run --rm -v $(CURDIR)/build:/tendermint:Z tendermint/localnode”,用 Docker 运行一个名为 tendermint/localnode 的镜像,并将当前目录下的 build 目录挂载到容器中的 /tendermint 目录下,并设置挂载路径为可共享(shared)模式,最后启动一个新的容器来执行 tendermint/localnode 镜像中的命令。(4)执行“testnet --config /etc/tendermint/config-template.toml --o . --starting-ip-address 192.167.10.2”命令启动tendermint网络,若没有指定节点数量,默认生成4个验证节点。(5)执行“docker-compose up”创建和开启容器。首先,Docker Compose 会检查当前目录下是否存在 docker-compose.yaml 配置文件,根据配置文件创建所需的容器。
# Run a 4-node testnet locally
localnet-start: localnet-stop build-docker-localnode
@if ! [ -f build/node0/config/genesis.json ]; then docker run --rm -v $(CURDIR)/build:/tendermint:Z tendermint/localnode testnet --config /etc/tendermint/config-template.toml --o . --starting-ip-address 192.167.10.2; fi
docker-compose up
.PHONY: localnet-start
3.启动四节点网络(首先要启动docker),会在build目录下生成node0-3四个节点文件
make localnet-start
如本地部署Tendermint网络,修改相应节点配置文件中的rpc、p2p端口号和篇p2p.persistent_peers字段,配置docker-compose.yaml文件
远程云部署Tendermint网络
使用Terraform and Ansible 部署Tendermint网络
1.Install Terraform and Ansible on a Linux machine.
cleveldb部署问题:
nhl@harry:~/workspace/tendermint$ CGO_LDFLAGS="-lsnappy" make install TENDERMINT_BUILD_OPTIONS=cleveldb
CGO_ENABLED=1 go install -mod=readonly -ldflags "-X github.com/tendermint/tendermint/version.TMCoreSemVer=v0.34.24 -s -w " -trimpath -tags tendermint cleveldb ./cmd/tendermint
package cleveldb is not in GOROOT (/home/nhl/env/go/src/cleveldb)
make: *** [Makefile:69: install] Error 1
问题2:docker部署的多节点IP地址在哪里修改
问题3:tendermint-exporter具体运作逻辑?