Consul 學習筆記(二)之生產環境部署


一. 部署

    本次示例中,為了簡化部署,僅使用一個數據中心,數據中心三台服務器,分別安裝 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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM