使用Consul打造彈性可擴展的PaaS平臺

本文根據高效運維專家羣友文章整理併發布。歡迎關注「高效運維」公衆號,以搶先賞閱誠意滿滿的各類原創文章。node

做者介紹

杜威

程序員,混跡互聯網研發和運維近十年。《Linux系統案例精解》合著者之一。就任亮風臺,專一DevOps、雲計算、大數據等相關領域。nginx

應用背景

HiAR 是亮風臺打造的新一代加強現實(AR)開發平臺,提供簡單易用、功能強大、跨平臺的 AR 服務。讓廣大開發者能夠輕鬆使用最前沿的計算機視覺技術、計算機圖形學技術,快速搭建個性化的 AR 應用。程序員

7b0323749d1b3f05cf8f3aeb32b21cc5.png

雲服務是HiAR平臺中重要的基礎設施。不管從高可用,仍是到可擴展,服務發現都發揮着不可或缺的做用。在沒有使用服務發現以前,咱們遇到的幾個痛點:json

  • 系統添加一個服務節點,咱們須要手工修改Nginx/LVS的配置文件、修改DNS記錄。bootstrap

  • 應用服務發佈新版本,咱們仍是須要手工修改Nginx的配置文件把節點下線、等待發布成功後再次修改Nginx的配置文件把服務上線。架構

  • 儘管後來咱們對上面兩種場景的運維作了改進,編寫腳本把過程改良爲半自動半手動的方式,但還不是很方便,而結合服務註冊就能夠作到全自動。併發

  • 內網DNS出了故障,咱們須要對DNS服務進行維護。app

  • 沒有服務註冊,限制了Docker的發揮,只能當輕量級虛擬機來用。負載均衡

如今有了服務發現,一切都變得簡單有趣。增減服務節點能夠自動更新Nginx/LVS的配置文件;DNS丟一邊吧,用IP就好;接入Mesos+Docker玩彈性擴展。運維

爲何選擇 Consul

已經有不少文章對Zookeeper、etcd、Consul進行比較,這裏就不重複類比了。沒有什麼比合適更重要!Consul 的運維成本低,部署簡單、使用方便、五臟俱全,這對於中小型團隊應該是性價比很高的。

在進入實戰前,先看看 Consul 都有哪些特性。

  • 服務註冊。經過HTTP API或DNS,告訴服務註冊中心有新的服務加入;

  • 服務發現。經過HTTP API或DNS,能夠知道目標服務的地址和端口;

  • 健康檢查。支持多種方式,HTTP、TCP、Docker、Shell腳本定製化監控;

  • 配置模板。Consul Template 負責按期從服務註冊中心獲取信息,若是有變化自動更新配置文件並從新加載;

以上四點已經能知足不少企業的需求。固然這不是Consul的全部,Consul還有不少錦上添花的特性,好比:可視化Web界面、支持多數據中心。

實戰經驗

咱們對Consul的使用能夠概括到四個方面:部署、應用、管理、升級。

部署

d50b4fefc3e06594c12153949baeaa9b.jpeg

Consul Cluster有Server和Client兩種角色。Server通常是3~5臺,這也是官方推薦的。Consul Client就是須要進行服務註冊或服務發現的節點。

Consul的部署簡單、開箱即用,一個consul可執行文件,尚未亂七八糟的依賴。在官網下載編譯好的Consul agent可執行文件,並上傳到全部Server和Client角色的節點,便隨時可啓動consul agent了。

下面一塊兒來看看如何啓動一個Consul集羣(3臺Server、1臺Client)。

實驗環境:
    server01 192.168.1.11
    server02 192.168.1.12
    server03 192.168.1.13
    client01 192.168.1.21

分別登陸Server0一、Server0二、Server03,並啓動agent。

[worker@server01 ~]$ consul agent -server -bootstrap-expect 2 -data-dir /tmp/consul -bind=192.168.1.11 -node=server01

[worker@server02 ~]$ consul agent -server -bootstrap-expect 2 -data-dir /tmp/consul -bind=192.168.1.12 -node=server02

[worker@server03 ~]$ consul agent -server -bootstrap-expect 2 -data-dir /tmp/consul -bind=192.168.1.13 -node=server03

新開窗口登陸Server03,加入Server0一、Server02的集羣。

[worker@server03 ~]$ consul join 192.168.1.11 192.168.1.12

上面幾步就完成了初始化Server節點,之後經過-rejoin參數啓動,能夠從新加入集羣。

[worker@server01 ~]$ consul agent -server -bootstrap-expect 2 -data-dir /tmp/consul -bind=192.168.1.11 -node=server01 -rejoin

[worker@server02 ~]$ consul agent -server -bootstrap-expect 2 -data-dir /tmp/consul -bind=192.168.1.12 -node=server02 -rejoin

[worker@server03 ~]$ consul agent -server -bootstrap-expect 2 -data-dir /tmp/consul -bind=192.168.1.13 -node=server03 -rejoin

就這樣三個Server節點部署完畢。接下來部署Client節點,和Server節點同樣,有初次啓動、手工加入和從新加入集羣三步。

[worker@client01 ~]$ consul agent -data-dir /tmp/consul -bind=192.168.1.21 -node=client01

