20、談談consul(一)

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

發佈了74 篇原創文章 · 獲贊 32 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章