1. 程式人生 > >consul(一)什麽是consul

consul(一)什麽是consul

咨詢 安全 command 報警 令行 健康檢查 neu 運算 在線

Consul是一個用來實現分布式系統的服務發現與配置的開源工具。他主要由多個組成部分:

  • 服務發現:客戶端通過Consul提供服務,類似於API,MySQL,或者其他客戶端可以使用Consul發現服務的提供者。使用類似DNS或者HTTP,應用程序和可以很輕松的發現他們依賴的服務。

  • 檢查健康:Consul客戶端可以提供與給定服務相關的健康檢查(Web服務器返回200 ok)或者本地節點(“內存利用率低於90%”)。這些信息可以監控集群的運行情況,並且使訪問遠離不健康的主機組件。

  • 鍵值對存儲:應用程序可以使用Cousul的層級鍵值對。

  • 多數據中心:Consul有開箱及用的多數據中心。

Consul內幕

術語

  • 代理(agent)

    :代理是Consul集群上每個成員的守護進程,它是由consul agent開始運行。代理能夠以客戶端或服務器模式運行。由於所有節點都必須運行代理,所以將節點引用為客戶端或服務器更為簡單,但還有其他實例的代理。所有代理可以運行DNS或HTTP接口,並負責運行檢查和保持服務同步。

  • 客戶端:客戶端可以將所有RPC請求轉發到服務器的代理。客戶端是相對無狀態的。客戶端執行的唯一後臺活動是LANgossip池。它消耗最小的資源開銷和少量的網絡帶寬。

  • 服務器端:服務器端是具有擴展的功能的代理,它主要參與維護集群狀態,響應RPC查詢,與其他數據中心交換WAN gossip ,以及向上級或遠程數據中心轉發查詢。

  • 數據中心:

    雖然數據中心的定義似乎很明顯,但仍有一些細微的細節必須考慮。我們將一個數據中心定義為一個私有、低延遲和高帶寬的網絡環境。這不包括通過公共互聯網的通信,但是為了我們的目的,單個EC2區域內的多個可用區域將被視為單個數據中心的一部分

  • Gossip:consul是建立在serf之上的,它提供了一個完整的gossip協議,用在很多地方。Serf提供了成員,故障檢測和事件廣播。Gossip的節點到節點之間的通信使用了UDP協議。

  • LAN Gossip:指在同一局域網或數據中心的節點上的LAN Gossip池。

  • WAN Gossip:指包含服務器的WAN Gossip池,這些服務器在不同的數據中心,通過網絡進行通信。

架構圖

技術分享圖片
技術分享圖片

圖中有兩個數據中心,分別為Datacenter1和Datacenter2。Consul一層支持多個數據中心,每個數據中心內,有客戶端和服務器端,服務區端一般為3~5個,這樣可以在穩定和性能上達到平衡,因為更多的機器會使數據同步很慢。不過客戶端是沒有限制的,可以有成千上萬個。

數據中心到所有節點都使用的時候Gossip協議。這就意味著有一個Gossip池,其中包含給定數據中心所有的節點。客戶端不需要去配置服務器地址信息,發現服務會自動完成;檢測故障節點的工作不是放在服務器端,而是分布式的;數據中心被用作消息層,以便在選擇leader這種重要的事情發生的時候做通知。

每個數據中心都是都是單個Raft對等設備的一部分。這意味著他們一起工作,選擇一個單一的領導者——一個具有額外職責的選定的服務器。leader負責處理所有查詢和事物。事物也必須作為同步協議的一部分復制到所有對等體。由於這個要求,當非領導服務器端接收到RPC請求時,就會將請求其轉發給集群leader。

服務器端節點作為WANGossip池的一部分運行,WAN池和LAN池不同的是,針對網絡高延遲做了優化,而且只包含其他Consul服務器的節點。這個池的目的是允許數據中心以最少的消耗方式發現對方。在線啟動新的數據中心與加入現有的WAN Gossip一樣簡單。因為這些服務器都在這個池中運行,它還支持跨數據中心請求。當服務器收到對不同數據中心的請求時,它會將其轉發到正確數據中心中的隨機服務器。那個服務器可能會轉發給本地的leader。

