基于 docker-compose.yml 搭建
1 )docker-compose.yml 的配置
version: '3'
services:server1:image: consul:latestcommand: "agent -server -config-file=/consul/config/consul.json -node=consul-server1 -bootstrap-expect=5"volumes:- ./data/server1:/consul/data- ./config:/consul/confignetworks:- light_networkserver2:image: consul:latestcommand: "agent -server -config-file=/consul/config/consul.json -node=consul-server2 -join=server1"volumes:- ./data/server2:/consul/data- ./config:/consul/configdepends_on:- server1networks:- light_networkserver3:image: consul:latestcommand: "agent -server -config-file=/consul/config/consul.json -node=consul-server3 -join=server1"volumes:- ./data/server3:/consul/data- ./config:/consul/configdepends_on:- server1networks:- light_networkserver4:image: consul:latestcommand: "agent -server -config-file=/consul/config/consul.json -node=consul-server4 -join=server1"volumes:- ./data/server4:/consul/data- ./config:/consul/configdepends_on:- server1networks:- light_networkserver5:image: consul:latestcommand: "agent -server -config-file=/consul/config/consul.json -node=consul-server5 -join=server1"volumes:- ./data/server5:/consul/data- ./config:/consul/configdepends_on:- server1networks:- light_networkclient1:image: consul:latestcommand: "agent -config-file=/consul/config/consul.json -node=consul-client1 -join=server1"volumes:- ./data/client1:/consul/data- ./config:/consul/configdepends_on:- server1- server2- server3- server4- server5networks:- light_networkclient2:image: consul:latestcommand: "agent -config-file=/consul/config/consul.json -node=consul-client2 -join=server1"volumes:- ./data/client2:/consul/data- ./config:/consul/configdepends_on:- server1- server2- server3- server4- server5networks:- light_networknetworks:light_network:external: true
- 这里是简洁版的,最快搭建方式,这里创建了5台服务器,2台客户端
- 这里挂载了consul 的数据,暂且忽略日志的配置,给consul 配置意义不是很大
- 相关data目录的创建,可以再 server1 下使用命令来创建,这里省略了配置
- 之后,2台客户端可以在nginx上配置一个负载均衡来提供一个统一的地址
- 这里不暴露接口,是因为假设有一个nginx集群也在网络之内,基于nginx来暴露
- 这里共用配置文件,但数据文件,每个都独立
- 网络也是,基于 light_network,也是提前创建的,这里不再赘述
2 )consul.json
{ "datacenter": "x-project-dc1","data_dir": "/consul/data","log_level": "INFO","client_addr": "0.0.0.0","bind_addr": "0.0.0.0","ui": true
}
- 这里定义了 datacenter, 定义了服务端和客户端通用的配置
- 不同的配置,都写在 command 配置中
- 注意,服务端和客户端使用同一个 datacenter,否则将会出现错误
3 )运行起来并查看
- $
docker compose up -d
- $
docker compose ps -a
- 如果 之前在同一个网络,或已打通的网络中已经配置了 两个客户端的nginx代理负载,假设暴露的是 8500
- 那么访问 localhost:8500 即可访问
- 这时候,单个的数据中心已经搭建完毕
- 其他配置方案,不再举例,最终达成目的即可
4 )查看具体成员信息
-
docker exec -it consul-client1-1 consul members
Node Address Status Type Build Protocol DC Partition Segment consul-server1 172.28.0.2:8301 alive server 1.11.1 2 x-project-dc1 default <all> consul-server2 172.28.0.3:8301 alive server 1.11.1 2 x-project-dc1 default <all> consul-server3 172.28.0.5:8301 alive server 1.11.1 2 x-project-dc1 default <all> consul-server4 172.28.0.4:8301 alive server 1.11.1 2 x-project-dc1 default <all> consul-server5 172.28.0.6:8301 alive server 1.11.1 2 x-project-dc1 default <all> consul-client1 172.28.0.7:8301 alive client 1.11.1 2 x-project-dc1 default <default> consul-client2 172.28.0.8:8301 alive client 1.11.1 2 x-project-dc1 default <default>
-
这时候,可以看到 5台 server, 2台 client
5 )源码地址
- https://github.com/cluster-deploy/cluster-consul
多数据中心配置
1 ) 概述
-
为了实现跨数据中心的通信和复制,您需要配置Consul的WAN Gossip层
-
这通常涉及到设置gossip_wan相关的配置项
-
然而,在单机部署的场景下,通常不需要显式配置WAN Gossip层
-
因为每个数据中心内部只有一个Consul服务器节点
-
但如果您计划将来扩展集群或连接多个数据中心,则需要配置WAN Gossip层
-
对于当前的两台机器和单机部署的场景,每台机器上的Consul实例已经是其数据中心内的唯一服务器节点,因此它们不会通过WAN Gossip层进行通信
-
但如果未来您想要连接这两个数据中心,您需要在每个Consul的配置文件中添加WAN Gossip相关的配置
-
例如指定WAN Gossip的地址列表(gossip_wan)和WAN Gossip的端口(默认为8302)
-
如果您将来想要连接dc1和dc2,您可能需要 dc1 的 server.json 中添加类似以下的配置
"gossip_wan": { "address": "机器A的WAN IP地址", "port": 8302 }, "retry_join_wan": ["机器B的WAN IP地址"]
-
同样的,并在 dc2 的 server.json 中添加指向dc1的配置,这里不再赘述
-
注意,上述配置中的“WAN IP地址”指的是机器在广域网中可访问的IP地址
-
在实际环境中,您需要根据网络架构和安全性要求来配置这些地址
2 )关于 server.json 与 client.json 中的多数据中心配置
-
在多数据中心的Consul配置中,client和server的配置会有所不同,具体取决于它们在架构中的角色和功能。
-
对于server节点,配置gossip_wan和retry_join_wan通常是必要的。
- gossip_wan用于配置WAN(广域网)Gossip池,这是跨数据中心之间通信的关键部分
- 它确保数据中心之间的Consul服务器能够相互发现和通信。retry_join_wan则用于指定在WAN环境中尝试加入的Consul服务器地址列表,以及在首次尝试失败时进行重试
-
然而,对于client节点,情况可能有所不同
- Client节点通常不需要跨数据中心通信,它们主要与本地数据中心的server节点通信
- 因此,在大多数情况下,client节点不需要配置gossip_wan和retry_join_wan
- 它们主要关注与本地server节点的连接和注册服务
-
注意,具体的配置取决于你的网络架构和需求
- 在某些特殊情况下,你可能需要在client节点上启用某些跨数据中心的通信功能
- 这时,你可能需要相应地配置gossip_wan和retry_join_wan
-
总之,是否需要在client和server上配置gossip_wan和retry_join_wan取决于你的具体需求和架构
-
在大多数情况下,server节点需要这些配置来确保跨数据中心的通信,而client节点则主要关注与本地server节点的通信
3 ) 具体配置示例
{"datacenter": "my-datacenter","data_dir": "/consul/data","log_level": "INFO","node_meta": {"role": "production"},"server": true"ui": true,"telemetry": { "prometheus_retention_time": "30d", "disable_hostname": true }, "gossip_config": { "name": "wan", "bind": "0.0.0.0", "port": 8302, "probe_interval": "10s", "probe_timeout": "5s", "suspicion_mult": 7, "gossip_interval": "1s", "udp_flood_interval": "100ms", "encrypt": "", // 这里可以放置gossip的加密密钥,如果启用了加密的话 "tls": { "enabled": false, "ca_file": "", "ca_path": "", "cert_file": "", "key_file": "", "verify_incoming": false, "verify_outgoing": false } }, "retry_join_wan": [ "provider=aws tag_key=ConsulCluster tag_value=production", "192.168.1.10", "192.168.1.11", "192.168.1.12" ], "retry_interval_wan": "30s", "retry_max_wan": 3
}
- 上述示例仅供参考,随着 consul 架构升级,可能一些配置会失效
- 如果需要区分客户端和服务端的配置,可以使用环境变量配置,具体不再赘述