介紹
功能介紹
Consul一款服務發現和配置的工具,其使用Golang實作,天然具備可移植性,安裝包僅有一個可執行檔案,部署方便,可與docker等輕量級容器無縫配合, 它提供了幾個關鍵功能:
-
服務發現:Consul client 可以提供服務,例如api或mysql,也可以使用Consul client來發現指定服務的提供者, 使用DNS或HTTP,應用程式可以輕松找到他們所依賴的服務,
-
健康檢查:Consul client 可以提供任何數量的健康檢查,或者與給定的服務(“Web服務器是否回傳200 OK”),或與本地節點(“記憶體利用率是否低于90%”)相關聯, 可以使用此資訊來監控集群運行狀況,服務發現組件使用此資訊將流量從有問題的主機中移除出去,
-
KV Store:應用程式可以使用Consul的分層鍵/值存盤,包括動態配置,功能標記,協調,leader選舉等等, 簡單的HTTP API使其易于使用,
-
多資料中心:Consul支持多個資料中心, 這意味著Consul的用戶不必擔心構建額外的抽象層以擴展到多個區域,

競品比較
| 功能 | Consul | zookeeper | etcd | euerka |
|---|---|---|---|---|
| Health Check | 服務狀態,記憶體,硬碟等 | 長連接,keepalive | 連接心跳 | 可配支持 |
| Data Center | √ | × | × | × |
| KV Store | √ | √ | √ | × |
| 一致性 | raft | paxos | raft | × |
| cap | ca | cp | cp | ap |
| 使用介面 | http,dns | 客戶端 | http,grpc | http(didecar) |
| watch | 全量/支持long polling | √ | 支持long polling | 支持long polling/大部分增量 |
| 自身監控 | metrics | × | metrics | metrics |
| 安全 | acl/https | acl | https支持(弱) | × |
角色與架構

-
Agent
agent是一直運行在Consul集群中每個成員上的守護行程,通過運行 consul agent 來啟動,agent可以運行在client或者server模式,指定節點作為client或者server是非常簡單的,除非有其他agent實體,所有的agent都能運行DNS或者HTTP介面,并負責運行時檢查和保持服務同步,
-
Client
表示consul的client模式,就是客戶端模式,一個Client是一個轉發所有RPC到server的代理,這個client是相對無狀態的,client唯一執行的后臺活動是加入LAN gossip池,這有一個最低的資源開銷并且僅消耗少量的網路帶寬,這種模式下,所有注冊到當前節點的服務會被轉發到SERVER,不持久化資訊, -
Server
表示consul的
server模式,表明這個consul是個server,server是一個有一組擴展功能的代理,這些功能包括參與Raft選舉,維護集群狀態,回應RPC查詢,與其他資料中心互動WAN gossip和轉發查詢給leader或者遠程資料中心,它會把所有的資訊持久化的本地,這樣遇到故障,資訊是可以被保留的, -
SERVER-LEADER
SERVER-LEADER是該DataCenter的Leader,它需要負責同步注冊的資訊給其它的SERVER,同時也要負責各個節點的健康監測,
-
DataCenter
雖然資料中心的定義是顯而易見的,但是有一些細微的細節必須考慮,例如,在EC2中,多個可用區域被認為組成一個資料中心?我們定義資料中心為一個私有的,低延遲和高帶寬的一個網路環境,這不包括訪問公共網路,但是對于我們而言,同一個EC2中的多個可用區域可以被認為是一個資料中心的一部分,
-
Raft
Consul通過
Raft來保證各節點的資料一致性, -
Consensus
在我們的檔案中,我們使用Consensus來表明就leader選舉和事務的順序達成一致,由于這些事務都被應用到有限狀態機上,Consensus暗示復制狀態機的一致性,
-
Gossip
Consul建立在Serf的基礎之上,它提供了一個用于多播目的的完整的gossip協議,Serf提供成員關系,故障檢測和事件廣播,Consul使用
gossip協議管理成員關系、廣播訊息到整個集群,他有兩個gossip pool(LANpool和WANpool),LAN pool是同一個資料中心內部通信的,WAN pool是多個資料中心通信的,LAN pool有多個,WAN pool只有一個, -
LAN Gossip
它包含所有位于同一個局域網或者資料中心的所有節點,
-
WAN Gossip
它只包含Server,這些server主要分布在不同的資料中心并且通常通過因特網或者廣域網通信,
-
RPC
遠程程序呼叫,這是一個允許client請求server的請求/回應機制,
-
服務注冊
Consul支持兩種方式實作服務注冊,一種是通過consul的服務注冊http API,由服務自己呼叫API實作注冊,另一種方式是通過json個是的組態檔實作注冊,將需要注冊的服務以json格式的組態檔給出,官方建議使用第二種方式,
-
服務發現
consul支持兩種方式實作服務發現,一種是通過http API來查詢有哪些服務,另外一種是通過consul agent 自帶的DNS(8600埠),域名是以
NAME.service.consul的形式給出,NAME即在定義的服務組態檔中,服務的名稱,DNS方式可以通過check的方式檢查服務,
注意
- 每個資料中心官方建議需要3或5個server節點以保證資料安全,同時保證server-leader的選舉能夠正確的進行,如果增加越多的機器,則Consensus會越來越慢,對client沒有限制,可以很容易地擴展到成千上萬或數萬,
- 同一個資料中心的所有節點都要加入Gossip協議,這意味著gossip pool包含給定資料中心的所有節點,有以下目的:首先,沒有必要為client配置服務器地址引數;發現是自動完成的,第二,節點故障檢測的作業不是放置在服務器上,而是分布式的,這使故障檢測比心跳機制更可擴展性,第三,可用來作為訊息層通知重要的事件,如leader選舉,
- 每個資料中心的服務器都是屬于一個Raft peer,這意味著,他們一起作業,選出一個的Leader,Leader server是有額外的職責,負責處理所有的查詢和事務,事務也必須通過Consensus協議復制到所有的伙伴,由于這一要求,當非Leader Server接收到一個RPC請求,會轉發到集群的leader,
- Server節點也是作為WAN gossip pool的一部分,這個pool是與LAN gossip pool是不同的,它為具有更高延遲的網路回應做了優化,并且可能包括其他consul集群的server節點,設計WANpool的目的是讓資料中心能夠以low-touch的方式發現彼此,將一個新的資料中心加入現有的WAN Gossip是很容易的,因為池中的所有Server都是可控制的,這也使跨資料中心的要求,當一個Serfer接收到不同的資料中心的要求時,它把這個請求轉發給相應資料中心的任一Server,然后,接收到請求的Server可能會轉發給Leader,
- 多個資料中心之間是低耦合,但由于故障檢測、連接快取復用、跨資料中心要求快速和可靠的回應,
搭建
使用VirtualBox虛擬機
首先應該下載好你所使用的的系統鏡像,我比較熟悉CentOS,因此我下載了CentOS 7,
新建虛擬機
在新建虛擬機這里,我需要偷個懶,因為各個節點的環境都是一致的,而VirtualBox有個復制功能,因此我新建了個模板虛擬機,配置好基礎環境,以后需要的時候就可以直接復制一臺出來了,


