基于 docker-compose.yml 搭建
1 )docker-compose.yml 的配置
version: '3'
services:
server1:
image: consul:latest
command: "agent -server -config-file=/consul/config/consul.json -node=consul-server1 -bootstrap-expect=5"
volumes:
- ./data/server1:/consul/data
- ./config:/consul/config
networks:
- light_network
server2:
image: consul:latest
command: "agent -server -config-file=/consul/config/consul.json -node=consul-server2 -join=server1"
volumes:
- ./data/server2:/consul/data
- ./config:/consul/config
depends_on:
- server1
networks:
- light_network
server3:
image: consul:latest
command: "agent -server -config-file=/consul/config/consul.json -node=consul-server3 -join=server1"
volumes:
- ./data/server3:/consul/data
- ./config:/consul/config
depends_on:
- server1
networks:
- light_network
server4:
image: consul:latest
command: "agent -server -config-file=/consul/config/consul.json -node=consul-server4 -join=server1"
volumes:
- ./data/server4:/consul/data
- ./config:/consul/config
depends_on:
- server1
networks:
- light_network
server5:
image: consul:latest
command: "agent -server -config-file=/consul/config/consul.json -node=consul-server5 -join=server1"
volumes:
- ./data/server5:/consul/data
- ./config:/consul/config
depends_on:
- server1
networks:
- light_network
client1:
image: consul:latest
command: "agent -config-file=/consul/config/consul.json -node=consul-client1 -join=server1"
volumes:
- ./data/client1:/consul/data
- ./config:/consul/config
depends_on:
- server1
- server2
- server3
- server4
- server5
networks:
- light_network
client2:
image: consul:latest
command: "agent -config-file=/consul/config/consul.json -node=consul-client2 -join=server1"
volumes:
- ./data/client2:/consul/data
- ./config:/consul/config
depends_on:
- server1
- server2
- server3
- server4
- server5
networks:
- light_network
networks:
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 )源码地址
多数据中心配置
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 架构升级,可能一些配置会失效
- 如果需要区分客户端和服务端的配置,可以使用环境变量配置,具体不再赘述