上圖是官網提供的一個事例系統圖,圖中的Server是consul服務端高可用集群,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的數量,它們可以很容易的擴展到數千或者數萬臺。
同一個數據中心的所有節點都必須加入gossip協議。這意味著gossip協議包含一個給定數據中心的所有節點。這服務于幾個目的:第一,不需要在client上配置server地址。發現都是自動完成的。第二,檢測節點故障的工作不是放在server上,而是分布式的。這是的故障檢測相比心跳機制有更高的可擴展性。第三:它用來作為一個消息層來通知事件,比如leader選舉發生時。
每個數據中心的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。
這使得數據中心之間只有一個很低的耦合,但是由于故障檢測,連接緩存和復用,跨數據中心的請求都是相對快速和可靠的。
使用Consul也非常簡單,基本可以做到開箱即用
這篇文章《使用C# 和Consul進行分布式系統協調 》是在單機上做的, 我們現在要大家一個3節點的集群,本文就是介紹如何搭建一個3節點的Consul集群:
1. 準備工作
a) 啟動三臺虛擬機
s1:10.0.0.5
s2:10..0.0.6
s3:10..0.0.7
b) 每臺機器上在 /usr/local 新建文件夾
mkdir
–p /usr/local/consul/data
c) 下載consul,并將其考入到/usr/local/consul中
下載地址:https://www.consul.io/downloads.html
sudo wget https://releases.hashicorp.com/consul/0.7.2/consul_0.7.2_linux_amd64.zip
unzip consul_0.7.2_linux_amd64.zip
2. 啟動server agent
a) 進入consul目錄中
b) 執行命令:
sudo ./consul agent -server -bootstrap-expect 2 -data-dir=data -node=n1 -bind=10.0.0.5 -client=0.0.0.0 &
注:
i. server: 以server身份啟動。
ii. bootstrap-expect:集群要求的最少server數量,當低于這個數量,集群即失效。
iii. data-dir:data存放的目錄,更多信息請參閱consul數據同步機制
iv. node:節點id,在同一集群不能重復。
v. bind:監聽的ip地址。
vi. client 客戶端的ip地址
vii. & :在后臺運行,此為linux腳本語法
vii. 更多參數及配置說明見consul官方說明文檔https://www.consul.io/docs/agent/options.html。
c) 修改node和bind信息,分別在另外兩臺機器中執行 上面命令。
sudo ./consul agent -server -bootstrap-expect 2 -data-dir=data -node=n2 -bind=10.0.0.6 -client=0.0.0.0 &
sudo ./consul agent -server -bootstrap-expect 2 -data-dir=data -node=n3 -bind=10.0.0.5 -client=0.0.0.0 &
d) 在s2、s3中分別執行:
.
/consul
join
10.0.0.7
到這里整個consul server 集群就算完成了,可以利用consul members查看集群中包含的node信息。使用consul info命令可以查看當前節點狀態,包括是否在集群中,是否為leader(主)。
3. 搭建管理工具
consul自帶的WEB UI,Web ui是consul提供的可視化的服務web界面,可以對key/value和服務、節點進行操作
a) 下載consul web ui(包含一個html和一個static文件件),和本機中的consul放到同級目錄。
b) 在本機啟動consul,需要設置-ui-dir ./webui
sudo ./consul agent -server -bootstrap-expect 2 -data-dir=data -node=n3 -bind=10.0.0.7 -ui-dir=webui -client 0.0.0.0 &
打開瀏覽器訪問8500 端口:
文章列表