一、概述
consul是google開源的一個使用go語言開發的服務發現、配置管理中心服務。內置了服務註冊與發現框 架、分佈一致性協議實現、健康檢查、Key/Value存儲、多數據中心方案,不再需要依賴其他工具(比如ZooKeeper等)。服務部署簡單,只有一個可運行的二進制的包。每個節點都需要運行agent,他有兩種運行模式server和client。每個數據中心官方建議需要3或5個server節點以保證數據安全,同時保證server-leader的選舉能夠正確的進行
客戶端模式(client)
consul的client模式,就是客戶端模式。是consul節點的一種模式,這種模式下,所有註冊到當前節點的服務會被轉發到SERVER,本身是不持久化這些信息
服務端模式(server)
SERVER表示consul的server模式,表明這個consul是個server,這種模式下,功能和CLIENT都一樣,唯一不同的是,它會把所有的信息持久化的本地,這樣遇到故障,信息是可以被保留的
集羣模式 (server-leader)
consul 集羣主節點,它需要負責同步註冊的信息給其它的SERVER,同時也要負責各個節點的健康監測
raft(raft 節點數據一致性算法)
server節點之間的數據一致性保證,一致性協議使用的是raft,而zookeeper用的paxos,etcd採用的也是raft
服務發現協議
consul採用http和dns協議,etcd只支持http
服務註冊
consul支持兩種方式實現服務註冊,一種是通過consul的服務註冊http API,由服務自己調用API實現註冊,另一種方式是通過json個是的配置文件實現註冊,將需要註冊的服務以json格式的配置文件給出。consul官方建議使用第二種方式
服務發現
consul支持兩種方式實現服務發現,一種是通過http API來查詢有哪些服務,另外一種是通過consul agent 自帶的DNS(8600端口),域名是以NAME.service.consul的形式給出,NAME即在定義的服務配置文件中,服務的名稱。DNS方式可以通過check的方式檢查服務
服務間的通信協議
Consul使用gossip協議管理成員關係、廣播消息到整個集羣,他有兩個gossip pool(LAN pool和WAN pool),LAN pool是同一個數據中心內部通信的,WAN pool是多個數據中心通信的,LAN pool有多個,WAN pool只有一個
二 .consul集羣安裝
官網下載地址:consul下載地址
直接下載zip包,解壓後只有一個可執行的文件consul,將consul添加到系統的環境變量裏面即安裝完成
#unzip consul_1.2.3_linux_amd64.zip
#cp -a consul /usr/bin
consul必須啓動agent才能使用,有兩種啓動模式server和client,還有一個官方自帶的ui。server用與持久化服務信息,集羣官方建議3或5個節點。client只用與於server交互。ui可以查看集羣情況的
環境準備:(服務端)
3個server節點:192.168.1.101,192.168.1.102,192.168.1.103
cn1:
#consul agent -bootstrap-expect 2 -server -data-dir /data/consul0 -node=cn1 -bind=192.168.1.102 -config-dir /etc/consul.d -enable-script-checks=true -datacenter=dc1
cn2:
#consul agent -server -data-dir /data/consul0 -node=cn2 -bind=192.168.1.101 -config-dir /etc/consul.d -enable-script-checks=true -datacenter=dc1 -join 192.168.1.102
cn3:
#consul agent -server -data-dir /data/consul0 -node=cn3 -bind=192.168.1.100 -config-dir /etc/consul.d -enable-script-checks=true -datacenter=dc1 -join 192.168.1.102
參數解釋:
-bootstrap-expect:集羣期望的節點數,只有節點數量達到這個值纔會選舉leader。
-server: 運行在server模式
-data-dir:指定數據目錄,其他的節點對於這個目錄必須有讀的權限
-node:指定節點的名稱
-bind:爲該節點綁定一個地址
-config-dir:指定配置文件,定義服務的,默認所有一.json結尾的文件都會讀
-enable-script-checks=true:設置檢查服務爲可用
-datacenter: 數據中心沒名稱,
-join:加入到已有的集羣中
客戶端:
客戶端2個節點:192.168.1.199,192.168.1.198
#consul agent -data-dir /data/consul0 -node=cn4 -bind=192.168.1.199 -config-dir /etc/consul.d -enable-script-checks=true -datacenter=dc1 -join 192.168.1.202
client節點可以有多個,自己根據服務指定即可。
ui:
#consul agent -ui -data-dir /data/consul0 -node=cn4 -bind=192.168.1.198 -client 192.168.1.198 -config-dir /etc/consul.d -enable-script-checks=true -datacenter=dc1 -join 192.168.1.202
-ui:使用自帶的ui,
-ui-dir:指定ui的目錄,使用自己定義的ui
-client:指定web ui、的監聽地址,默認127.0.0.1只能本機訪問。
集羣創建完成後:
使用一些常用的命令檢查集羣的狀態:
#consul info
可以在raft:stat看到此節點的狀態是Fllower或者leader
#consul members
Node Address Status Type Build Protocol DC Segment
cn1 192.168.1.102:8301 alive server 1.0.2 2 dc1 <all>
cn2 192.168.1.101:8301 alive server 1.0.2 2 dc1 <all>
cn3 192.168.1.100:8301 alive client 1.0.2 2 dc1 <default>
新加入一個節點有幾種方式;
1、這種方式,重啓後不會自動加入集羣
#consul join 192.168.1.202
2、#在啓動的時候使用-join指定一個集羣
#consul agent -ui -data-dir /data/consul0 -node=cn4 -bind=192.168.1.198 -config-dir /etc/consul.d -enable-script-checks=true -datacenter=dc1 -join 192.168.1.202
3、使用-startjoin或-rejoin
#consul agent -ui -data-dir /data/consul0 -node=cn4 -bind=192.168.1.198 -config-dir /etc/consul.d -enable-script-checks=true -datacenter=dc1 -rejoin
consul 實例註銷
curl --request PUT http://ip:8500/v1/agent/service/deregister/instanceid
consul 註銷相關問題參考博客
http://blog.didispace.com/consul-deregister/
查看consul節點信息
curl 127.0.0.1:8500/v1/catalog/nodes
api