一. 部署
本次示例中,为了简化部署,仅使用一个数据中心,数据中心三台服务器,分别安装 2 个 consul server 实例,2个 consul client 实例,具体部署图如下:
其中 2个consul server 实例,128 的consul server 默认是初始 leader.129 会配置加入128。
二. 部署
1、创建目录
在 128、129、130 分别上传 consul 软件包,目录结构如下:
192.168.149.128:
192.168.149.129:
192.168.149.130:
2、上传软件包
将 从官网下载的软件包(consul_1.8.0_linux_amd64.zip)上传到上述所有服务器的bin目录,并将内容解压到 bin 目录下。
3、配置
1)将 128、129、130 consul server 和 consul client 的端口均通过防火墙
128:
consul server
- http_port=8500
- serf_lan_port =8301
- serf_wan_port=8302
- dns_port=8600
consul client
- http_port=8700
- serf_lan_port =8701
- serf_wan_port=8702
- dns_port=8703
129:
consul server
- http_port=8500
- serf_lan_port =8301
- serf_wan_port=8302
- dns_port=8600
130:
consul client
- http_port=8500
- serf_lan_port =8301
- serf_wan_port=8302
- dns_port=8600
2) consul server 配置
准备 server_start.json文件,128、129 上均部署 consul server,server_start.json的内容分别如下:
{ "datacenter": "test-datacenter1", "data_dir": "/opt/consul/consul/data/", "log_file": "/opt/consul/consul/log/", "log_level": "INFO", "bind_addr": "192.168.149.128", "client_addr": "0.0.0.0", "node_name": "consul server1", "ui": true, "server": true }
3) consul client 配置
128 上的 consul client 配置,将其直接加入到 128 上的 consul server 中。
{ "datacenter": "test-datacenter1", "data_dir": "/opt/consul/client/data/", "log_file": "/opt/consul/client/log/", "log_level": "INFO", "bind_addr": "192.168.149.128", "client_addr": "0.0.0.0", "node_name": "consul client1on128", "retry_join": ["192.168.149.128:8301"], "ports": { "dns": 8703, "http": 8700, "serf_wan": 8702, "serf_lan": 8701 } }
130 上的 consul client 配置,将其直接加入到 129 上的 consul server 中。
{ "datacenter": "test-datacenter1", "data_dir": "/opt/consul/client/data/", "log_file": "/opt/consul/client/log/", "log_level": "INFO", "bind_addr": "192.168.149.130", "client_addr": "0.0.0.0", "node_name": "consul client2 on129",
"ports": {
"dns": 8703,
"http": 8700,
"serf_wan": 8702,
"serf_lan": 8701
}, "retry_join": ["192.168.149.129:8301"] }
4、启动
1) consul server 端
128、129 consul server:
执行命令:cd /opt/consul/consul
bin/consul agent -config-dir=conf
执行结果:
上图为 128 上的启动效果图
上图为 129 上的启动效果图
发现在 128 启动结果上 其未选举出 leader; 其中 2 处是启动 129 的consul server 时,129 通过 gossip 协议 通过 128 的 8302 加入进来的,但是 3 处显示即使此时加入了 129 的 consul server,通过 raft 协议仍然未选举出 leader。
问题:
a) 现象: 两个 consul server 没有选举出 leader;
原因: server_start.properties 中缺失:bootstrap_expect 配置项;
解决办法: 在 128 的配置文件中增加该配置项:"bootstrap_expect=1",128、129 consul server 重启:
上图 为 128 consul server 结果
上图为 129 consul server 结果
b) 现象:128 在加入 129 成员时发现 8300 端口访问不通;
原因:128、129的 8300 端口都没有打开,raft 协议通过 8300 端口进行将server加入到集群中。
解决办法:通过防火墙命令打开两个服务器上的8300端口。
128、129 的 consul server 重启结果如下:
上图为 128 consul server 启动效果图
上图为 129 consul server 最终启动效果图
结果:
a) 打开 128 的 UI 界面查看
b) 打开 129 的 UI 界面查看:
结论:
1) 经过以上,第一个 consul server的最终配置需要是:
{ "datacenter": "test-datacenter1", "data_dir": "/opt/consul/consul/data/", "log_file": "/opt/consul/consul/log/", "log_level": "INFO", "bind_addr": "192.168.149.128", "client_addr": "0.0.0.0", "node_name": "consul server1", "ui": true, "server": true, "bootstrap_expect":1 }
第二个 consul server 的最终部署配置需要是:
{ "datacenter": "test-datacenter1", "data_dir": "/opt/consul/consul/data/", "log_file": "/opt/consul/consul/log/", "log_level": "INFO", "bind_addr": "192.168.149.129", "client_addr": "0.0.0.0", "node_name": "consul server2", "ui": true, "server": true, "start_join":["192.168.149.128:8301"] }
2) consul server 用到的 http_port serf_lan_portserf_wan_portdns_port aft_port 端口均要通过通过防火墙;
3) 第一个 consul server 实例必须默认存在 bootstrap_expect 配置项,值可为1;否则服务启动不了,通过web访问,会显示 500,后台日志显示:
2020-06-29T20:39:07.071+0800 [ERROR] agent.http: Request error: method=GET url=/v1/internal/ui/nodes?dc=test-datacenter1 from=192.168.149.1:54377 error="No cluster leader" 2020-06-29T20:39:18.831+0800 [ERROR] agent: Coordinate update error: error="No cluster leader"
4) 虽然有默认leader,但是在集群运行过程,会通过raft 协议 和 gossip协议检测 cosnul server 是否在线,是否运行正常,当leader 出现问题,会重新选举 leader。
2) consul client
128 启动
执行命令:cd /opt/consul/client
bin/consul agent -config-dir=conf
执行结果:
129 启动
执行命令:cd /opt/consul/client
bin/consul agent -config-dir=conf
执行结果:
以上表示成功加入 consul server,但是从日志显示,是加入到集群中的所有 consul server 中了。
结果:
a) 打开 128、129 的 UI 界面查看
从上图可以看到 两个 client 都加进来了。
三. 服务注册与发现
本次为了方便,直接在 128、130 上编写 服务的 json文件,用于 服务发现,通常情况下 服务程序会集成 consul SDK 或者使用 spring boot consul 自动注册到 所属服务器上 的consul client上。
1、web 服务定义的json文件内容如下:
{
"service": {
"name": "web",
"tags": [
"rails"
],
"port": 80
}
}
2、将 1 中定义的 web 服务json 文件放到 consul client 的 conf 目录下(即认为是默认注册的服务)。
3、使用如下命令,重新加载客户端的配置。
cd /opt/consul/client
bin/consul reload
4、结果(查看是否注册到 consul server 集群上)
128、130 的 consul client 日志上都可以看到输出内容,表示注册成功。
打开 128、129 的 consul server ui 页面,均可以注册的服务
5、问题
问题现象:在进行 reload 的时候,发现 130 服务器 的reload 失败,而 128 上一直是consul server 在输出 reload 的相关日志
原因:130128 的 consul client 配置均修改了 httpserf_lanserf_wandns 端口,而 reload 时默认就请求发送到了8500上。
解决办法:reload 时增加 -http-addr ,指定请求url