Consul的使用姿勢(shì)

一. Consul的介紹

1.1 什么是Consul

image

圖 - 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)然!它是開源的。

image

圖 - 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:

image

圖 - consul members 命令行示意圖

image

圖 - 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)呢?

image

圖 - 一種常見的架構(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)。

image

圖 - 服務(wù)注冊(cè),服務(wù)發(fā)現(xiàn)和健康檢查的一般架構(gòu)

image

圖-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í)例。

image

圖 - 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的工具。

image

圖 - 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ù)崩潰的概率。

image

圖 - 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)行

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容