仍是在Client01上,新開一個登陸窗口,加入Server01的集羣。

[worker@client01 ~]$ consul join 192.168.1.11

Client01節點往後的維護,經過-rejoin參數啓動,即可從新加入集羣。

[worker@client01 ~]$ consul agent -data-dir /tmp/consul -bind=192.168.1.21 -node=client01 -rejoin

到這裏爲止,咱們已經搭建好了一個Consul集羣。然而怎麼進行服務註冊和服務發現呢?這得跟實際需求緊密結合,在接下來的小節中進一步說明。

應用

051cd324b541a360f8942108bee0935b.jpeg

Consul不是單獨存在的。爲了充分發揮Consul的優點,能夠結合Nginx、LVS、Docker等工具來應用。

Nginx、LVS是系統的基礎組件,RecoService、FeatureService、SearchService是基於SOA的內部服務。前者向Consul集羣發現服務,後者向Consul集羣註冊服務。Consul是粘合劑也是開關,讓整個系統的運做起來,低成本的實現了彈性伸縮。

接入層,用的是Nginx,負責反向代理和負載均衡。Nginx節點上跑兩個Consul相關服務。一個是Consul Agent,作Consul Client;另一個是Consul Template,作服務發現和配置更新。Consul Template負責按期查詢本地Consul Agent,若是相關服務的註冊信息有變化,則更新Nginx的配置文件並從新加載Nginx服務。

運行Consul Template是實現彈性擴展的關鍵步驟:

$ consul-template -consul 127.0.0.1:8500 -template "/etc/nginx/conf/vhosts/test.ctmpl:/etc/nginx/conf/vhosts/test.conf:nginx -s reload"

上面這句命令中,test.conf是Nginx的虛擬主機配置文件,test.ctmpl是該配置文件對應的模板。下面是模板在負載均衡上的代碼片斷:

upstream test-cluster { 
  ip_hash;{{range service "test"}} 
  server {{.Address}}:{{.Port}};{{end}}
}

邏輯層,基於SOA的內部服務集羣。不一樣的內部服務集羣之間通訊須要作服務發現,這裏引入LVS作服務發現。好處是不用在內部服務的代碼裏實現服務發現,並且規模大了還要作負載均衡。與接入層的Nginx相似,LVS也用Consul Template按期查詢本地Consul Agent,更新相關配置文件而後重載服務。

內部服務如何向服務中心註冊?有兩種方式,一是經過Consul的服務註冊HTTP API,由服務自身在啓動後調用API註冊本身,二是經過在配置文件中定義服務的方式進行註冊。建議使用後面一種方式來作服務註冊。怎麼辦到的?請繼續往下看 :)

爲項目添加一個配置文件consul.json,指定服務名稱和服務端口,並加上健康檢查,內容以下:

{
    "service": 
    {
        "name" : "test",
        "port" : 9999,
        "check": 
        {
          "tcp": "127.0.0.1:9999",
          "interval": "10s"
        }
    }
}

最後一步,對服務進行註冊,須要在Consul agent啓動時指定配置文件,以下:

$ consul agent -data-dir /tmp/consul -node=test -bind=192.168.1.21 -config-dir=/tmp/consul.json

管理

一是節點管理,也就是Consul進程的管理。因爲Consul Agent自己不具有高可用能力,因此咱們要有必要對Consul進程進行接管,咱們用的是Systemd,你也能夠選擇Supervisord或者Upstart這些進程管理工具。

二是集羣管理,Consul提供了可視化管理界面。能夠查看全部的服務和節點,以及它們的健康檢測和當前狀態。

fffb211e43f9a89f5d90e5cef5f84da7.jpeg

升級

因爲Consul關係到整個系統的正常運做,因此升級的時候仍是要很當心。最好在測試環境試驗多幾回,再到生產環境升級。升級的情況能夠概括爲下面三種,須要對號入座以後再進行升級。

  • 特殊版本的升級。在upgrade-specific頁面查看當前升級的版本是否有特殊說明。好比:0.5.1以前的版本直接升級到0.6版本,要藉助工具consul-migrate進行數據遷移。

  • 不兼容的升級。使用consul -v查看新版的向後兼容協議版本號,當出現與當前版本不兼容時,須要分兩步升級。先經過參數-protocal=舊的協議版本號,把整個集羣升級一次,再把啓動命令中的參數-protocal去掉來重啓全部節點。

  • 標準的升級。若是上面兩種狀況都不是,那麼恭喜你,你須要作的只是簡單的標準升級。即:中止舊版本的agent,而後啓動新版本的agent。PS. 其實大多數狀況都是標準升級。

升級節點的推薦順序是,先升級Server的Follower節點,再升級Server的Leader節點,最後升級全部Client的節點。

結語

在系統中引入服務註冊和發現,雖然是一發牽動全身的改造,但整個系統架構會所以受益,尤爲是現代的微服務架構。相信不少系統都具有負載均衡、健康檢查、心跳檢測等能力,利用好服務發現,那麼彈性伸縮、服務高可用、灰度發佈,天然是水到渠成的事情。

相關文章
相關標籤/搜索