說明
本文介紹了一個服務發現和配置共享的軟體,簡單介紹了 Consul 的原理和使用, 一篇小文抛磚引玉,希望能吸引感興趣的童鞋一起探讨研究。
Consul 是什麼
Consul 是一個支援多資料中心分布式高可用的服務發現和配置共享的服務軟體,由 HashiCorp 公司用 Go 語言開發, 基于 Mozilla Public License 2.0 的協定進行開源. Consul 支援健康檢查,并允許 HTTP 和 DNS 協定調用 API 存儲鍵值對.
指令行超級好用的虛拟機管理軟體 vgrant 也是 HashiCorp 公司開發的産品.
一緻性協定采用 Raft 算法,用來保證服務的高可用. 使用 GOSSIP 協定管理成員和廣播消息, 并且支援 ACL 通路控制.
Consul 的使用場景
docker 執行個體的注冊與配置共享
coreos 執行個體的注冊與配置共享
vitess 叢集
SaaS 應用的配置共享
與 confd 服務內建,動态生成 nginx 和 haproxy 配置檔案
Consul 的優勢
使用 Raft 算法來保證一緻性, 比複雜的 Paxos 算法更直接. 相比較而言, zookeeper 采用的是 Paxos, 而 etcd 使用的則是 Raft.
支援多資料中心,内外網的服務采用不同的端口進行監聽。 多資料中心叢集可以避免單資料中心的單點故障,而其部署則需要考慮網絡延遲, 分片等情況等. zookeeper 和 etcd 均不提供多資料中心功能的支援.
支援健康檢查. etcd 不提供此功能.
支援 http 和 dns 協定接口. zookeeper 的內建較為複雜, etcd 隻支援 http 協定.
官方提供web管理界面, etcd 無此功能.
綜合比較, Consul 作為服務注冊和配置管理的新星, 比較值得關注和研究.
Consul 的角色
client: 用戶端, 無狀态, 将 HTTP 和 DNS 接口請求轉發給區域網路内的服務端叢集.
server: 服務端, 儲存配置資訊, 高可用叢集, 在區域網路内與本地用戶端通訊, 通過廣域網與其他資料中心通訊. 每個資料中心的 server 數量推薦為 3 個或是 5 個.
安裝 Consul
mac os x:
brew cask install consul
Linux 64bit:
wget https://dl.bintray.com/mitchellh/consul/0.4.1_linux_amd64.zip
unzip 0.4.1_linux_amd64.zip
sudo mv consul /bin
其他系統的安裝步驟,請參考官網文檔.
初體驗
啟動:
consul agent -server -bootstrap-expect 1 -data-dir /tmp/consul -node Litao-MacBook-Pro -dc sz-1
檢視成員:
consul members
檢視節點:
curl 127.0.0.1:8500/v1/catalog/nodes
使用DNS協定檢視節點資訊:
dig @127.0.0.1 -p 8600 Litao-MacBook-Pro.node.consul
注冊服務
注冊兩個 Mysql 服務的執行個體, 資料中心在 sz-1, 端口都是 3306. 具體為以下指令:
curl -X PUT -d '{"Datacenter": "sz-1", "Node": "mysql-1", "Address": \
"mysql-1.node.consul","Service": {"Service": "mysql", "tags": ["master","v1"], \
"Port": 3306}}' http://127.0.0.1:8500/v1/catalog/register
curl -X PUT -d '{"Datacenter": "sz-1", "Node": "mysql-2", "Address": \
"mysql-2.node.consul","Service": {"Service": "mysql", "tags": ["slave","v1"],\
"Port": 3306}}' http://127.0.0.1:8500/v1/catalog/register
curl http://127.0.0.1:8500/v1/catalog/service/mysql
[
{
"Address": "mysql-1.node.consul",
"Node": "mysql-1",
"ServiceID": "mysql",
"ServiceName": "mysql",
"ServicePort": 3306,
"ServiceTags": [
"master",
"v1"
]
},
{
"Address": "mysql-2.node.consul",
"Node": "mysql-2",
"ServiceID": "mysql",
"ServiceName": "mysql",
"ServicePort": 3306,
"ServiceTags": [
"slave",
"v1"
]
}
]
dig @127.0.0.1 -p 8600 mysql.service.consul SRV
; <<>> DiG 9.10.0-P2 <<>> @127.0.0.1 -p 8600 mysql.service.consul SRV
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<
;; flags: qr aa rd; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 2
;; WARNING: recursion requested but not available
;; QUESTION SECTION:
;mysql.service.consul. IN SRV
;; ANSWER SECTION:
mysql.service.consul. 0 IN SRV 1 1 3306 mysql-2.node.sz-1.consul.
mysql.service.consul. 0 IN SRV 1 1 3306 mysql-1.node.sz-1.consul.
;; ADDITIONAL SECTION:
mysql-2.node.sz-1.consul. 0 IN CNAME mysql-2.node.consul.
mysql-1.node.sz-1.consul. 0 IN CNAME mysql-1.node.consul.
;; Query time: 0 msec
;; SERVER: 127.0.0.1#8600(127.0.0.1)
;; WHEN: Tue Dec 02 16:42:38 CST 2014
;; MSG SIZE rcvd: 280
參考連結