修改網卡模式

如上圖所示,我選擇了橋接模式,之所以是網卡3,是因為我之前分別用網卡1、網卡2嘗試了NAT和Host-Only Adapter模式,

然后啟動虛擬機,安裝系統,配置好基礎環境即可,如更換軟體源、系統更新、安裝必須軟體等,
安裝必須軟體
yum install -y wget
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
yum clean all
yum makecache
yum upgrade -y
yum update -y
yum install -y curl vim zip unzip yum-utils bash-completion screen net-tools
關閉防火墻
systemctl stop firewalld && systemctl disable firewalld
復制節點
我需要5個節點,因此復制出了5臺虛擬機,

需要注意的是,復制時MAC地址設定請選擇為所有網卡重新生成MAC地址,


VirtualBox可使用無界面啟動,啟動后點擊顯示,打開虛擬機界面,
修改主機名
vim /ect/hostname // 修改主機名
reboot //修改成功后,重啟生效
獲取機器的Ip地址
// 需要安裝 net-tools,需要使用ipconfig命令,如有,請略過
yum install -y net-tools
// 運行ipconfig,獲取IP地址
ipconfig
安裝screen
// 用于后臺運行Consul,如有,請略過
yum install -y screen
安裝Consul
// 在screen中使用Consul
screen
// 安裝 Consul
wget https://releases.hashicorp.com/consul/1.3.0/consul_1.3.0_linux_amd64.zip && unzip consul_1.3.0_linux_amd64.zip
以上為每臺機器都需要執行的共同操作,
分別運行Consul
./consul agent -server -ui -bootstrap-expect=2 -data-dir=/tmp/consul -node=consul-1 -client=0.0.0.0 -bind=192.168.3.189 -datacenter=dc1
./consul agent -server -ui -bootstrap-expect=2 -data-dir=/tmp/consul -node=consul-2 -client=0.0.0.0 -bind=192.168.3.190 -datacenter=dc1 -join 192.168.3.189
./consul agent -server -ui -bootstrap-expect=2 -data-dir=/tmp/consul -node=consul-3 -client=0.0.0.0 -bind=192.168.3.191 -datacenter=dc1 -join 192.168.3.189
./consul agent -bind 192.168.3.192 -client 192.168.3.194 -data-dir=/tmp/consul -node=Test.Client.DEV -join 192.168.3.189
./consul agent -bind 192.168.3.193 -client 192.168.3.196 -data-dir=/tmp/consul -node=Test.Client.PRD -join 192.168.3.189
Consul啟動引數說明
| 啟動引數 | 說明 |
|---|---|
| -advertise | 通知展現地址用來改變我們給集群中的其他節點展現的地址,一般情況下-bind地址就是展現地址 |
| -bootstrap | 用來控制一個server是否在bootstrap模式,在一個datacenter中只能有一個server處于bootstrap模式,當一個server處于bootstrap模式時,可以自己選舉為raft leader |
| -bootstrap-expect | 在一個datacenter中期望提供的server節點數目,當該值提供的時候,consul一直等到達到指定sever數目的時候才會引導整個集群,該標記不能和bootstrap公用 |
| -bind | 該地址用來在集群內部的通訊,集群內的所有節點到地址都必須是可達的,默認是0.0.0.0 |
| -client | consul系結在哪個client地址上,這個地址提供HTTP、DNS、RPC等服務,默認是127.0.0.1 |
| -config-file | 明確的指定要加載哪個組態檔 |
| -config-dir | 組態檔目錄,里面所有以.json結尾的檔案都會被加載 |
| -data-dir | 提供一個目錄用來存放agent的狀態,所有的agent允許都需要該目錄,該目錄必須是穩定的,系統重啟后都繼續存在 |
| -dc | 該標記控制agent允許的datacenter的名稱,默認是dc1 |
| -encrypt | 指定secret key,使consul在通訊時進行加密,key可以通過consul keygen生成,同一個集群中的節點必須使用相同的key |
| -join | 加入一個已經啟動的agent的ip地址,可以多次指定多個agent的地址,如果consul不能加入任何指定的地址中,則agent會啟動失敗,默認agent啟動時不會加入任何節點, |
| -retry-join | 和join類似,但是允許你在第一次失敗后進行嘗試 |
| -retry-interval | 兩次join之間的時間間隔,默認是30s |
| -retry-max | 嘗試重復join的次數,默認是0,也就是無限次嘗試 |
| -log-level | consul agent啟動后顯示的日志資訊級別,默認是info,可選:trace、debug、info、warn、err |
| -node | 節點在集群中的名稱,在一個集群中必須是唯一的,默認是該節點的主機名 |
| -protocol | consul使用的協議版本 |
| -rejoin | 使consul忽略先前的離開,在再次啟動后仍舊嘗試加入集群中 |
| -server | 定義agent運行在server模式,每個集群至少有一個server,建議每個集群的server不要超過5個 |
| -syslog | 開啟系統日志功能,只在linux/osx上生效 |
| -ui | 使用自帶的ui |
| -ui-dir | 提供存放web ui資源的路徑,該目錄必須是可讀的 |
| -pid-file | 提供一個路徑來存放pid檔案,可以使用該檔案進行SIGINT/SIGHUP(關閉/更新)agent |
命令使用
查看所有Consul成員
./consul members
Node Address Status Type Build Protocol DC Segment
consul-1 192.168.3.189:8301 alive server 1.3.0 2 dc1 <all>
consul-2 192.168.3.190:8301 alive server 1.3.0 2 dc1 <all>
consul-3 192.168.3.191:8301 alive server 1.3.0 2 dc1 <all>
Test.Client.DEV 192.168.3.194:8301 alive client 1.3.0 2 dc1 <default>
Test.Client.PRD 192.168.3.196:8301 alive client 1.3.0 2 dc1 <default>
查看Consul成員型別
./consul operator raft list-peers
Node ID Address State Voter RaftProtocol
consul-1 b686d2b3-70eb-e4a4-fe4e-71059e0b4eb7 192.168.3.189:8300 leader true 3
consul-2 39a45ff0-b8c8-5b4c-ac54-8eb35f046a59 192.168.3.190:8300 follower true 3
consul-3 8450e6b7-30f0-92c2-d273-ccb9589272b7 192.168.3.191:8300 follower true 3
由上可知192.168.3.189是現有集群的leader,那當現有的leader宕機后,會有什么措施呢?那我們就把189重啟下試試:
Node ID Address State Voter RaftProtocol
consul-1 b686d2b3-70eb-e4a4-fe4e-71059e0b4eb7 192.168.3.189:8300 follower true 3
consul-2 39a45ff0-b8c8-5b4c-ac54-8eb35f046a59 192.168.3.190:8300 follower true 3
consul-3 8450e6b7-30f0-92c2-d273-ccb9589272b7 192.168.3.191:8300 leader true 3
可以看到,leader已經變成了192.168.3.191
通過Web UI查看服務狀態
訪問任意一臺 http://[server ip]:8500都可以查看,如 http://192.168.3.189:8500


退出Consul
// 假設client地址是 192.168.3.189
// 使用 leave 優雅的通知集群
./consul leave -http-addr=192.168.3.189:8500
如果使用screen,則可以Ctrl+C直接退出
參考
.NET Core微服務之路:基于Consul最少集群實作服務的注冊與發現(一)
微服務之:從零搭建ocelot網關和consul集群
搭建consul 集群
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/575.html
標籤:其他
