consul的基本概念
組成 consul 集羣的每個成員上都要運行一個 agent,可以通過 consul agent 命令來啓動。agent 可以運行在 server 狀態或者 client 狀態。自然的,運行在 server 狀態的節點被稱爲 server 節點;運行在 client 狀態的節點被稱爲 client 節點。
client 節點
負責轉發所有的 RPC 到 server 節點。本身無狀態,且輕量級,因此,可以部署大量的 client 節點。
server 節點
負責組成 cluster 的複雜工作(選舉、狀態維護、轉發請求到 lead),以及 consul 提供的服務(響應 RCP 請求)。考慮到容錯和收斂,一般部署 3 ~ 5 個比較合適。
datacenter
多機房使用的數據共享
Client是consul客戶端。consul客戶端不保存數據,客戶端將接收到的請求轉發給響應的Server端。Server之間通過局域網或廣域網通信實現數據一致性。每個Server或Client都是一個consul agent。Consul集羣間使用了GOSSIP協議通信和raft一致性算法。上面這張圖涉及到了很多術語:
Agent——agent是一直運行在Consul集羣中每個成員上的守護進程。通過運行 consul agent 來啓動。agent可以運行在client或者server模式。指定節點作爲client或者server是非常簡單的,除非有其他agent實例。所有的agent都能運行DNS或者HTTP接口,並負責運行時檢查和保持服務同步。
Client——一個Client是一個轉發所有RPC到server的代理。這個client是相對無狀態的。client唯一執行的後臺活動是加入LAN gossip池。這有一個最低的資源開銷並且僅消耗少量的網絡帶寬。
Server——一個server是一個有一組擴展功能的代理,這些功能包括參與Raft選舉,維護集羣狀態,響應RPC查詢,與其他數據中心交互WAN gossip和轉發查詢給leader或者遠程數據中心。
DataCenter——雖然數據中心的定義是顯而易見的,但是有一些細微的細節必須考慮。例如,在EC2中,多個可用區域被認爲組成一個數據中心?我們定義數據中心爲一個私有的,低延遲和高帶寬的一個網絡環境。這不包括訪問公共網絡,但是對於我們而言,同一個EC2中的多個可用區域可以被認爲是一個數據中心的一部分。
Consensus——在我們的文檔中,我們使用Consensus來表明就leader選舉和事務的順序達成一致。由於這些事務都被應用到有限狀態機上,Consensus暗示複製狀態機的一致性。
Gossip——Consul建立在Serf的基礎之上,它提供了一個用於多播目的的完整的gossip協議。Serf提供成員關係,故障檢測和事件廣播。更多的信息在gossip文檔中描述。這足以知道gossip使用基於UDP的隨機的點到點通信。
LAN Gossip——它包含所有位於同一個局域網或者數據中心的所有節點。
WAN Gossip——它只包含Server。這些server主要分佈在不同的數據中心並且通常通過因特網或者廣域網通信。
RPC——遠程過程調用。這是一個允許client請求server的請求/響應機制。
在每個數據中心,client和server是混合的。一般建議有3-5臺server。這是基於有故障情況下的可用性和性能之間的權衡結果,因爲越多的機器加入達成共識越慢。然而,並不限制client的數量,它們可以很容易的擴展到數千或者數萬臺。
每個數據中心的server都是Raft節點集合的一部分。這意味着它們一起工作並選出一個leader,一個有額外工作的server。leader負責處理所有的查詢和事務。作爲一致性協議的一部分,事務也必須被複制到所有其他的節點。因爲這一要求,當一個非leader得server收到一個RPC請求時,它將請求轉發給集羣leader。
server節點也作爲WAN gossip Pool的一部分。這個Pool不同於LAN Pool,因爲它是爲了優化互聯網更高的延遲,並且它只包含其他Consul server節點。這個Pool的目的是爲了允許數據中心能夠以low-touch的方式發現彼此。這使得一個新的數據中心可以很容易的加入現存的WAN gossip。因爲server都運行在這個pool中,它也支持跨數據中心請求。當一個server收到來自另一個數據中心的請求時,它隨即轉發給正確數據中心一個server。該server再轉發給本地leader。
單dc的CONSUL環境
主機名稱 | IP | 角色 | 數據中心 |
---|---|---|---|
node0 | 192.168.192.120 | Server | DataCenter1 |
node1 | 192.168.192.121 | Server | DataCenter1 |
node2 | 192.168.192.122 | Server | DataCenter1 |
node3 | 192.168.192.123 | Client | DataCenter1 |
Consul有兩種方式搭建方式:一是bootstrap模式,二是非bootstrap模式。
bootstrap模式
1. 在啓動agent
在第一臺節點上啓動agent,以server模式運行,指定server角色的節點數目,指定節點名(在datacenter內節點名唯一),同時提供監聽地址。
[ceph@node0 cousul]$ consul agent -server-bootstrap-expect=3 -data-dir=/tmp/consul -node=node0 -bind=192.168.192.120-dc=dc1
依次在另外兩臺機器部署agent作爲server
節點node1
[ceph@node1 consul]$ consul agent-server -bootstrap-expect=3 -data-dir=/tmp/consul -node=node1-bind=192.168.192.121 -dc=dc1
節點node2
[ceph@node2 consul]$ consul agent-server -bootstrap-expect=3 -data-dir=/tmp/consul -node=node2-bind=192.168.192.122 -dc=dc1
目前,三個節點均不知道其他Server節點的存在,以node0爲例
[ceph@node0 consul]$ consul members
Node Address Status Type Build Protocol DC
node0 192.168.192.120:8301 alive server 0.6.4 2 dc1
查看consul集羣信息
[ceph@node0 consul]$ consul info
當前節點爲follow節點
觸發選舉leader
因爲consul一般需要3~5個Server,因此,在節點node0上添加node1和node2。
[ceph@node0 consul]$ consul join192.168.192.121
Successfully joined cluster bycontacting 1 nodes.
[ceph@node0 consul]$ consul join192.168.192.122
Successfully joined cluster bycontacting 1 nodes.
觀察三個節點consul日誌:
Node0:
2016/07/05 21:10:55 [INFO] agent: (LAN) joining: [192.168.192.122]
2016/07/05 21:10:55 [INFO] serf: EventMemberJoin: node2 192.168.192.122
2016/07/05 21:10:55 [INFO] agent: (LAN) joined: 1 Err: <nil>
2016/07/05 21:10:55 [INFO] consul: adding LAN server node2 (Addr:192.168.192.122:8300) (DC: dc1)
2016/07/05 21:10:55 [INFO] consul: Attempting bootstrap with nodes:[192.168.192.120:8300 192.168.192.121:8300 192.168.192.122:8300]
2016/07/05 21:10:55 [INFO] consul: New leader elected: node2
2016/07/05 21:10:56 [INFO] agent: Synced service 'consul'
Node1
2016/07/05 21:10:55 [INFO] serf:EventMemberJoin: node2 192.168.192.122
2016/07/05 21:10:55 [INFO] consul: adding LAN server node2 (Addr:192.168.192.122:8300) (DC: dc1)
2016/07/05 21:10:55 [INFO] consul: Attempting bootstrap with nodes:[192.168.192.121:8300 192.168.192.120:8300 192.168.192.122:8300]
2016/07/05 21:10:56 [INFO] consul: New leader elected: node2
2016/07/05 21:10:57 [INFO] agent:Synced service 'consul'
Node2
2016/07/05 21:10:55 [INFO] serf: EventMemberJoin: node0 192.168.192.120
2016/07/05 21:10:55 [INFO] serf: EventMemberJoin: node1 192.168.192.121
2016/07/05 21:10:55 [INFO] consul: adding LAN server node0 (Addr:192.168.192.120:8300) (DC: dc1)
2016/07/05 21:10:55 [INFO]consul: Attempting bootstrap with nodes: [192.168.192.122:8300192.168.192.120:8300 192.168.192.121:8300]
2016/07/05 21:10:55 [INFO] consul: adding LAN server node1 (Addr:192.168.192.121:8300) (DC: dc1)
2016/07/05 21:10:55 [WARN] raft: Heartbeat timeout reached, startingelection
2016/07/05 21:10:55 [INFO] raft: Node at 192.168.192.122:8300[Candidate] entering Candidate state
2016/07/05 21:10:55 [INFO] raft: Election won. Tally: 2
2016/07/05 21:10:55 [INFO] raft: Node at 192.168.192.122:8300 [Leader]entering Leader state
2016/07/05 21:10:55 [INFO] consul: cluster leadership acquired
2016/07/05 21:10:55 [INFO] consul: New leader elected: node2
2016/07/05 21:10:55 [INFO] raft: pipelining replication to peer192.168.192.121:8300
2016/07/05 21:10:55 [INFO] raft: pipelining replication to peer192.168.192.120:8300
2016/07/05 21:10:55 [INFO] consul: member 'node2' joined, marking healthalive
2016/07/05 21:10:55 [INFO] consul: member 'node0' joined, marking healthalive
2016/07/05 21:10:55 [INFO] consul: member 'node1' joined, marking healthalive
2016/07/05 21:10:58 [INFO] agent: Synced service 'consul'
由日誌可知,舉出了leadernode2
[ceph@node0 consul]$ consul members
Node Address Status Type Build Protocol DC
node0 192.168.192.120:8301 alive server 0.6.4 2 dc1
node1 192.168.192.121:8301 alive server 0.6.4 2 dc1
node2 192.168.192.122:8301 alive server 0.6.4 2 dc1
查看info信息
[ceph@node0 consul]$ consul info
agent:
check_monitors= 0
check_ttls= 0
checks= 0
services= 1
build:
prerelease=
revision= 26a0ef8c
version= 0.6.4
consul:
bootstrap = false
known_datacenters= 1
leader = false
server = true
節點node2上查看consul信息
[ceph@node2 consul]$ consul info
agent:
check_monitors= 0
check_ttls= 0
checks= 0
services= 1
build:
prerelease=
revision= 26a0ef8c
version= 0.6.4
consul:
bootstrap= false
known_datacenters= 1
leader = true
server = true
在node3上以client啓動agent
[ceph@node3 consul]$ consul agent -data-dir=/tmp/consul -node=node3 -bind=192.168.192.123 -dc=dc1
在節點node0上添加node3
[ceph@node0 consul]$ consul join192.168.192.123
Successfully joined cluster bycontacting 1 nodes.
[ceph@node0 consul]$ consul members
Node Address Status Type Build Protocol DC
node0 192.168.192.120:8301 alive server 0.6.4 2 dc1
node1 192.168.192.121:8301 alive server 0.6.4 2 dc1
node2 192.168.192.122:8301 alive server 0.6.4 2 dc1
node3 192.168.192.123:8301 alive client 0.6.4 2 dc1
節點node3的日誌如下:
2016/07/05 21:21:57 [INFO] serf: EventMemberJoin: node0 192.168.192.120
2016/07/05 21:21:57 [INFO] serf: EventMemberJoin: node2 192.168.192.122
2016/07/05 21:21:57 [INFO] serf: EventMemberJoin: node1 192.168.192.121
2016/07/05 21:21:57 [INFO] consul: adding server node0 (Addr:192.168.192.120:8300) (DC: dc1)
2016/07/05 21:21:57 [INFO] consul: adding server node2 (Addr:192.168.192.122:8300) (DC: dc1)
2016/07/05 21:21:57 [INFO] consul: adding server node1 (Addr:192.168.192.121:8300) (DC: dc1)
2016/07/05 21:21:57 [INFO] consul: New leader elected: node2
2016/07/05 21:21:57 [INFO] agent: Synced node info
依次關閉node3 node2
Node0和node1的日誌如下:
Node0
2016/07/05 21:24:00 [INFO] serf: EventMemberLeave: node2 192.168.192.122
2016/07/05 21:24:00 [INFO] consul: removing LAN server node2 (Addr:192.168.192.122:8300) (DC: dc1)
2016/07/05 21:24:00 [WARN] raft: Heartbeat timeout reached, startingelection
2016/07/05 21:24:00 [INFO] raft: Node at 192.168.192.120:8300[Candidate] entering Candidate state
2016/07/05 21:24:01 [INFO] raft: Duplicate RequestVote for same term: 2
2016/07/05 21:24:02 [WARN] raft: Election timeout reached, restartingelection
2016/07/05 21:24:02 [INFO] raft: Node at 192.168.192.120:8300[Candidate] entering Candidate state
2016/07/05 21:24:02 [INFO] raft: Election won. Tally: 2
2016/07/05 21:24:02 [INFO] raft: Node at 192.168.192.120:8300 [Leader]entering Leader state
2016/07/05 21:24:02 [INFO] consul: cluster leadership acquired
2016/07/05 21:24:02 [INFO] consul: New leader elected: node0
2016/07/05 21:24:02 [INFO] raft: pipelining replication to peer192.168.192.121:8300
2016/07/05 21:24:02 [INFO] consul: member 'node2' left, deregistering
2016/07/05 21:24:03 [INFO] agent.rpc: Accepted client: 127.0.0.1:35701
Node1
2016/07/05 21:24:00 [INFO] consul: removing LAN server node2 (Addr:192.168.192.122:8300) (DC: dc1)
2016/07/05 21:24:00 [WARN] raft: Rejecting vote request from192.168.192.120:8300 since we have a leader: 192.168.192.122:8300
2016/07/05 21:24:01 [WARN] raft: Heartbeat timeout reached, startingelection
2016/07/05 21:24:01 [INFO] raft: Node at 192.168.192.121:8300[Candidate] entering Candidate state
2016/07/05 21:24:02 [INFO] raft: Node at 192.168.192.121:8300 [Follower]entering Follower state
2016/07/05 21:24:02 [INFO]consul: New leader elected: node0
###consul多數據中心搭建
自建IDC後面簡稱com、阿里雲機房ali、騰訊雲機房tx
com機房:內網10.10.10.0/24,邊界節點,10.10.10.100/101.xxx.80.xxx
ali機房:內網10.10.10.0/24,邊界節點,10.10.10.100/xxx.43.xxx.50
tx機房:內網10.10.10.0/24,邊界節點,10.10.10.100/xxx.159.xxx.35
1、server、client節點部署
所有節點的consul服務均由supervisord守護管理。
idc機房配置3個server模式的節點,其它的均是client模式的節點,server和client配置各舉例一個
server模式:(邊界server節點的配置稍有不同,後面詳細介紹):
[program:consul_server]
command=/usr/local/consul/bin/consul agent -server -bootstrap-expect 3 -data-dir /usr/local/consul/data/ -config-dir /usr/local/consul/config/ -node=own-server02 -bind=10.10.10.105 -dc=xxx-own
process_name=%(process_num)s
numprocs=1
directory=/usr/local/consul/bin/
autostart=true
autorestart=true
startsecs=1
redirect_stderr=true
stdout_logfile=/opt/log/consul/consul_server.log
stdout_logfile_maxbytes=50MB
stdout_logfile_backups=5
client模式:
[program:consul_client]
command=/usr/local/consul/bin/consul agent -data-dir /usr/local/consul/data/ -node=own-client04 -bind=10.10.10.214 -config-dir=/usr/local/consul/config/ -dc=xxx-own
process_name=%(process_num)s
numprocs=1
directory=/usr/local/consul/bin/
autostart=true
autorestart=true
startsecs=1
redirect_stderr=true
stdout_logfile=/opt/log/consul/consul_client.log
stdout_logfile_maxbytes=50MB
stdout_logfile_backups=5
ali、tx機房的server、client節點配置類似,有區別的參數就是-dc、-bind、-node即所屬的數據中心、用於集羣通信的監聽ip、節點名稱。
每次添加一個新的節點後,consul join加入到本地集羣已有的任意一個節點即可加入這個集羣(這個動作可以做到批量裝機裏面)。
集羣之間的通信設置
每個集羣選取一個處於server模式的節點作爲邊界節點,配置與集羣內的其它server模式的節點稍有差異:
[program:consul_server]
command=/usr/local/consul/bin/consul agent -server -bootstrap-expect 3 -advertise-wan=101.xxx.80.xxx -data-dir /usr/local/consul/data/ -config-dir /usr/local/consul/config/ -node=own-server03 -dc=xxxx-own
process_name=%(process_num)s
numprocs=1
directory=/usr/local/consul/bin/
autostart=true
autorestart=true
startsecs=1
redirect_stderr=true
stdout_logfile=/opt/log/consul/consul_server.log
stdout_logfile_maxbytes=50MB
相比於其它server模式節點,需要指定-advertise-wan參數。如果不指定該參數,consul join -wan加入一個集羣的時候,默認使用的是內外ip(節點環境是有內外網兩個以上ip),造成集羣之間通信失敗(如果集羣之間的內網沒有互通)。
每個邊界節點將-advertise-wan設置成公網ip,用於集羣之間的通信。
如果邊界節點開啓了防火牆,需要將對方的ip地址加入白名單,或者將TCP/UDP的8302端口加入彼此的白名單。
最後任意一個邊界節點均可以查看到各個邊界節點狀態信息:
[root@xxxxxx ~]# consul members -wan
Node Address Status Type Build Protocol DC
own-server02.xxxx-own 101.xxx.80.xxx:8302 alive server 0.x.x 2 xxxx-own
ali-server03.xxxx-ali xxx.43.xxx.50:8302 alive server 0.x.x 2 xxxx-ali
tx-server02.xxxx-tx xxx.159.xxx.35:8302 alive server 0.x.x 2 xxxx-tx
[root@xxxxx ~]#
集羣UI管理界面設置
將官方提供的ui界面文件部署在任意一個邊界節點上,可以訪問到任何一個集羣的節點狀態。客戶端(http、dns、rpc)默認監聽地址是127.0.0.1,訪問ui的端口是http的8500端口,如果不設置客戶端監聽ip,需要一個代理(nginx)將本地的8500端口轉發到外網,也可以直接指定client的監聽ip:
[program:consul_server]
command=/usr/local/consul/bin/consul agent -server -bootstrap-expect 3 -advertise-wan=101.xxx.80.xxx -data-dir /usr/local/consul/data/ -config-dir /usr/local/consul/config/ -node=own-server03 -ui-dir /usr/local/consul/web/ -bind=10.10.10.100 -client=0.0.0.0 -dc=xxxx-own
process_name=%(process_num)s
numprocs=1
directory=/usr/local/consul/bin/
autostart=true
autorestart=true
startsecs=1
redirect_stderr=true
stdout_logfile=/opt/log/consul/consul_server.log
stdout_logfile_maxbytes=50MB
stdout_logfile_backups=5
參數-client用來指定client監聽ip,處於安全考慮可以監聽在內網10.10.10.100,但是consul命令默認訪問的是127.0.0.1端口,故監聽0.0.0.0。配置成功後可以看到各個集羣之間的狀態:
consul的ACL配置
https://blog.csdn.net/llianlianpay/article/details/79028916
consul和zookeeper服務變更通知的區別:
zookeeper:客戶端和服務端通過建立tcp長連接進行服務變更通知,一旦服務端有服務變化,通過socket發送消息給客戶端。優點是簡單,服務端主動推送消息到客戶端,缺點是長連接往往不穩定,鏈路斷開,客戶端經常收不到服務端推送的消息。
consul:是基於http協議,客戶端通過http api主動查詢服務,如果有變更則返回服務信息,我們都知道http是一個request,一個response,而consul怎樣保證服務端一有變更馬上response到客戶端呢,這裏consul解決方案是:1輪循;2阻塞查詢,通過輪循調用服務端,並且不及時返回服務信息,而是等待一定時間在返回,在規定時間內如果有服務變更則馬上返回變更信息,這樣就客戶端就可以及時的知道服務變更。
參考:http://www.xiaomastack.com/2016/05/20/consul02/
https://blog.csdn.net/younger_china/article/details/52243718