這樣會使數據中心的耦合非常低,由於故障檢測,連接緩存和復用,跨數據中心請求相對快速可靠。

Gossip協議(流言傳播協議)

Consul使用Gossip協議來管理成員和集群廣播消息,這些都是通過使用Serf庫的。Serf所使用的Gossip協議基於SWIM:可伸縮的弱一致的感染模式的過程組成員協議”,並做了一些細微的修改。

Consul中的Gossip

Consul使用了兩個不同的Gossip池,稱為LAN池和WAN池。每個數據中心都有一個LAN池,其中包含數據中心的所有成員,包括服務器端和客戶端。LAN的成員客戶端可以自動發現服務器,減少所需配置的數量。分布式故障檢測可以讓故障檢測的工具被整個集群共享,Gossip池可以快速可靠的將事件廣播,比如選擇leader。

WAN池是全局唯一的,所有的服務器都應該在WAN池中,而不關系數據中心在哪裏。WAN池提供的成員信息允許服務器執行跨數據中心請求。集成的故障檢測功能使Consul能夠優雅地處理整個數據中心或者遠程數據中心的一個服務器失連。

Lifeguard Enhancements

在分組軟實時處理可能的情況下,SWIN假設本地節點是健康的。但在本地節點遇到CPU或者網絡節點資源匱乏的時候,可能不會認為節點不健康。結果是安全檢測狀態可能會偶爾癱瘓,導致虛假報警。Lifeguard解決了這個問題。

Consensus 協議

Consul通過Consensus協議來提供一致性(由CAP定義)。Consensus協議是基於Raft——查找可理解的一致性算法。

Raft協議概述

Raft是一種基於Paxos的一致性算法。與Paxos相比,Raft被設計成更少的狀態和更簡單、更易於理解的算法。

Raft節點有三種狀態:follower,candidate,leader.所有的節點初始被置於follower,在這個狀態下的節點都可以收到來自leader的Log並反饋。如果在一段時間沒有收到任何信息,那麽他就會變成candidate狀態。在candidate狀態下,一個節點向其他節點發送請求,這個節點就成為了leader。Leader必須接收新Log並復制其到其他follower那裏。PS:只有leader才能進行讀取Log。

一旦一個集群有一個leader,他就可以接受新的Log條目。一個客戶端可以請求leader附加新的Log條目。這個leader隨後將Log條目寫入持久存儲,並復制到follower。一旦Log條目被認為已經提交,它就會被用於有限狀態機。有限狀態機是相對於特定應用的,對於Consul而言,我們使用MenDB來維護集群狀態。

顯然,我們不需要無限制的復制日誌。Raft提供了一種機制,通過這種機制,讓狀態被記錄時這個Log就會被壓縮。

網絡坐標

Consul使用網絡斷層成像系統計算集群中的節點的網絡坐標。這些坐標可以計算在任何兩個節點之間估計網絡往返時間。這有很多有用的應用,例如找到最靠近請求節點的服務節點,或者找到在下一個失效的最接近的數據中心中的服務器。

Consul的網絡坐標

在Consul裏,網絡坐標有幾種形式:

consul rtt命令可以查詢任意兩個節點的網絡往返之間。

顯示端點和端點運行狀況端點可以使用“?near =”參數根據給定節點的網絡往返時間對查詢的結果進行排序。

查詢可以根據網絡往返時間將請求從故障的數據中心服務器中轉移。

坐標終點顯示用於其他應用程序的原始網絡坐標。

Session

Consul提供了Session機制用於構建分布式鎖,Session作為節點之間的綁定,運行狀況檢查和鍵值對數據。

Session設計

Consul的session代表了具體語義一個Session中包含了節點名稱,列表的健康性,行為,TTL和lock-delay。新建的Session中提供了一個可以用來識別它的ID。這個ID可與存儲的鍵值對一起使用以獲取鎖定:相互排斥的咨詢機制。

下圖是組件之間的關系圖:

技術分享圖片

Consul定制的標準在下列情況下,被定義為無效:

  • 節點被註銷

  • 所有的健康檢查都被註銷

  • 所有健康檢查都在危險狀態

  • Session被明確銷毀了

  • TTL過期

