一. Consul的介紹
1.1 什么是Consul
圖 - Consul的Logo
“Consul is a service networking solution to connect and secure services across any runtime platform and public or private cloud.” 這句是官網(wǎng)[1]給的定義。當(dāng)然!它是開源的。
圖 - HashiCorp公司Logo
在官網(wǎng)上筆者發(fā)現(xiàn)了HashiCorp的公司Logo。由于是第一次看知道這個(gè)公司,特意百度了一下[2]:HashiCorp是由Mitchell Hashimoto和Armon Dadgar聯(lián)合創(chuàng)辦,總部位于美國(guó)舊金山,致力于為企業(yè)提供服務(wù),通過數(shù)據(jù)中心管理技術(shù)研發(fā),讓開發(fā)者通過工具構(gòu)建完整的開發(fā)環(huán)境,提高開發(fā)效率。公司所提供的主要企業(yè)服務(wù)包括應(yīng)用程序開發(fā)、交付和維護(hù),使用的DevOps 基礎(chǔ)設(shè)施工具主要包括Vagrant、Packer 、 Terraform 、Serf 、Consul , Vault 和 Nomad 等。根據(jù)18年的新聞[3],公司估值19億美元。
Consul 使用 Go 語言編寫,因此具有天然可移植性,安裝的時(shí)候只有一個(gè)可執(zhí)行文件,方便部署,與 Docker 等輕量級(jí)容器可無縫配合。[5]
1.2 Consul的角色
agent: 客戶端, 無狀態(tài), 將 HTTP 和 DNS 接口請(qǐng)求轉(zhuǎn)發(fā)給局域網(wǎng)內(nèi)的服務(wù)端集群。
server: 服務(wù)端, 保存配置信息, 高可用集群, 在局域網(wǎng)內(nèi)與本地客戶端通訊, 通過廣域網(wǎng)與其他數(shù)據(jù)中心通訊。每個(gè)數(shù)據(jù)中心的 server 數(shù)量推薦為 3 個(gè)或是 5 個(gè)。
Consul 使用 Go 語言編寫,因此具有天然可移植性,安裝的時(shí)候只有一個(gè)可執(zhí)行文件,方便部署,與 Docker 等輕量級(jí)容器可無縫配合。[5]
二. Consul集群部署
2.1 在ubuntu上部署Consul
(1)下載Consul軟件包(本文使用的Consul版本為1.5.1),解壓縮[6]
(2)上傳至各臺(tái)機(jī)器
(3)mv consul /usr/local/bin
(4)配置如下環(huán)境變量/etc/profile
export CONSUL_HOME=/usr/local/bin/consul
export PATH=$PATH:CONSUL_HOME
source /etc/profile # 使配置生效
2.2 啟動(dòng)server
啟動(dòng)第一個(gè)server:
consul agent -server -ui -bootstrap-expect=3 -data-dir=/data/consul -node=agent-1 -client=0.0.0.0 -bind=IP-1 -datacenter=dc1
啟動(dòng)第二個(gè)server:
consul agent -server -ui -bootstrap-expect=3 -data-dir=/data/consul -node=agent-2 -client=0.0.0.0 -bind=IP-2 -datacenter=dc1 -join IP-1
參數(shù)解釋:
bootstrap-expect:集群期望的節(jié)點(diǎn)數(shù),只有節(jié)點(diǎn)數(shù)量達(dá)到這個(gè)值才會(huì)選舉leader。
server:運(yùn)行在server模式
data-dir:指定數(shù)據(jù)目錄,其他的節(jié)點(diǎn)對(duì)于這個(gè)目錄必須有讀的權(quán)限
node:指定節(jié)點(diǎn)的名稱
bind:為該節(jié)點(diǎn)綁定一個(gè)地址
config-dir:指定配置文件,定義服務(wù)的,默認(rèn)所有.json結(jié)尾的文件都會(huì)讀
enable-script-checks=true:設(shè)置檢查服務(wù)為可用
datacenter: 數(shù)據(jù)中心沒名稱,
join:加入到已有的集群中
2.3 啟動(dòng)agent
consul agent -data-dir=/data/consul -node=agent-4 -client=0.0.0.0 -bind=IP -datacenter=dc1 -join IP-1
2.4 查看集群的各個(gè)節(jié)點(diǎn)
consul members:
圖 - consul members 命令行示意圖
圖 - Consul節(jié)點(diǎn)UI示意圖
三. 有了Consul能做什么?
1. 服務(wù)注冊(cè)和服務(wù)發(fā)現(xiàn)
2. 健康檢查
3. 統(tǒng)一配置中心
3.1 服務(wù)注冊(cè)和服務(wù)發(fā)現(xiàn)
“注冊(cè)”這個(gè)詞讓筆者馬上想到的是“新生注冊(cè)”,根據(jù)百度漢語釋義:“把名字記入簿冊(cè)”;所以可以將服務(wù)注冊(cè)看作“把服務(wù)信息存儲(chǔ)到某個(gè)地方”的過程。如果這個(gè)地方是數(shù)據(jù)庫,那注冊(cè)不就是“Insert”嘛。而服務(wù)發(fā)現(xiàn)其實(shí)就是一次將服務(wù)名稱作為查詢條件的“Query”。
為什么需要服務(wù)注冊(cè)和發(fā)現(xiàn)呢?
圖 - 一種常見的架構(gòu)
上圖最常見的架構(gòu)之一。以NGINX為例,在NGINX的配置文件中寫入{serviceB1,serviceB2...}的IP,端口等信息,{serviceC/frontend/...}只需要“知道”NGINX的地址而不用關(guān)心它調(diào)用服務(wù)的信息。
該架構(gòu)的問題在于:
(1)當(dāng)性能不足需要增加實(shí)例時(shí),NGINX需要修改配置文件并reload。
(2)當(dāng){serviceB,...}中有某些實(shí)例“掛了”,NGINX并不能“察覺”,仍然會(huì)有Request被分發(fā)到這些服務(wù)上,這些Request顯然不能被正常處理。
問題(1)中“修改配置文件并reload”的過程其實(shí)可以立即為“注冊(cè)和發(fā)現(xiàn)”的過程,顯然這會(huì)增加運(yùn)維的負(fù)擔(dān)?!癉RP”是一個(gè)很多人都知道的原則,一個(gè)很好的提升效率的方式就是避免重復(fù)勞動(dòng),所以需要將“注冊(cè)和發(fā)現(xiàn)”過程抽象為一個(gè)服務(wù),讓程序自動(dòng)完成這些工作。能完成“注冊(cè)和發(fā)現(xiàn)”任務(wù)的服務(wù)需要有哪些特點(diǎn)呢?我們先給這個(gè)服務(wù)命名為ServiceCenter。
由于所有的服務(wù)數(shù)據(jù)都會(huì)在ServiceCenter,所以它必須是分布式,高可用的。
幾乎都有的服務(wù)都會(huì)對(duì)并發(fā)有要求,所以ServiceCenter不能成為并發(fā)的“瓶頸”。
業(yè)界常用的服務(wù)注冊(cè)與服務(wù)發(fā)現(xiàn)工具有 ZooKeeper、etcd、Consul 和 Eureka等,這些工具基本都符合上述兩個(gè)特點(diǎn)。
圖 - 服務(wù)注冊(cè),服務(wù)發(fā)現(xiàn)和健康檢查的一般架構(gòu)
圖-Consul的服務(wù)注冊(cè)展示頁面
3.2 健康檢查(Health Check)
只有服務(wù)注冊(cè)和服務(wù)發(fā)現(xiàn)還是沒辦法解決前文的問題(2),注冊(cè)只能保證“一段時(shí)間”內(nèi)服務(wù)是可用的。好比:在外地工作需要辦居住證,隔一段時(shí)間就需要年審,年審之后居住證才能繼續(xù)生效,在現(xiàn)實(shí)生活中,這個(gè)時(shí)效一般是一年。但在計(jì)算機(jī)的世界里,對(duì)服務(wù)的“年審”一般是秒級(jí)的,通過的做法是定時(shí)(eg.每5s)像服務(wù)實(shí)例發(fā)送HTTP請(qǐng)求,服務(wù)如果返回正確的信息(eg.HTTP狀態(tài)碼為200)則“年審”通過,否則判定服務(wù)實(shí)例出現(xiàn)異常,需要將該實(shí)例下線(從數(shù)據(jù)庫的角度就是Update或者Delete操作),Request不再發(fā)送到該實(shí)例。
圖 - Consul健康檢查
3.3 統(tǒng)一配置中心
配置文件是編程中繞不開的一部分。簡(jiǎn)單的代碼或者寫得糙一些,配置可能直接寫死在代碼里了,當(dāng)涉及到復(fù)雜的項(xiàng)目,配置往往冗長(zhǎng),而且項(xiàng)目可能部署為多個(gè)實(shí)例(instance),所以配置的修改就會(huì)成為一個(gè)問題,所以需要統(tǒng)一配置中心。統(tǒng)一配置的方式?jīng)]有定法,本質(zhì)也是一個(gè)服務(wù)。所有的其它服務(wù)都需要去從這個(gè)服務(wù)讀取配置,這就要求:
(1)決不能有單點(diǎn)故障問題,分布式幾乎是唯一選擇;
(2)需要能夠支撐高并發(fā)。其實(shí)mysql,redis等等已經(jīng)可以滿足上述兩點(diǎn)了,但是為什么不?配置文件相對(duì)于業(yè)務(wù)數(shù)據(jù)來說占用的空間實(shí)在是太小了,筆者認(rèn)為沒有必要用專門的數(shù)據(jù)庫工具來解決這個(gè)問題。
Consul已經(jīng)可以在實(shí)踐中幫助我們解決服務(wù)注冊(cè)和發(fā)現(xiàn)的問題,又可以成為我們的統(tǒng)一配置中心,實(shí)在是一個(gè)非常nice的工具。
圖 - Consul kv配置中心的UI
四. Consul的特點(diǎn)
(1)Consul的功能非常完整,內(nèi)置了服務(wù)注冊(cè)與發(fā)現(xiàn)框架、分布一致性協(xié)議實(shí)現(xiàn)、健康檢查、Key/Value 存儲(chǔ)、多數(shù)據(jù)中心方案[5]
(2)一般,服務(wù)向本機(jī)所在Consul agent進(jìn)行注冊(cè),該agent將服務(wù)數(shù)據(jù)同步到server集群,并且由該agent對(duì)服務(wù)進(jìn)行健康檢查,其它agent和server集群并不參與對(duì)該agent的健康檢查,所以當(dāng)agent“掛了”之后,由該agent注冊(cè)的所有服務(wù)會(huì)不可用,其它agent和server集群也不會(huì)對(duì)這些服務(wù)進(jìn)行“接管”;當(dāng)然agent“掛了”的概率會(huì)遠(yuǎn)遠(yuǎn)小于服務(wù)崩潰的概率。
圖 - Consul服務(wù)注冊(cè),發(fā)現(xiàn)與健康檢查架構(gòu)圖
(3)與其他類似工具的比較,可參考[5],有時(shí)間以后再談。
Reference
[1]Consul官網(wǎng)
[2]HashiCorp百度百科
[3]投資者將HashiCorp作為下一個(gè)值得關(guān)注的初創(chuàng)公司
[4]百度漢語-注冊(cè)
[5]Eureka 2.X停止開發(fā),注冊(cè)中心Consul使用詳解
[6]Consul初探-從安裝到運(yùn)行