Consule 是什么
Consul包含多個組件,但是作為一個整體,為你的基礎設施提供服務發現和服務配置的工具.他提供以下關鍵特性:
-
服務發現 Consul 的客戶端可用提供一個服務,比如 api 或者mysql ,另外一些客戶端可用使用 Consul 去發現一個指定服務的提供者.通過 DNS 或者 HTTP 應用程序可用很容易的找到他所依賴的服務.
-
健康檢查 Consul 客戶端可用提供任意數量的健康檢查,指定一個服務(比如: webserver 是否返回了200 OK 狀態碼)或者使用本地節點(比如:內存使用是否大於90%). 這個信息可由 operator用來監視集群的健康.被服務發現組件用來避免將流量發送到不健康的主機.
-
Key/Value存儲 應用程序可用根據自己的需要使用 Consul 的層級的 Key/Value 存儲.比如動態配置,功能標記,協調,領袖選舉等等,簡單的 HTTP API 讓他更易於使用.
-
多數據中心: Consul支持開箱即用的多數據中心.這意味着用戶不需要擔心需要建立額外的抽象層讓業務擴展到多個區域.
Consul面向DevOps和應用開發者友好.是他適合現代的彈性的基礎設施.
基礎架構
Consul是一個分布式高可用的系統. 這節將包含一些基礎,我們忽略掉一些細節這樣你可以快速了解Consul是如何工作的.如果要了解更多細節,請參考深入的架構描述.
每個提供服務給Consul的階段都運行了一個Consul agent . 發現服務或者設置和獲取 key/value存儲的數據不是必須運行agent.這個agent是負責對節點自身和節點上的服務進行健康檢查的.
Agent與一個和多個Consul Server 進行交互.Consul Server 用於存放和復制數據.server自行選舉一個領袖.雖然Consul可以運行在一台server , 但是建議使用3到5台來避免失敗情況下數據的丟失.每個數據中心建議配置一個server集群.
你基礎設施中需要發現其他服務的組件可以查詢任何一個Consul 的server或者 agent.Agent會自動轉發請求到server .
每個數據中運行了一個Consul server集群.當一個跨數據中心的服務發現和配置請求創建時.本地Consul Server轉發請求到遠程的數據中心並返回結果.
使用 Consul
Consul集群的每個節點都必須先安裝Consul.安裝非常容易,Consul發布為所支持的平台和架構的二進制包.這個指南不包含從源代碼編譯Consul的內容。想要通過源代碼進行安裝,請參看 [官方文檔安裝手冊]
安裝 Consul
安裝Consul,到 [download consul 網址] 找到適合你系統的包下載他。Consul 打包為一個 ’Zip’ 文件。下載后解開壓縮包,拷貝Consul到你的 PATH 路徑中,在 Unix 系統中 ~/bin
和 /usr/local/bin
是通常的安裝目錄.根據你是想為單個用戶安裝還是給整個系統安裝來選擇.在Windows系統中有可以安裝到 %PATH%
的路徑中。
驗證 Consul
完成安裝后,通過打開一個新終端窗口檢查consul
安裝是否成功.通過執行 consul
你應該看到類似下面的輸出
如果你得到一個consul not be found
的錯誤,你的PATH
可能沒有正確設置.請返回檢查你的consul
的安裝路徑是否包含在PATH
中.
運行 Agent
完成 Consul 的安裝后,必須運行 agent.。agent 可以運行為 server 或 client 模式。每個數據中心至少必須擁有一台 server。建議在一個集群中有 3 或者 5 個server,原理其實和 zookeeper 類似。部署單一的server,在出現失敗時會不可避免的造成數據丟失。其他的 agent 運行為 client 模式。一個 client 是一個非常輕量級的進程。用於注冊服務,運行健康檢查和轉發對 server 的查詢。agent 必須在集群中的每個主機上運行。查看啟動數據中心的細節請查看 [官方文檔].
啟動 Agent
為了更簡單,現在我們將啟動 Consul agent 的開發模式。這個模式快速和簡單的啟動一個單節點的Consul。這個模式不能用於生產環境,因為他不持久化任何狀態.。
OS X用戶注意: Consul 使用你的主機hostname作為默認的節點名字.如果你的主機名包含時間,到這個節點的DNS查詢將不會工作.為了避免這個情況,使用 -node
參數來明確的設置node名.
如你所見,Consul Agent 啟動並輸出了一些日志數據。從這些日志中你可以看到,我們的 agent 運行在 server 模式並且聲明作為一個集群的 Leader。額外的本地成員也被標記為一個健康的成員。
也可以通過 -data-dir=/tmp/consul 來指定數據存放位置,對於 consul 的 web UI 必須要指定對應數據的存放位置。
集群成員
新開一個終端窗口運行 consul members
, 可以看到 Consul 集群的成員。下一節我們將講到加入集群,現在你應該只能看到一個成員,就是你自己:
這個輸出顯示我們自己的節點。運行的地址,健康狀態,自己在集群中的角色,版本信息。添加 -detialed
選項可以查看到額外的信息。
members
命令的輸出是基於 gossip 協議是最終一致的。意味着,在任何時候,通過你本地 agent 看到的結果可能不是准確匹配 server 的狀態。為了查看到一致的信息,使用HTTP API(將自動轉發)到Consul Server上去進行查詢:
除了HTTP API ,DNS 接口也可以用來查詢節點。注意:你必須確定將你的 DNS 查詢指向 Consul agent 的DNS服務器,這個默認運行在 8600
端口。DNS條目的格式(例如:”Armons-MacBook-Air.node.consul”)將在后面講到。
停止 Agent
你可以使用Ctrl-C 優雅的關閉Agent.。中斷Agent之后你可以看到他離開了集群並關閉。
在退出中,Consul 提醒其他集群成員,這個節點離開了。如果你強行殺掉進程。集群的其他成員應該能檢測到這個節點失效了。當一個成員離開,他的服務和檢測也會從目錄中移除。當一個成員失效了,他的健康狀況被簡單的標記為危險,但是不會從目錄中移除。Consul 會自動嘗試對失效的節點進行重連。允許他從某些網絡條件下恢復過來。離開的節點則不會再繼續聯系。
此外,如果一個 agent 作為一個服務器,一個優雅的離開是很重要的,可以避免引起潛在的可用性故障影響達成一致性協議。
查看這里了解添加和移除server.# 注冊服務
在之前的步驟我們運行了第一個agent。看到了集群的成員,查詢節點,在這里我們將注冊我們的第一個服務並查詢這些服務。
定義一個服務
可以通過提供服務定義或者調用 HTTP API 來注冊一個服務。服務定義文件是注冊服務的最通用的方式。所以我們將在這一步使用這種方式。我們將會建立在前一步我們覆蓋的代理配置。首先,為Consul配置創建一個目錄。Consul 會載入配置文件夾里的所有配置文件。在Unix系統中通常類似 /etc/consul.d
(.d 后綴意思是這個路徑包含了一組配置文件)。
$ sudo mkdir /etc/consul.d
然后,我們將編寫服務定義配置文件。假設我們有一個名叫 web
的服務運行在 80 端口。另外,我們將給他設置一個標簽。這樣我們可以使用他作為額外的查詢方式:
echo '{"service": {"name": "web", "tags": ["rails"], "port": 80}}' > /etc/consul.d/web.json
現在重啟agent , 設置配置目錄:
$ consul agent -dev -config-dir /etc/consul.d
==> Starting Consul agent...
...
[INFO] agent: Synced service 'web'
...
你可能注意到了輸出了 "synced" 了 web 這個服務。意思是這個 agent 從配置文件中載入了服務定義,並且成功注冊到服務目錄。
如果你想注冊多個服務,你應該在 Consul 配置目錄創建多個服務定義文件。
具體后續的可以參看:http://vnzmi.com/2016/08/16/consul-quick-guide/
后續會總結完善的