Session無效的時候,將會被銷毀,關聯鎖是創建的指定行為,Consul支持發布和刪除。Consul支持釋放和刪除行為,如果沒有特別指定,默認的行為為釋放。

如果正在執行釋放操作,與Session相關的所有的鎖都會被釋放掉,並且鍵的索引無法遞增。在刪除行為執行的時候,則鎖和鍵都會被刪除。這可以用於Consul自動刪除條目。

這種設計常用於流言傳播的故障檢測器的健康監測。在默認情況下,使用基於留言傳播的故障檢測器作為故障檢測器用來進行相關的健康檢查。該故障檢測器允許Consul檢測持有鎖的節點在發生故障時自動釋放鎖。這種機制讓consul發生故障或者其他失敗的情況下,可以繼續運行下去。但是,由於,沒有完美的故障檢測器,有的時候,檢測到的故障並不存在,也會導致鎖的釋放。這就意味著他並不是絕對安全的。

相反的,可以創建一個無關聯的健康檢測的session。這就提供了對安全性要求的虛假的不健康檢測的消除提供了可能。即使現有的鎖的持有者執行出現故障,你也可以自己確定是否釋放Consul的鎖。由於Consul的API可以強制銷毀session,所以我們可以在發生故障的時候進行人為幹預,防止split-brain。

第三個健康檢測機制是session的TTL。當創建一個session的時候,一個TTL也被指定。如果這個TTL的間隔時間到而沒有更新,則session過期,並且無法早觸發。這種類型的故障檢測器叫做心跳檢測器。他想必基於流言傳播的故障檢測器的可擴展性低,因為他會對服務器造成更大的負擔,但是在一些情況下很有用。TTL是session過期的時間,在到達TTL之前,consul不會讓session過去,但是consul允許延遲過期。在session創建初期,session更新和leader故障轉移的時候,TTL會更新。當一個TTL被使用的時候,客戶端應當註意時間的偏差——時間不可能會像consul Server上那樣在客戶端上以相同的速率進展。我們最好設置保守的TTL值,TTL更新之前考慮時間的偏差。

最後的細微差別為session會提供鎖定延遲。這個延遲會持續0-60秒。當有無效的session時,consul會防止ssession在鎖定延時的時間內重新獲取之前的保存的所有鎖。這種延遲的目錄是允許潛在的leader檢測到無效後,停止並導致狀態不一致的請求。雖然不是一個徹底的方式,但是可以減少很多問題。延遲默認為15秒,客戶端可以將延遲設置為0來取消這個機制。

安全模型

Consul使用了流言傳播協議和RPC來提供各種功能。這兩個系統在設計上采用了不同的安全機制,但是,Consul的安全機制完成的共同目標為:提供機密性,完整性和認證。流言傳播協議由serf提供支持,serf使用對稱秘鑰或者共享密碼系統。RPC支持使用可選客戶端認證的端到端的TLS。

這就意味著Consul有完善的安全機制可以使其在不可信的網絡上運行。

威脅模型

以下是威脅模型:

  • 非成員可以訪問數據

  • 由於惡意郵件導致集群被操控

  • 惡意郵件造成的虛假數據

  • 對接點拒接服務

命令行

Consul命令行

Consul使用命令行非常容易操作,我們可以通過命令consul進行命令行申請。然後接著使用agent或者member之類的子命令。只要運行不帶參數的consul命令就可以查看命令列表。

$ consul
usage: consul [--version] [--help] <command> [<args>]Available commands are:
    agent          Runs a Consul agent
    configtest     Validate config file
    event          Fire a new event
    exec           Executes a command on Consul nodes
    force-leave    Forces a member of the cluster to enter the "left" state
    info           Provides debugging information for operators
    join           Tell Consul agent to join cluster
    keygen         Generates a new encryption key
    keyring        Manages gossip layer encryption keys
    kv             Interact with the KV store
    leave          Gracefully leaves the Consul cluster and shuts down
    lock           Execute a command holding a lock
    maint          Controls node or service maintenance mode
    members        Lists the members of a Consul cluster
    monitor        Stream logs from a Consul agent
    operator       Provides cluster-level tools for Consul operators
    reload         Triggers the agent to reload configuration files
    rtt            Estimates network round trip time between nodes
    version        Prints the Consul version
    watch          Watch for changes in Consul

