本章通过 Hax 和 Woiden 的免费 VPS 对 Consul 集群部署进行实战。
实战环境
- Hax EU8 数据中心的 4 台 VPS (IPV6)
- Woiden EU4 数据中心的 4 台 VPS (IPV6)
- Hax 和 Woiden 分别独立部署,都是 3 个服务端节点,1个客户端节点
- 操作系统: Debian 11 x64
注意
- 请使用相同数据中心的 VPS 进行部署,跨数据中心可能导致速度很慢。
- 请不要混用 Hax 和 Woiden 进行部署,跨数据中心可能导致速度很慢。
- 不要滥用免费服务。
节点列表
本章只对 Hax 为例进行演示,Woiden 只在文末给出结果。
节点名称 | IP地址 | 说明 |
---|---|---|
server-01 | 2a01:4f8:*:1f05:1 | 服务端节点1,主节点 |
server-02 | 2a01:4f8:*:21e3:1 | 服务端节点2 |
server-03 | 2a01:4f8:*:2498:1 | 服务端节点3 |
client-01 | 2a01:4f8:*:24d5:1 | 客户端节点 |
安装 Consul
所有节点都进行安装:
验证是否安装成功:
$ consul --version
Consul v1.13.2
Revision 0e046bbb
Build Date 2022-09-20T20:30:07Z
Protocol 2 spoken by default, understands 2 to 3 (agent will automatically use protocol >2 when speaking to compatible agents)
部署服务端
部署 server-01
(主节点)
### server节点1(主节点)
# 节点名称
NODE_NAME="server-01" && \
# 数据保存目录
DATA_DIR="/var/consul/data/${NODE_NAME}" && \
# 集群中节点数量
BOOTSTRAP_EXPECT=3 && \
mkdir -p $DATA_DIR && \
consul agent -server \
-bind=[::] \
-bootstrap-expect=$BOOTSTRAP_EXPECT \
-data-dir=$DATA_DIR \
-node=$NODE_NAME
输出如下
==> Starting Consul agent...
Version: '1.13.2'
Build Date: '2022-09-20 20:30:07 +0000 UTC'
Node ID: '9aa27762-3c58-1c8d-6176-7e186d30215e'
Node name: 'server-01'
Datacenter: 'dc1' (Segment: '<all>')
Server: true (Bootstrap: false)
Client Addr: [127.0.0.1] (HTTP: 8500, HTTPS: -1, gRPC: -1, DNS: 8600)
Cluster Addr: 2a01:4f8:*:1f05:1 (LAN: 8301, WAN: 8302)
Gossip Encryption: false
Auto-Encrypt-TLS: false
HTTPS TLS: Verify Incoming: false, Verify Outgoing: false, Min Version: TLSv1_2
gRPC TLS: Verify Incoming: false, Min Version: TLSv1_2
Internal RPC TLS: Verify Incoming: false, Verify Outgoing: false (Verify Hostname: false), Min Version: TLSv1_2
部署 server-02
### server节点2
# 节点名称
NODE_NAME="server-02" && \
# 数据保存目录
DATA_DIR="/var/consul/data/${NODE_NAME}" && \
# 集群中节点数量
BOOTSTRAP_EXPECT=3 && \
mkdir -p $DATA_DIR && \
consul agent -server \
-bind=[::] \
-bootstrap-expect=$BOOTSTRAP_EXPECT \
-data-dir=$DATA_DIR \
-node=$NODE_NAME
部署 server-03
### server节点3
# 节点名称
NODE_NAME="server-03" && \
# 数据保存目录
DATA_DIR="/var/consul/data/${NODE_NAME}" && \
# 集群中节点数量
BOOTSTRAP_EXPECT=3 && \
mkdir -p $DATA_DIR && \
consul agent -server \
-bind=[::] \
-bootstrap-expect=$BOOTSTRAP_EXPECT \
-data-dir=$DATA_DIR \
-node=$NODE_NAME
部署客户端
部署 client-01
### client 节点
# 节点名称
NODE_NAME="client-01" && \
# 数据保存目录
DATA_DIR="/var/consul/data/${NODE_NAME}" && \
mkdir -p $DATA_DIR && \
consul agent \
-client=[::] \
-ui \
-bind=[::] \
-data-dir=$DATA_DIR \
-node=$NODE_NAME
加入集群
除了 server-01
之外,其它节点都需要执行。以 server-02
为例:
consul join [2a01:4f8:*:1f05:1]
Successfully joined cluster by contacting 1 nodes.
节点列表
任意节点执行:
访问 Consul Web 管理后台
对于集群而言,我们需要访问 client 节点,而不是直接访问 server 节点,同样的,对于 Consul API 的调用,也是使用 client 节点的地址。
本案例而言,我们的 client 地址是 2a01:4f8:*:24d5:1
,所以我们要访问的是 http://[2a01:4f8:*:24d5:1]:8500
。
摘要
节点列表
注册服务
下面,我们来注册一个新服务,并查看结果。
curl -X PUT 'http://[2a01:4f8:*:24d5:1]:8500/v1/agent/service/register' -H 'content-type:application/json' -d '{"Name":"axum.rs","ID":"axum.rs","Address":"127.0.0.1","Port":54321}'
可以看到,我们已经成功注册了新服务。
Woiden 部署结果
实际部署时,在同一机房(EU4
)部署了 3 台 server 节点和 1 台 client 节点;另一个机房(EU6
)部署了第 2 台 client 节点:
节点 | Woiden机房 | ip | 说明 |
---|---|---|---|
server-01 | EU4 | 2a:**:**:0b | 服务端节点1,主节点 |
server-02 | EU4 | 2a:**:**:d9 | 服务端节点2 |
server-03 | EU4 | 2a:**:**:70 | 服务端节点3 |
client-01 | EU4 | 2a:**:**:3e | 客户端节点1 |
client-02 | EU6 | 20:**:**7:1 | 客户端节点2 |
最终结果如下:
$ consul members
Node Address Status Type Build Protocol DC Partition Segment
server-01 [2a:**:**:0b]:8301 alive server 1.13.2 2 dc1 default <all>
server-02 [2a:**:**:d9]:8301 alive server 1.13.2 2 dc1 default <all>
server-03 [2a:**:**:70]:8301 alive server 1.13.2 2 dc1 default <all>
client-01 [2a:**:**:3e]:8301 alive client 1.13.2 2 dc1 default <default>
client-02 [20:**:**7:1]:8301 alive client 1.13.2 2 dc1 default <default>
结论:
client-02
和其它节点在不同的数据中心,在加入集群(consul join
)的时候,就能感觉到明显的卡顿,所以在部署集群的时候,最好不要跨数据中心,最优方案是在同一个数据中心,相互之间有内网通讯。