1、安裝
1.1、下載
以linux下安裝爲例,首先下載安裝包,下載地址:https://www.consul.io/downloads.html
下載後上傳到linux服務器,或者直接在linux上下載,版本可自行替換
wget https://releases.hashicorp.com/consul/1.7.0/consul_1.7.0_linux_amd64.zip
1.2、解壓縮
unzip consul_1.7.0_linux_amd64.zip -d /usr/local/bin
1.3、設置環境變量
筆者已經將/usr/local/bin目錄設置到環境變量中,如果你還沒有設置環境變量,需要設置下
$ vi /etc/profile
export CONSUL_HOME=/usr/local/bin/consul
export PATH=$PATH:CONSUL_HOME
使用環境變量配置生效
source /etc/profile
1.4、驗證
查看consul版本,驗證是否安裝成功
[root@localhost ~]# consul version
Consul v1.7.0
Protocol 2 spoken by default, understands 2 to 3 (agent will automatically use protocol >2 when speaking to compatible agents)
2、運行
2.1、agent啓動參數說明
consul以agent的方式啓動,相關參數說明:
- -server 以服務端模式運行,相應的還有客戶端模式-client
- -ui 啓動內置的Web UI
- -bootstrap-expect=3 集羣最少節點數,類似zookeeper的配置一樣,爲了防止腦裂,一般爲奇數
- -data-dir=/data/consul 數據存儲目錄
- -node=agent-1 集羣的節點名稱
- -client=0.0.0.0 指定客戶端能訪問的ip,類似於ip白名單。0.0.0.0表示不限制
- -bind=10.25.84.163 綁定了當前主機的IP地址
- -datacenter=dc1 數據中心名稱
- -join agent啓動時加入到代理服務器地址,不指定不會加入任何節點,可以在啓動後通過
consul join
命令加入
更多參數說明可以通過–help查看
consul agent --help
或者參考官網配置說明:https://www.consul.io/docs/agent/options.html
2.2、啓動agent
接下來搭建consul集羣,首先準備三臺服務器:
- 10.25.84.163
- 10.25.84.164
- 10.25.84.165
分別在三臺服務器輸入以下對應的命令:
// 啓動10.25.84.163
consul agent -server -ui -bootstrap-expect=3 -data-dir=/data/consul -node=server-1 -client=0.0.0.0 -bind=10.25.84.163 -datacenter=dc1
// 啓動10.25.84.164,並加入10.25.84.163節點
consul agent -server -ui -bootstrap-expect=3 -data-dir=/data/consul -node=server-2 -client=0.0.0.0 -bind=10.25.84.164 -datacenter=dc1 -join 10.25.84.163
// 啓動10.25.84.165,並加入10.25.84.163節點
consul agent -server -ui -bootstrap-expect=3 -data-dir=/data/consul -node=server-3 -client=0.0.0.0 -bind=10.25.84.165 -datacenter=dc1 -join 10.25.84.163
啓動日誌:
[root@localhost ~]# consul agent -server -ui -bootstrap-expect=3 -data-dir=/data/consul -node=server-1 -client=0.0.0.0 -bind=10.25.84.163 -datacenter=dc1
bootstrap_expect > 0: expecting 3 servers
==> Starting Consul agent...
Version: 'v1.7.0'
Node ID: '4a60c9bd-472b-01a3-57f4-c74b8ba4d3df'
Node name: 'server-1'
Datacenter: 'dc1' (Segment: '<all>')
Server: true (Bootstrap: false)
Client Addr: [0.0.0.0] (HTTP: 8500, HTTPS: -1, gRPC: -1, DNS: 8600)
Cluster Addr: 10.25.84.163 (LAN: 8301, WAN: 8302)
Encrypt: Gossip: false, TLS-Outgoing: false, TLS-Incoming: false, Auto-Encrypt-TLS: false
==> Log data will now stream in as it occurs:
2020-02-21T11:28:20.323+0800 [INFO] agent.server.raft: initial configuration: index=0 servers=[]
2020-02-21T11:28:20.324+0800 [INFO] agent.server.raft: entering follower state: follower="Node at 10.25.84.163:8300 [Follower]" leader=
2020-02-21T11:28:20.325+0800 [INFO] agent.server.serf.wan: serf: EventMemberJoin: server-1.dc1 10.25.84.163
2020-02-21T11:28:20.326+0800 [INFO] agent.server.serf.lan: serf: EventMemberJoin: server-1 10.25.84.163
2020-02-21T11:28:20.326+0800 [INFO] agent.server: Adding LAN server: server="server-1 (Addr: tcp/10.25.84.163:8300) (DC: dc1)"
2020-02-21T11:28:20.326+0800 [INFO] agent.server: Handled event for server in area: event=member-join server=server-1.dc1 area=wan
2020-02-21T11:28:20.327+0800 [INFO] agent: Started DNS server: address=0.0.0.0:8600 network=tcp
2020-02-21T11:28:20.327+0800 [INFO] agent: Started DNS server: address=0.0.0.0:8600 network=udp
2020-02-21T11:28:20.328+0800 [INFO] agent: Started HTTP server: address=[::]:8500 network=tcp
2020-02-21T11:28:20.328+0800 [INFO] agent: started state syncer
==> Consul agent running!
2020-02-21T11:28:26.317+0800 [WARN] agent.server.raft: no known peers, aborting election
2020-02-21T11:28:27.447+0800 [ERROR] agent.anti_entropy: failed to sync remote state: error="No cluster leader"
2020-02-21T11:28:34.785+0800 [ERROR] agent.http: Request error: method=GET url=/v1/internal/ui/services?dc=dc1&index=10249 from=10.113.116.192:3000 error="No cluster leader"
2020-02-21T11:28:34.965+0800 [ERROR] agent.http: Request error: method=GET url=/v1/internal/ui/nodes?dc=dc1&index=10249 from=10.113.116.192:3001 error="No cluster leader"
2020-02-21T11:28:45.387+0800 [ERROR] agent: Coordinate update error: error="No cluster leader"
2020-02-21T11:28:59.448+0800 [ERROR] agent.anti_entropy: failed to sync remote state: error="No cluster leader"
2020-02-21T11:29:02.697+0800 [INFO] agent.server.serf.lan: serf: EventMemberJoin: server-2 10.25.84.164
2020-02-21T11:29:02.697+0800 [INFO] agent.server: Adding LAN server: server="server-2 (Addr: tcp/10.25.84.164:8300) (DC: dc1)"
2020-02-21T11:29:02.698+0800 [INFO] agent.server.serf.wan: serf: EventMemberJoin: server-2.dc1 10.25.84.164
2020-02-21T11:29:02.698+0800 [INFO] agent.server: Handled event for server in area: event=member-join server=server-2.dc1 area=wan
2020-02-21T11:29:19.312+0800 [ERROR] agent: Coordinate update error: error="No cluster leader"
2020-02-21T11:29:21.261+0800 [INFO] agent.server.serf.lan: serf: EventMemberJoin: server-3 10.25.84.165
2020-02-21T11:29:21.261+0800 [INFO] agent.server: Adding LAN server: server="server-3 (Addr: tcp/10.25.84.165:8300) (DC: dc1)"
2020-02-21T11:29:21.269+0800 [INFO] agent.server: Found expected number of peers, attempting bootstrap: peers=10.25.84.163:8300,10.25.84.164:8300,10.25.84.165:8300
2020-02-21T11:29:21.281+0800 [INFO] agent.server.serf.wan: serf: EventMemberJoin: server-3.dc1 10.25.84.165
2020-02-21T11:29:21.281+0800 [INFO] agent.server: Handled event for server in area: event=member-join server=server-3.dc1 area=wan
2020-02-21T11:29:24.003+0800 [ERROR] agent.anti_entropy: failed to sync remote state: error="No cluster leader"
2020-02-21T11:29:27.329+0800 [WARN] agent.server.raft: heartbeat timeout reached, starting election: last-leader=
2020-02-21T11:29:27.329+0800 [INFO] agent.server.raft: entering candidate state: node="Node at 10.25.84.163:8300 [Candidate]" term=2
2020-02-21T11:29:27.351+0800 [INFO] agent.server.raft: election won: tally=2
2020-02-21T11:29:27.351+0800 [INFO] agent.server.raft: entering leader state: leader="Node at 10.25.84.163:8300 [Leader]"
2020-02-21T11:29:27.351+0800 [INFO] agent.server.raft: added peer, starting replication: peer=b3d84299-a458-19bf-2b98-ca9031e6aea4
2020-02-21T11:29:27.351+0800 [INFO] agent.server.raft: added peer, starting replication: peer=31174405-571f-f598-ef74-0a9aba59a6a8
2020-02-21T11:29:27.351+0800 [INFO] agent.server: cluster leadership acquired
2020-02-21T11:29:27.351+0800 [INFO] agent.server: New leader elected: payload=server-1
2020-02-21T11:29:27.352+0800 [INFO] agent.server.raft: pipelining replication: peer="{Voter 31174405-571f-f598-ef74-0a9aba59a6a8 10.25.84.165:8300}"
2020-02-21T11:29:27.352+0800 [WARN] agent.server.raft: appendEntries rejected, sending older logs: peer="{Voter b3d84299-a458-19bf-2b98-ca9031e6aea4 10.25.84.164:8300}" next=1
2020-02-21T11:29:27.356+0800 [INFO] agent.server.raft: pipelining replication: peer="{Voter b3d84299-a458-19bf-2b98-ca9031e6aea4 10.25.84.164:8300}"
2020-02-21T11:29:27.368+0800 [INFO] agent.leader: started routine: routine="CA root pruning"
2020-02-21T11:29:27.368+0800 [INFO] agent.server: member joined, marking health alive: member=server-1
2020-02-21T11:29:27.381+0800 [INFO] agent.server: member joined, marking health alive: member=server-2
2020-02-21T11:29:27.396+0800 [INFO] agent.server: member joined, marking health alive: member=server-3
2020-02-21T11:29:28.609+0800 [INFO] agent: Synced node info
查看集羣啓動結果:
[root@localhost ~]# consul members
Node Address Status Type Build Protocol DC Segment
server-1 10.25.84.163:8301 alive server 1.7.0 2 dc1 <all>
server-2 10.25.84.164:8301 alive server 1.7.0 2 dc1 <all>
server-3 10.25.84.165:8301 alive server 1.7.0 2 dc1 <all>
命令輸出顯示了集羣節點名稱、IP端口、健康狀態、啓動模式、所在數據中心和版本信息。
2.3、訪問Consul的WebUI控制檯
三臺服務都起來後,我們可以訪問Consul的WebUI控制檯,WEB控制檯默認端口爲:8500,在瀏覽器輸入地址: 10.25.84.163:8500
切換nodes標籤頁:
3、查看數據中心
到目前爲止,我們已經搭建好數據中心了,現在我們可以查看下數據中心中的成員
3.1、通過members命令查看
members命令針對Consul客戶端運行,該客戶端通過gossip
協議獲取其信息。
[root@localhost ~]# consul members
Node Address Status Type Build Protocol DC Segment
server-1 10.25.84.163:8301 alive server 1.7.0 2 dc1 <all>
server-2 10.25.84.164:8301 alive server 1.7.0 2 dc1 <all>
server-3 10.25.84.165:8301 alive server 1.7.0 2 dc1 <all>
命令輸出顯示了數據中心的節點、IP端口、健康狀態、角色、所在數據中心和版本信息。
還可以用過 -detailed 參數獲取更多信息
[root@localhost ~]# consul members -detailed
Node Address Status Tags
server-1 10.25.84.163:8301 alive acls=0,build=1.7.0:95fb95bf,dc=dc1,expect=3,id=4a60c9bd-472b-01a3-57f4-c74b8ba4d3df,port=8300,raft_vsn=3,role=consul,segment=<all>,vsn=2,vsn_max=3,vsn_min=2,wan_join_port=8302
server-2 10.25.84.164:8301 alive acls=0,build=1.7.0:95fb95bf,dc=dc1,expect=3,id=b3d84299-a458-19bf-2b98-ca9031e6aea4,port=8300,raft_vsn=3,role=consul,segment=<all>,vsn=2,vsn_max=3,vsn_min=2,wan_join_port=8302
server-3 10.25.84.165:8301 alive acls=0,build=1.7.0:95fb95bf,dc=dc1,expect=3,id=31174405-571f-f598-ef74-0a9aba59a6a8,port=8300,raft_vsn=3,role=consul,segment=<all>,vsn=2,vsn_max=3,vsn_min=2,wan_join_port=8302
3.2、通過HTTP API查看
curl 10.25.84.163:8500/v1/catalog/nodes
返回數據:
[
{
"ID":"99f8e10c-edda-bb40-21b4-8719ba851308",
"Node":"agent-1",
"Address":"10.25.84.163",
"Datacenter":"dc1",
"TaggedAddresses":{
"lan":"10.25.84.163",
"lan_ipv4":"10.25.84.163",
"wan":"10.25.84.163",
"wan_ipv4":"10.25.84.163"
},
"Meta":{
"consul-network-segment":""
},
"CreateIndex":5,
"ModifyIndex":11
},
{
"ID":"824a86e6-9713-a136-8037-c489222a88e1",
"Node":"agent-2",
"Address":"10.25.84.164",
"Datacenter":"dc1",
"TaggedAddresses":{
"lan":"10.25.84.164",
"lan_ipv4":"10.25.84.164",
"wan":"10.25.84.164",
"wan_ipv4":"10.25.84.164"
},
"Meta":{
"consul-network-segment":""
},
"CreateIndex":7,
"ModifyIndex":10
},
{
"ID":"5f073f8b-2130-254d-c83f-30d7850e2192",
"Node":"agent-3",
"Address":"10.25.84.165",
"Datacenter":"dc1",
"TaggedAddresses":{
"lan":"10.25.84.165",
"lan_ipv4":"10.25.84.165",
"wan":"10.25.84.165",
"wan_ipv4":"10.25.84.165"
},
"Meta":{
"consul-network-segment":""
},
"CreateIndex":8,
"ModifyIndex":9
}
]
3.3、通過DNS接口查看
除了HTTP API外,我們還可以使用DNS接口查看數據中心成員信息
[root@localhost ~]# dig @10.25.84.163 -p 8600 server-1.node.consul
; <<>> DiG 9.11.4-P2-RedHat-9.11.4-9.P2.el7 <<>> @10.25.84.163 -p 8600 server-1.node.consul
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 64004
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 2
;; WARNING: recursion requested but not available
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;server-1.node.consul. IN A
;; ANSWER SECTION:
server-1.node.consul. 0 IN A 10.25.84.163
;; ADDITIONAL SECTION:
server-1.node.consul. 0 IN TXT "consul-network-segment="
;; Query time: 1 msec
;; SERVER: 10.25.84.163#8600(10.25.84.163)
;; WHEN: Fri Feb 21 12:47:15 CST 2020
;; MSG SIZE rcvd: 101
其中server-1
.node.consul中第一部分需要替換成自己的agent節點名
dig命令如果不存在需要安裝下,命令:
yum -y install bind-utils
4、停止agent服務
通過consul leave命令優雅停止服務,我們再打開一個從節點機器終端,運行該命令
[root@localhost ~]# consul leave
Graceful leave complete