1. 程式人生 > >搭建 consul 叢集

搭建 consul 叢集

=============================
consul 命令列工具
=============================
consul 支援 Windows/Linux 等多種平臺, 一般生產環境部署在 Linux, 下載包中僅有一個可執行程式, 所有的服務都通過命令列開啟.

D:\my_program\consul\consul_1.2.3_windows_amd64>consul
Usage: consul [--version] [--help] <command> [<args>]

Available commands are:
    agent          Runs a Consul agent
    catalog        Interact with the catalog
    connect        Interact with Consul Connect
    event          Fire a new event
    exec           Executes a 
command on Consul nodes force-leave Forces a member of the cluster to enter the "left" state info Provides debugging information for operators. intention Interact with Connect service intentions join Tell Consul agent to join cluster keygen Generates a new encryption key keyring Manages gossip layer encryption
keys kv Interact with the key-value store leave Gracefully leaves the Consul cluster and shuts down lock Execute a command holding a lock maint Controls node or service maintenance mode members Lists the members of a Consul cluster monitor Stream logs from a Consul agent operator Provides cluster-level tools
for Consul operators reload Triggers the agent to reload configuration files rtt Estimates network round trip time between nodes snapshot Saves, restores and inspects snapshots of Consul server state validate Validate config files/directories version Prints the Consul version watch Watch for changes in Consul

常用的命令有:
consul agent #開啟 server agent 或 client agent
consul reload #在不重啟本機的 agent 的情況下, 讓 agent 重新載入配置檔案.
consul members #檢視叢集中的成員節點
consul join #將指定的agent加到指定的叢集中
consul leave #將指定的agent從所屬的叢集中退出, 同時關閉該agent


--------------------------
consul agent 命令
--------------------------
consul agent 引數也有很多, 下面是一些重要引數:

-server 引數, 節點作為 server 角色, 不加該引數的話, 表明節點工作在 client 模式下.

-bootstrap-expect=<int> 引數, 表明該 datacenter 中期望的引導節點個數,當設定該引數後, consul 直到 server 數量到達該設定值後, 才會引導整個叢集,該標記不能和 bootstrap 共用, 引導節點不需要太多, 1 到 3 個就可以了.

-bootstrap 引數, 引數"-bootstrap"表示在 datacenter 中只能有一個 server 處於 bootstrap 模式並使自己成為 leader 角色, 該引數不能和 bootstrap-expect 引數公用.

-bind=<IP> 引數, 輸入本節點的IP, 該IP用於叢集內部的通訊, 叢集中所有節點都應能訪問該 IP, 預設為 0.0.0.0. 一般不需要修改. 如果有多張網絡卡的話, consul 將不允許使用 0.0.0.0, 需要我們指定一個真實的網絡卡 IP.

-node=<節點名稱>, 用來設定 agent 在叢集中的名稱, 預設為該節點的 hostname

-join=<IP>, 將節點加到指定的叢集, IP地址為叢集中其他agent的IP, 可以傳入多個 -join 引數. 預設agent啟動時不會加入任何節點, 後續需要使用 consul join 命令加入到叢集中.

-config-dir=<目錄>, 設定配置檔案目錄, 其下所有的.json 檔案都會被自動載入.

-data-dir=<目錄>, 設定 data 存放路徑, client和server類的agent都需要指定.

-client=<IP>, 引數後面接一個 ip 地址, 代表將來開放給客戶端訪問的地址, 用來提供 Http/DNS/RPC 服務, 預設是 127.0.0.1, 只執行本地訪問, 如果要開放訪問, 需要設定為 0.0.0.0

-ui 引數, 開啟預設的 Web UI

-advertise-wan=<IP>, 用於多資料中心叢集, 邊緣節點server agent需要設定一個公網IP, 這樣多個數據中心叢集可以相互通訊.

-dev 引數, 代表執行在開發模式下, 在該模式下, consul不做任何資料持久化, 非常適合做 demo.


consul除了支援命令列引數的方式外, 還支援json格式的引數, consul json 配置檔案的詳細說明, 可參考:
https://deepzz.com/post/the-consul-of-discovery-and-configure-services.html#toc_9 和 https://www.tuicool.com/articles/EzE7NfY


