Consul Architecture
Consul Architecture(Consul架構)
Consul是一個複雜的系統,有許多不同的運動部件。為了幫助Consul的使用者和開發人員形成其工作原理的心理模型,該頁面記錄了系統架構。
Glossary(詞彙表)
在描述架構之前,我們提供術語表以幫助澄清正在討論的內容:
Agent - 代理是Consul叢集的每個成員上長時間執行的守護程式。它是通過執行consul agent來啟動的。代理能夠以客戶端或伺服器模式執行。由於所有節點必須執行代理,因此將節點稱為客戶端或伺服器更簡單,但代理的其他例項也是如此。所有代理都可以執行DNS或HTTP介面,並負責執行檢查並保持服務同步。
Client - 客戶端是將所有RPC轉發到伺服器的代理。客戶是相對無國籍的。客戶端執行的唯一後臺活動是參與LAN Gossip池。這具有最小的資源開銷並且僅消耗少量的網路頻寬。
Server - 伺服器是具有擴充套件責任的代理,包括參與Raft仲裁,維護群集狀態,響應RPC查詢,與其他資料中心交換WAN Gossip以及將查詢轉發給領導者或遠端資料中心。
Datacenter - 雖然資料中心的定義似乎很明顯,但必須考慮細微的細節。例如,在EC2中,多個可用區域是否被視為包含單個數據中心?我們將資料中心定義為專用,低延遲和高頻寬的網路環境。這排除了通過公共網際網路的通訊,但出於我們的目的,單個EC2區域內的多個可用區域將被視為單個數據中心的一部分。
Consistency - 在我們的文件中使用時,我們使用共識來表示對當選領導者的協議以及對交易順序的協議。由於這些事務應用於有限狀態機,因此我們對共識的定義意味著複製狀態機的一致性。維基百科上更詳細地描述了共識,此處描述了我們的實現。
Gossip - Consul建立在Serf之上,它提供了一個完整的gossip協議,可用於多種用途。 Serf提供會員資格,故障檢測和事件廣播。我們對這些的使用在gossip文件中有更多描述。足以知道gossip涉及隨機節點到節點的通訊,主要是通過UDP。
LAN Gossip - 指區域網gossip池,其中包含位於同一區域網或資料中心的節點。
WAN Gossip - 指僅包含伺服器的WAN gossip池。這些伺服器主要位於不同的資料中心,通常通過網際網路或廣域網進行通訊。
RPC - 遠端過程呼叫。這是一種允許客戶端發出伺服器請求的請求/響應機制。
10,000 foot view(一萬英尺視角觀看)
從10,000英尺的高度,Consul的架構看起來像這樣:
讓我們分解這個影象並描述每一塊。首先,我們可以看到有兩個資料中心,標記為“一個”和“兩個”。 Consul為多個數據中心提供一流的支援,並期望這是常見的情況。
在每個資料中心內,我們都有客戶端和伺服器的混合體。預計有三到五臺伺服器。這在失敗和效能的可用性之間取得平衡,因為隨著更多機器的新增,共識逐漸變慢。但是,客戶端數量沒有限制,可以輕鬆擴充套件到數千或數萬。
資料中心中的所有節點都參與了八卦協議。這意味著有一個八卦池,其中包含給定資料中心的所有節點。這有幾個目的:首先,不需要為客戶端配置伺服器的地址;發現是自動完成的。其次,檢測節點故障的工作不是放在伺服器上,而是分散式的。這使得故障檢測比天真的心跳方案更具可擴充套件性。第三,它被用作訊息傳遞層,用於在諸如領導者選舉等重要事件發生時通知。
每個資料中心中的伺服器都是單個Raft對等集的一部分。這意味著他們共同選舉一個領導者,一個具有額外職責的選定伺服器。領導者負責處理所有查詢和交易。作為共識協議的一部分,還必須將事務複製到所有對等體。由於此要求,當非領導者伺服器收到RPC請求時,它會將其轉發給群集負責人。
伺服器節點也作為WAN八卦池的一部分執行。此池與LAN池不同,因為它針對較高的Internet延遲進行了優化,並且預計僅包含其他Consul伺服器節點。此池的目的是允許資料中心以低觸控方式發現彼此。線上建立新的資料中心就像加入現有的WAN八卦池一樣簡單。由於伺服器都在此池中執行,因此它還支援跨資料中心請求。當伺服器收到對不同資料中心的請求時,它會將其轉發到正確資料中心的隨機伺服器。然後該伺服器可以轉發給本地領導者。
這導致資料中心之間的耦合非常低,但由於故障檢測,連線快取和多路複用,跨資料中心請求相對快速且可靠。
通常,不會在不同的Consul資料中心之間複製資料。當對另一個數據中心中的資源發出請求時,本地Consul伺服器會將RPC請求轉發給該資源的遠端Consul伺服器並返回結果。如果遠端資料中心不可用,那麼這些資源也將不可用,但這不會影響本地資料中心。在某些特殊情況下,可以複製有限的資料子集,例如使用Consul的內建ACL複製功能,或者像consul-replicate這樣的外部工具。
在某些地方,客戶端代理可以快取來自伺服器的資料,以使其在本地可用,以提高效能和可靠性。示例包括連線證書和意圖,允許客戶端代理在沒有往返伺服器的情況下做出有關入站連線請求的本地決策。某些API端點還支援可選的結果快取。這有助於提高可靠性,因為本地代理可以繼續響應某些查詢,例如服務發現或從快取連線授權,即使與伺服器的連線中斷或伺服器暫時不可用也是如此。