想要獲得的頂的命令的幫助,可以使用-h獲取幫助,如下:

$ consul join -h

Agent

Agent是Consul的核心,用來運行代理者,維護成員的信息,運行檢測,處理查詢信息等。

catalog

consul catalog

該命令用來接Consul目錄進行交互。

列出數據中心

consul catalog datacenters

列出節點

consul catalog nodes

列出所有提供服務的節點

consul catalog nodes -service=redis

列出所有的服務器

consul catalog services

Event

consul event

event提供了一種將自定義用戶事件觸發到整個數據中心的機制,這些事件對Consul是不透明的,但它們可用於構建腳本基礎架構,以進行自動部署,重新啟動服務或執行任何其他編排操作。Event可以通過使用watch來處理。event的傳播是通過流言傳播協議的。

Exec

consul exec

exec命令提供了遠程執行的機制。下表顯示了執行此命令索要的ACL。

ACL Required範圍
agent:read本地agent
session:write本地agent
key:write"_rexec"字首
event:write"_rexec"字首

info

consul info

info命令提供了對運算符有用的各種調試信息。根據代理是客戶端還是服務器,將返回不同的子系統信息。目前有幾個頂級的鍵:

  • agent:提供有關agent的信息

  • consul:有關consul的信息——客戶端或者服務器端

  • raft:提供有關Raft公共信息

  • serf_lan:提供有關LAN流言池的信息

  • serf_wandf:提供有關WAN流言池的信息

join

consul join

join命令讓Consul代理加入一個現有集群,新的Consul代理必須與集群的至少一個現有成員共同參與現有的集群。加入該成員後,流言層接管,跨集群傳播更新成員的資格狀態。如果沒有加入現有的集群,則代理是自己的孤立集群的一部分,其他節點可以加入。

代理可以加入其它的代理。如果已經是集群的一部分的節點加入了另一個節點,則兩個節點的集群將加入成為一個集群。

Keygen

consul keygen

keygen命令生成可用於Consul代理流量加密的加密秘鑰。

Keyring

consul keyring

keyring命令用於檢查和修改Consul的流言池中使用的加密密鑰。

Lock

lock命令提供了簡單分布式鎖定的機制。在KV存儲中的給定前綴創建鎖(或信號量),只有當被保持時,才會調用子進程。如果鎖丟失或通信中斷,則子進程終止。鎖定器的數量可以使用-n標誌進行配置。默認情況下,允許單個持有人,並且使用鎖來進行互斥。這使用leader選舉算法。

member

menber命令輸出Consul代理人知道的當前成員名單及其狀態。節點的狀態只能是“alive”,“left”或“failed”。

Monitor

monitor命令用於連接和跟蹤正在運行的Consul代理的日誌。Monitor將顯示最近的日誌,然後繼續遵循日誌,不會退出直到中斷或直到遠程代理退出。

reload

reload命令觸發代理程序重新加載配置文件。

Snapshot

snapshot命令具有用於保存,恢復和檢查Consul服務器的狀態用於容災恢復的子命令。這些是原子的時間點快照,其中包括鍵值條目,服務目錄,準備好的查詢,會話和ACL。 Consul 0.7.1及更高版本中提供此命令。

Agent

Consul的Agent是Consul的核心。Agent維護成員的信息,註冊服務,運行檢測,響應查詢。Agent必須作為Consul集群的一部分的每個節點上運行。任何代理可以以兩種模式之一運行:客戶端或者服務器。服務器節點承擔了協商一致性的功能。這些節點參與了Raft,並在故障下提供了強大的一致性和可用性。服務器節點負擔越來越大意味著需要在專用的實例上運行——他們比客戶端節點更為資源密集。客戶端節點構成了大多數的集群,並且它們很輕量,因為它們大多數操作的是服務器節點接口,維護自己狀態的時間很少。


參考地址:http://www.cnblogs.com/Summer7C/p/7327109.html


consul(一)什麽是consul