Consul 架構(gòu) 此篇文章主要對consul的相關(guān)內(nèi)部技術(shù)細節(jié)進行簡要概述。
?術(shù)語 代理 - 代理是指consul集群中運行的consul實例,通過執(zhí)行 consul agent 命令來啟動. 代理可以運行于客戶端或者服務(wù)端。通過執(zhí)行DNS或者HTTP接口來執(zhí)行健康檢查和服務(wù)同步。
客戶節(jié)點 - 客戶節(jié)點負責(zé)將向服務(wù)節(jié)點發(fā)送RPC請求,相對來說是無狀態(tài)的.??蛻艄?jié)點唯一要執(zhí)行的后臺活動是參與LAN gossip pool。當(dāng)然這只會消耗很少的資源和網(wǎng)絡(luò)帶寬。
服務(wù)節(jié)點 - 服務(wù)節(jié)點主要職責(zé)包括參與Raft算法,維護集群狀態(tài),處理RPC查詢,和其它的數(shù)據(jù)中心交換WLAN gossip及向領(lǐng)導(dǎo)者或者遠程數(shù)據(jù)中心轉(zhuǎn)發(fā)查詢請求。
數(shù)據(jù)中心 – …
維護一致性- 包括領(lǐng)導(dǎo)者選舉及事務(wù)執(zhí)行順序方面的一致性。
Gossip - Consul是建立在Serf之上的,支持全部的gossip protocol(節(jié)點間隨機通信,主要通過UDP)。Serf 提供關(guān)系管理, 失敗檢測及事件分發(fā)功能. Consul gossip應(yīng)用詳情可以訪問連接gossip documentation。
LAN Gossip - 本地局域網(wǎng)或數(shù)據(jù)中心節(jié)點間Gossip應(yīng)用.
WAN Gossip – WAN 范圍(不同數(shù)據(jù)中心,主要通過internet或者wan通信)內(nèi)服務(wù)器節(jié)點間Gossip應(yīng)用。
RPC - 遠程過程調(diào)用,請求/回復(fù)機制。
?基本架構(gòu) consul-arch-420ce04a
如上圖所示,Consul先天支持多數(shù)據(jù)中心應(yīng)用:multiple datacenters 。
數(shù)據(jù)中心中包含客戶節(jié)點和服務(wù)節(jié)點,通常建議三到五個服務(wù)節(jié)點。因為隨著節(jié)點的增加,服務(wù)同步會變得相對更慢,同時考慮到服務(wù)失敗和性能要求等方面因素。但是對于客戶節(jié)點數(shù)量,則沒有限制。
數(shù)據(jù)中心中的所有節(jié)點都會參數(shù)gossip protocol. 也就是說包括數(shù)據(jù)中心中所有的節(jié)點。這樣做有幾個目的,首先, 無需給客戶節(jié)點配置服務(wù)節(jié)點地址,就可以自動發(fā)現(xiàn)。其次,失效節(jié)點檢測是分布式的,相對于心跳檢測模式更具伸縮性。最后,事件分發(fā)是以消息模式分發(fā)處理的。
節(jié)點之間利用Raft協(xié)議選舉領(lǐng)導(dǎo)者,領(lǐng)導(dǎo)者負責(zé)處理所有的查詢和事務(wù)請求。同時根據(jù)Gossip協(xié)議,事務(wù)請求需要分發(fā)到所有的協(xié)議節(jié)點。所有當(dāng)一個非領(lǐng)導(dǎo)者服務(wù)節(jié)點收到一個Rpc請求時,它會將其轉(zhuǎn)發(fā)至集群領(lǐng)導(dǎo)者進行后續(xù)處理。
服務(wù)節(jié)點同時也是WAN gossip pool的一部分。相對于LAN pool,WAN pool是專門為高延遲因特網(wǎng)而優(yōu)化使用的,它只包含服務(wù)節(jié)點,提供數(shù)據(jù)中心之間低接觸式發(fā)現(xiàn)機制。它支持跨數(shù)據(jù)中心請求,當(dāng)一個數(shù)據(jù)中心接到請求其它數(shù)據(jù)中心數(shù)據(jù)的請求時,它會將其轉(zhuǎn)發(fā)至目標(biāo)數(shù)據(jù)中心中隨機的一個服務(wù)節(jié)點。
由此,大大的降低了數(shù)據(jù)中心的耦合度。但是,因為有相應(yīng)的失敗檢測,連接緩存和復(fù)用,數(shù)據(jù)中心之間的交互也相對快捷可靠。
通常來說,數(shù)據(jù)中心之間是不進行數(shù)據(jù)交換的,當(dāng)一個數(shù)據(jù)中心接收到一個請求其它數(shù)據(jù)中心資源的請求時,它會將其進行轉(zhuǎn)發(fā),由相應(yīng)的數(shù)據(jù)中心進行處理。當(dāng)目標(biāo)數(shù)據(jù)中心不可用,也就意味著所請求的資源不可用。但也有一些特俗情況,會造成數(shù)據(jù)的分發(fā),如,consul的內(nèi)置ACL replication功能,及其它相關(guān)的外部工具。
一致性模型:
默認(特定的舊leader的時間窗口內(nèi),舊leader處理讀請求):Raft使用leader leasing,提供一個時間窗口,這個時間內(nèi),leader假定他的leader角色是穩(wěn)定的。然而,如果這個leader和余下的節(jié)點分隔開。在舊leader持有時間窗口的同時,集群就會選出一個新的leader。這就意味著,集群有兩個leader節(jié)點。發(fā)生裂鬧現(xiàn)象并沒有風(fēng)險,因為舊leader不能提交新的條目。然而,對于只讀請求,舊leader很大可能性上會返回過期數(shù)據(jù)。默認的一致性模型依賴于leader leasing,客戶端有可能會獲取到過期的數(shù)據(jù)的風(fēng)險。我們之所以做這種妥協(xié)是因為,只讀請求通常很快,并且是強一致性的。只會在hard-to-trigger情況下會返回過期數(shù)據(jù)。會返回過期數(shù)據(jù)的時間窗口長度也是有限的,因為舊的leader會因為分裂的發(fā)生降級。
一致性(consistent):強一致性模型,這個模型需要leader處理讀請求錢,通過詢問quorum檢查自己的leader合法性,因此增加了一輪RPCs,好處是,讀請求的一致性,但是卻增加了延遲。
過期(stale):這種模型,允許所有的節(jié)點處理客戶端的讀請求。無論是否是leader節(jié)點。這就意味著讀取過期數(shù)據(jù)更加普遍,但是也僅僅是在leader的最小超時時間50ms內(nèi)。好處是,處理只讀請求塊,適用于大規(guī)模請求,但是伴隨著普遍的過期數(shù)據(jù)。模型在沒有l(wèi)eader的情況下依然可以處理來此客戶端的讀請求。
Consul Agent:
consul agent是consul的核心,負責(zé)維護成員關(guān)系信息,注冊服務(wù),運行健康檢查,提供查詢等。每個集群的節(jié)點都需要部署consul agent。 兩種模式:client,server。相較于client,serer模式agent,參與Raft一致性算法。負責(zé)提供,保持集群的強一致性及可用性。server agent和數(shù)據(jù)及系統(tǒng)資源有更多的交互,因此需要運行在專用的節(jié)點上。client agent則比較輕量,大多數(shù)操作只需要請求server agent去完成,只需要維護相對很少的狀態(tài)。
D:\consul>consul agent -server -bootstrap-expect=1 -data-dir=data -node=server0 -bind=127.0.0.1 -client 0.0.0.0 -ui BootstrapExpect is set to 1; this is the same as Bootstrap mode. bootstrap = true: do not enable unless necessary ==> Starting Consul agent... ==> Consul agent running! Version: 'v1.0.2' Node ID: '1ad0d5d0-80df-29ed-e795-ce50bfd70f2f' //節(jié)點唯一ID Node name: 'server0' //節(jié)點名稱,默認為機器的主機名,可以通過 -node 進行設(shè)置 Datacenter: 'dc1' (Segment: '<all>') //所在數(shù)據(jù)中心,單數(shù)據(jù)中心默認為dc1,可以通過 -datacenter 設(shè)置。 Server: true (Bootstrap: true) //運行模式, Client Addr: [0.0.0.0] (HTTP: 8500, HTTPS: -1, DNS: 8600) // 客戶端地址,服務(wù)于HTTP DNS接口,默認綁定localhost Cluster Addr: 127.0.0.1 (LAN: 8301, WAN: 8302) // 和集群內(nèi)成員通信的地址和端口,LAN WAN Encrypt: Gossip: false, TLS-Outgoing: false, TLS-Incoming: false
==> Log data will now stream in as it occurs:
停止: gracefully:ctrl-c 和 kill -INT。agent告知集群自己將要離開集群。建議 forcefully:kill -9 立即停止實例,集群通過失敗檢測發(fā)現(xiàn)
生命周期: 節(jié)點啟動 =》join命令,或者通過配置,加入集群 =》成員變更信息通過gossip協(xié)議傳播到集群其它成員,最終所有其它成員都將獲悉節(jié)點的加入 =》如果是server 節(jié)點,則其它服務(wù)幾點將進行日志復(fù)制 =》如果發(fā)生網(wǎng)絡(luò)問題,節(jié)點信息無法獲悉(無論是因為網(wǎng)絡(luò)問題無法通訊還是節(jié)點宕機)。則失聯(lián)節(jié)點標(biāo)記為失效,其它節(jié)點更新集群成員信息 =》節(jié)點離開,則集群標(biāo)記節(jié)點狀態(tài)為“已離開”,區(qū)別于節(jié)點失?。ㄋ泄?jié)點上注冊的服務(wù)會立即被注銷),如果是server節(jié)點,則復(fù)制過程停止 =》為了防止死節(jié)點信息的堆積,consul會自動將這些信息從成員信息列表中移除,稱之為收割。目前配置的時間隔72小時執(zhí)行一次,當(dāng)此時,類似于節(jié)點失敗,移除的節(jié)點信息上注冊的服務(wù)會被注銷。
更多建議: