【区块链】HyperLedger Besu Docker异地组网(续)

最近有些朋友私信我,说之前《【区块链】HyperLedger Besu Docker异地组网》中提到使用docker swarm 可以进行异地组网,但实际上在公网层面无法实现。嗯…的确之前我没有说清楚,其实在我实施的过程中还是遇到了比较多的问题的,譬如:

  1. 国内三大网络运营商对于公网接入会有不同的网络策略;
  2. docker 的 vxlan 网络虚拟化技术的局限性;
  3. 服务器端口开放规划问题;

既然大家问到了,那我将简单说一下可能遇到的情况以及如何解决。

首先,在 Hyperledger Besu(以下简称“Besu”) 中节点之间是通过 P2P 对等网络进行通讯的,这个我们可以通过 toml 文件看到,如下图:

bootnodes=["enode://[email protected]:30303","enode://[email protected]:30303"]

这里将告诉节点服务 enode 地址(区块链网络地址),ip 和端口。
其中 ip 就有学问了,如果你或你的企业舍得花钱拉一条专线,那么按照 docker swarm 配置即可,这里的 ip 也是 overlay 网络内部地址。但是这种情况下你的区块链就只能是私有链了,都说是“专线”嘛,只能通过特殊路由配置进行接收和转发,一般人并不能够随意接入。
如果你需要做成联盟链或者公链,这里就不能使用 docker swarm 的overlay网络。这里是跟上面说到的三大网络运营商的公网接入策略不同有关(这里不能说太细不然又不能发了),改为 host 网络吧,然后将这里的 ip 设置为公网 ip 就可以了。
最后来到 30303 这个端口的问题了,这个端口使用的并不是 TCP 协议而是 UDP 协议的。在开放端口的时候就要注意了。很多时候大家下意识会认为端口开放 TCP就可以了,但是我们使用的 Besu 区块链是 ETH1.0 区块链,PoA共识下执行一次上链操作需要节点之间多次且快速的通讯来确保“三相共识”的完整,这就需要使用 UDP 的快速通讯特性了,因此记得在防火墙中将这个端口的准入设置为 UDP。

那么有的小伙伴也许会说“我使用了 host 模式某些端口会跟其他应用冲突怎么办?”,不用怕 Besu 有提供端口修改的参数,稍微修改一下就可以了如下图:

docker run \
-e JAVA_OPTS=' -Xms1g -Xmx1g -XX:ParallelGCThreads=10 -XX:MaxTenuringThreshold=10 -XX:+DisableExplicitGC -XX:SoftRefLRUPolicyMSPerMB=0 -XX:-ReduceInitialCardMarks -XX:+ExplicitGCInvokesConcurrent -XX:+ScavengeBeforeFullGC -XX:+UseG1GC -XX:+UseCompressedOops -XX:+UseCompressedClassPointers -XX:+SegmentedCodeCache -XX:ReservedCodeCacheSize=512m' \
-e BESU_RPC_HTTP_PORT=$hp \
-e BESU_P2P_PORT=$p2p \
-e BESU_RPC_WS_PORT=$ws \
--name $custom_folder$i \
--restart always \
--network=host \
-v $target_folder:/var/lib/besu \
-d $docker_image \
--config-file=/var/lib/besu/ibft_config.toml

如上面所示,可以通过“-e BESU_RPC_HTTP_PORT”、“-e BESU_P2P_PORT”、“-e BESU_RPC_WS_PORT”来指定对应的端口号。譬如,我现在不能使用 30303 端口了,那么我就要写成“-e BESU_P2P_PORT=30305”,然后在 enode 里面也要将对应的节点端口改为 30305 即可。

以上的都是自建机房然后自己搭建的情况,如果是云服务的情况呢?
其实云服务的情况下最好的就是购买对应运营商的区块链产品,省下不少麻烦。首先在部署层面,云服务供应商基本上是不允许部署 docker swarm 网络的。要使用 docker swarm 网络是需要同时开启以下端口:

  • 2377(TCP):用于集群管理通信。在 swarm manager 节点上监听此端口,其他节点连接到该端口以加入 swarm 集群;
  • 4789(UDP):用于 overlay 网络的隧道通信。这个端口用于 overlay 网络中的容器之间的数据传输;
  • 7946(TCP/UDP):用于节点之间的通信。这些端口用于节点之间的 overlay 网络通信,包括跨节点的服务发现和容器间的通信;

而这个 4789 的 UDP 端口有点特殊,他是 vxlan 的标准端口。目前几乎所有的云服务器都不会开放这个端口的,因此注定docker swarm 无法在云服务上部署。但有些博主说可以尝试使用“-data-path-port uint32”参数来转移 docker 的 4789 端口,我不知道是不是我的做法不对,反正我没有成功过。
那云服务上就不能部署了吗?可以部署,用 host 模式且节点都在同一家云服务供应商的前提下是可以部署且速度还挺快的。但是跨云服务就不清楚了…
但随之而来的又是一个新问题了,如下图:
WechatIMG699.png
这…这真的没有办法了,如果真的有小伙伴需要在云服务上部署还是先咨询一下云服务供应商,做好调研之后再行动会比较好。

其实总的来说,如果要走云服务,那么要不就购买产品要不就先咨询再行动。如果是自建机房或者自己家里面玩玩那问题不大,留意一下端口开放和公网接入策略基本上就没有问题了。不是专线的情况下还是走 host 模式吧,至于网络不太好的小伙伴就不太建议尝试了,这个技术稍微了解一下就好。

猜你喜欢

转载自blog.csdn.net/kida_yuan/article/details/131165706