一. 部署
本次示例中,為了簡化部署,僅使用一個數據中心,數據中心三台服務器,分別安裝 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_port\serf_wan_port\dns_port\raft_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 的相關日志
原因:130\128 的 consul client 配置均修改了 http\serf_lan\serf_wan\dns 端口,而 reload 時默認就請求發送到了8500上。
解決辦法:reload 時增加 -http-addr ,指定請求url