兩個示例:
示例1: 開啟一個server agent 的示例, 192.168.1.1 為一個Windows 機器.
consul agent -server -bootstrap-expect=1 -node=s1 -bind=192.168.1.1 -client=0.0.0.0 -data-dir=D:\consul_data -ui
說明: -bind 引數一般情況下取值為 0.0.0.0, 如果有多張網絡卡的話, consul 將不允許使用 0.0.0.0, 需要我們指定一個真實的網絡卡 IP.

示例2: 在第一個 server 啟動後, 其他 agent 啟動的時候, 可以使用 -join 引數加入到叢集中.
比如下面是在 192.168.1.200 Windows機器上, 啟動一個客戶端 agent, 並加入到上述 server 叢集中.
consul agent -node=c1 -bind=192.168.1.200 -join 192.168.1.1 -data-dir=D:\consul_data -ui

 

--------------------------
consul leave 和 join 命令
--------------------------
一個 consul agent 可以加到一個或多個consul叢集中, 如果一個agent 沒有加入到任何一個叢集中, 它將是一個孤立的節點, 也就是說它是一個孤立的叢集. 想加入一個存在的叢集, 只需要知道一個存在的節點, 這個存在的節點既可以是server類agent, 也可以是client類 agent.

consul leave -http-addr=192.168.1.11:8500
# 上面命令是將 192.168.1.11 agent 優雅地關閉, 也就是 192.168.1.11 agent將退出參與的所有叢集,
# 這個操作不需要在 192.168.1.11 本機執行. 


consul join -http-addr=192.168.1.11:8500 192.168.1.12,
# 上面命令將 192.168.1.11 agent 加到 192.168.1.12 所處的叢集中,這個操作不需要在 192.168.1.11 本機執行.


--------------------------
consul catalog 命令
--------------------------
consul catalog datacenters, 列出資料中心
consul catalog nodes , 列出節點
consul catalog nodes -service=redis ,列出指定服務的節點
consul catalog services , 列出服務

 

=============================
Windows 下的開發環境
=============================
Windows 下開發環境的命令如下, 非常簡單.

consul agent -dev -client 0.0.0.0

-dev 引數, 代表執行在開發模式下, 在該模式下, consul不做任何資料持久化.
-client 引數後面接一個 ip 地址, 代表將來開放給客戶端訪問的地址, 用來提供 Http/DNS/RPC 服務, 預設是 127.0.0.1, 只執行本地訪問, 如果要開放訪問, 需要設定為 0.0.0.0

命令執行後, consul 將監聽多個埠, 其中 8500 埠是 webUI 服務, 可以通過 http://127.0.0.1:8500 驗證 consul 執行的的情況.

 

=============================
Linux 下的開發環境
=============================
在 Linux 下, 我使用 docker 容器執行 consul, 下載次新版 1.2.3

# pull image
docker pull consul:1.2.3 

# 驗證一下版本資訊
docker run --rm consul:1.2.3 consul version

# 開啟開發模式
docker run -d      \
 --name consul_dev \
 --net=host        \
 -p 8500:8500      \
 -p 8600:8600      \
 -p 8301:8301      \
 -p 8302:8302      \
 consul:1.2.3      \
 consul agent -dev -client 0.0.0.0
 

因為是通過容器來執行, 所以需要將埠都暴露出來, 容器網路模式選用 host 模式, 並開放其他機器訪問該 consul 服務. 

 


=============================
consul 叢集
=============================
consul 叢集中至少一個 server 角色的 agent, 但顯然這個叢集本身並不是高可用架構. 正常叢集需要 3~5 個 server, 我分別在三臺虛擬機器通過 docker 容器開啟 server agent. Windows 主機工作在 client agent 模式下.

下面是叢集的規劃清單:
Linux | vm1 | server 模式 | 192.168.1.11
Linux | vm2 | server 模式 | 192.168.1.12
Linux | vm3 | server 模式 | 192.168.1.13

--------------------------
vm1 server agent 啟動
--------------------------
在 vm1 上 啟動一個server, 特別說明的為容器分配一個匿名的 volume 用來對映容器中的 /consul/data 目錄, 該目錄儲存 consul 的 data, 指令碼檔案如下:

#file: /var/lib/boot2docker/consul_vm1.sh
docker rm consul_vm1 
docker run -d      \
 --name consul_vm1 \
 --net host        \
 -p 8500:8500      \
 -p 8600:8600      \
 -p 8301:8301      \
 -p 8302:8302      \
 -v /consul/data   \
 consul:1.2.3      \
 consul agent      \
         -server                   \
         -ui                       \
         -datacenter=dc1           \
         -bootstrap-expect=1       \
         -data-dir=/consul/data    \
         -node=consul_vm1          \
         -bind=192.168.1.11        \
         -client=0.0.0.0           


通過 ui 檢查
http://192.168.1.11:8500/

 

# 通過 consul members 命令檢查:
docker run --rm consul:1.2.3 consul members -http-addr=192.168.1.11:8500   

docker run --rm consul:1.2.3 consul members
直接執行不帶引數的consul members 會報錯, 因為預設情況下, consul 會通過 127.0.0.1:8500 獲取成員清單, 而我們用的是 eth1 這個網絡卡IP 192.168.1.11啟動的consul, 所以不能用 loopback lo 網絡卡的 127.0.0.1 IP 查詢, 上面命令會報錯"tcp 127.0.0.1:8500: connect: connection refused", 需要使用下面命令查詢:


--------------------------
vm2 server agent 啟動
--------------------------
在 vm2 啟動 consul 容器的命令基本和 vm1 相同, 不同的地方有:
* 增加了 -join 引數, 加入的 vm1 的叢集中.
* 刪除了 -bootstrap-expect=1
* 修改了 對應了 -bind 引數IP
* 修改了容器名 和 consul node 名

#file: /var/lib/boot2docker/consul_vm2.sh
docker rm consul_vm2 
docker run -d      \
 --name consul_vm2 \
 --net host        \
 -p 8500:8500      \
 -p 8600:8600      \
 -p 8301:8301      \
 -p 8302:8302      \
 -v /consul/data   \
 consul:1.2.3      \
 consul agent      \
         -server                   \
         -ui                       \
         -datacenter=dc1           \ 
         -data-dir=/consul/data    \
         -node=consul_vm2          \
         -bind=192.168.1.12        \
         -client=0.0.0.0           \
         -join=192.168.1.11

 

--------------------------
vm3 server agent 啟動
--------------------------
在 vm3 啟動 consul 容器的命令基本和 vm2 相同, 除了IP和名稱不同外, 僅僅是刪除了 -join 引數, 我們將在後面通過join命令加入叢集.

#file: /var/lib/boot2docker/consul_vm3.sh
docker rm consul_vm3 
docker run -d      \
 --name consul_vm3 \
 --net host        \
 -p 8500:8500      \
 -p 8600:8600      \
 -p 8301:8301      \
 -p 8302:8302      \
 -v /consul/data   \
 consul:1.2.3      \
 consul agent      \
         -server                   \
         -ui                       \
         -datacenter=dc1           \ 
         -data-dir=/consul/data    \
         -node=consul_vm3          \
         -bind=192.168.1.13        \
         -client=0.0.0.0           \
# 手工將 192.168.1.13 agent 加到 192.168.1.12 所在的叢集中:
docker run --rm consul:1.2.3 consul join -http-addr=192.168.1.13:8500 192.168.1.12 

# 另外, 手工關閉 192.168.1.13 agent 的命令為: 
docker run --rm consul:1.2.3 consul leave -http-addr=192.168.1.13:8500

 


=============================
參考
=============================
Consul -- 分散式配置中心
https://340starobserver.github.io/2018/03/08/Consul-Cluster/

Consul 使用手冊
http://www.liangxiansen.cn/2017/04/06/consul/

consul 支援多資料中心的服務發現與配置共享工具
https://deepzz.com/post/the-consul-of-discovery-and-configure-services.html