一、前言
雖然說牛逼的公司都有那麼幾個牛逼的運維團隊,牛逼的運維團隊都有着神祕黑科技般敲代碼的姿勢;本人雖然不是一個運維工程師,但是有幸自己比較愛倒騰這些東西,也會那麼一點點運維知識,雖然不算專業,但是還是可以在linux平臺下敲一敲代碼。去年由於自己業餘時間搞了一個app項目,當時自己兼任後端開發,又同時兼任運維,經過多少個夜晚才把後端API網關 搭建起來,當時技術選型主要使用微服務架構,說到微服務架構,也就少不了分佈式集羣,那就更少不了Consul 。
今天搭建Consul 服務也是爲了自己後面的學習和分享使用(之前在生產環境搭建過,本來可以直接拿來用,只是後面應用停掉了,服務器也就下掉了),故特意把前幾天阿里雲活動價買的服務器用起來,準備再次搭建Consul服務,以供後續方便拿來即用。
二、概念
什麼是Consul?
Consul
是HashiCorp公司推出的開源工具,Consul由Go語言開發,部署起來非常容易,只需要極少的可執行程序和配置文件,具有綠色、輕量級的特點。Consul
是分佈式
的、高可用
的、 可橫向擴展
的用於實現分佈式系統的服務發現與配置。
Consul具有哪些特點?
- 服務發現(Service Discovery):
Consul
提供了通過DNS或者HTTP接口的方式來註冊服務和發現服務。一些外部的服務通過Consul很容易的找到它所依賴的服務。 - 健康檢查(Health Checking):Consul的Client可以提供任意數量的健康檢查,既可以與給定的服務相關聯(“webserver是否返回200 OK”),也可以與本地節點相關聯(“內存利用率是否低於90%”)。操作員可以使用這些信息來監視集羣的健康狀況,服務發現組件可以使用這些信息將流量從不健康的主機路由出去。
- Key/Value存儲:應用程序可以根據自己的需要使用Consul提供的Key/Value存儲。 Consul提供了簡單易用的HTTP接口,結合其他工具可以實現動態配置、功能標記、領袖選舉等等功能。
- 安全服務通信:Consul可以爲服務生成和分發TLS證書,以建立相互的TLS連接。意圖可用於定義允許哪些服務通信。服務分割可以很容易地進行管理,其目的是可以實時更改的,而不是使用複雜的網絡拓撲和靜態防火牆規則。
- 多數據中心:Consul支持開箱即用的多數據中心. 這意味着用戶不需要擔心需要建立額外的抽象層讓業務擴展到多個區域。
Consul 架構圖
讓我們把這幅圖分解描述。首先,我們可以看到有兩個數據中心,分別標記爲“1”和“2”。Consul擁有對多個數據中心的一流支持,這是比較常見的情況。
在每個數據中心中,我們都有客戶機和服務器。預計將有三到五臺服務器。這在故障情況下的可用性和性能之間取得了平衡,因爲隨着添加更多的機器,一致性會逐漸變慢。但是,客戶端的數量沒有限制,可以很容易地擴展到數千或數萬。
Consul 實現多個數據中心都依賴於gossip protocol協議。這樣做有幾個目的:首先,不需要使用服務器的地址來配置客戶端;服務發現是自動完成的。其次,健康檢查故障的工作不是放在服務器上,而是分佈式的。這使得故障檢測比單純的心跳模式更具可伸縮性。爲節點提供故障檢測;如果無法訪問代理,則節點可能經歷了故障。
每個數據中心中的服務器都是一個筏對等集的一部分。這意味着它們一起工作來選舉單個leader,一個被選中的服務器有額外的職責。領導負責處理所有的查詢和事務。事務還必須作爲協商一致協議的一部分複製到所有對等方。由於這個需求,當非leader服務器接收到RPC請求時,它會將其轉發給集羣leader。
Consul的使用場景
Consul的應用場景包括服務發現、服務隔離、服務配置:
- 服務發現場景中consul作爲註冊中心,服務地址被註冊到consul中以後,可以使用consul提供的dns、http接口查詢,consul支持health check。
- 服務隔離場景中consul支持以服務爲單位設置訪問策略,能同時支持經典的平臺和新興的平臺,支持tls證書分發,service-to-service加密。
- 服務配置場景中consul提供key-value數據存儲功能,並且能將變動迅速地通知出去,藉助Consul可以實現配置共享,需要讀取配置的服務可以從Consul中讀取到準確的配置信息。
- Consul可以幫助系統管理者更清晰的瞭解複雜系統內部的系統架構,運維人員可以將Consul看成一種監控軟件,也可以看成一種資產(資源)管理系統。
比如:docker實例的註冊與配置共享、coreos實例的註冊與配置共享、vitess集羣、SaaS應用的配置共享、Consul與confd服務集成,動態生成nginx和haproxy配置文件或者Consul結合nginx構建高可用可擴展的Web服務。
三、安裝
我這裏直接安裝Consul 最新版本 1.7.2 官網地址:https://www.consul.io/
1. 下載
我這裏進入我的用戶目錄 /home下面進行下載consul安裝壓縮包,命令如下:
wget https://releases.hashicorp.com/consul/1.7.2/consul_1.7.2_linux_amd64.zip
下載如下圖:
下載完我們通過 ls -a 查看下目錄,如下圖:
2. 解壓
unzip consul_1.7.2_linux_amd64.zip
3. 拷貝到usr目錄下
我這裏事先在usr目錄中單獨創建了service 文件,可以通過mkdir 命令來完成,不過不一定要安裝在這個目錄下面,我這裏就選擇安裝在usr目錄裏
mv consul /usr/service
4. 查看 安裝是否成功
./consul
查看如下圖:
已經安裝完成了,
現在我們開始啓動
5. 啓動
這是最關鍵的時候,安裝就是爲了啓動
這裏我整理了下啓動的相關參數如下:
參數參考 可以訪問 https://www.cnblogs.com/sunsky303/p/9209024.html 地址,我這裏就簡單的通過使用到的參數進行啓動
-server 表示是server模式
-bootstrap-expect=3 表示是集羣中有3臺服務器 bootstrap該模式node可以指定自己作爲leader ,如果是非leader可不加該參數
-data-dir=/tmp/consul 目錄
-node=n2 該服務器節點名
-bind=127.0.0.1 節點綁定的ip
-ui 非必須 webui的路徑 用web來管理consul
啓動命令如下(默認是8500端口):
./consul agent -server -bootstrap-expect 1 -data-dir=/tmp/consul -node=n1 -bind=127.0.0.1 -client=0.0.0.0 -ui
啓動後結果如下:
現在我再來訪問Consul UI管理界面,如下圖:
現在Consul 已經完整的啓動成功了,啓動成功是不是想要來試一試,我這裏直接使用我之前寫的一篇【.net core】電商平臺升級之微服務架構應用實戰(core-grpc) 文章中寫的Demo 註冊到Consul 中來,看看是否正常註冊,如下圖:
好了,正常的註冊進來了,完美,現在已經搭建完成了
Consul 開機自啓動
1. 路徑/usr/lib/systemd/system/,新建一個service命名爲,consul.service
[Unit]
Description=consul-service
After=network.target
[Service]
Type=forking
PIDFile=/run/consul-service.pid
ExecStart=/usr/service/consul.start.sh
ExecReload=/bin/kill -SIGHUP $MAINPID
ExecStop=/bin/kill -SIGINT $MAINPID
[Install]
WantedBy=multi-user.target graphical.target
上面的ExecStart 是啓動的腳本,我之前把consul 是安裝在/user/service 下面,
2. 創建啓動腳本
我們再service 目錄中創建Consul開機自啓動的腳本文件consul.start.sh
#!/bin/bash
/usr/service/consul agent -server -bootstrap-expect 1 -node=127.0.0.1 -data-dir=/usr/service/data/ -log-file=/usr/service/log/consul_log-$(date +%Y-%m-%d--%H-%M) -bind=127.0.0.1
3. 重新加載配置
systemctl daemon-reload
4. 設置開機自啓動
systemctl enable consul.service
Consul 啓動
systemctl start consul
Consul 停止
systemctl stop consul
上面創建開機自啓動腳本實踐的時候大家可能會發現 通過systemctl start consul 無法啓動問題,這時候可以通過status 來查詢狀態,命令如下
systemctl status consul
查詢創建的自啓動腳本執行過程中出現code=exited, status=203/EXEC
異常錯誤信息,這個信息一般有如下幾個原因造成:
- 錯誤的腳本路徑
- 腳本的權限無效
- 服務用戶沒有讀取腳本的權限
- 腳本未標記爲可執行
根據上面三種情況去排查解決,基本上就可以完美解決自啓動腳本無法啓動問題
結束語:這裏Consul 介紹及安裝搭建已經完成,Consul也可以搭建集羣,大家可以去嘗試自己搭建,比較簡單,後續我會陸續把使用到的各種工具服務搭建起來,以方便後續的文章實戰分享和學習,不過大佬就可以直接跳過…
Consul 參考資料:
1.可以參考Consul的官方網站和其他網站上提供的信息。本文列舉一些可用參考的資源如下:
2.Consul官方網站 https://www.consul.io/
3.Consul Github地址 https://github.com/hashicorp/consul
4.Consul-template Github地址 https://github.com/hashicorp/consul-template
5.Consul官方介紹 https://www.consul.io/intro/index.html
6.Consul 系統架構 https://www.consul.io/docs/internals/architecture.html
7.Consul與其他開源軟件或解決方案的對比 https://www.consul.io/intro/vs/
8.Dubbo用戶指南 http://dubbo.io/Home-zh.htm 通過此指南可以瞭解Dubbo是什麼,能做什麼
9.藉助 Consul 和 Docker 支持即插即用的服務發現 (service discovery) http://www.ibm.com/developerworks/cn/cloud/library/cl-plug-and-play-service-discovery-with-consul-and-docker-bluemix/
10.使用Terraform與Consul自動化現代數據中心 http://www.infoq.com/cn/news/2015/05/hashimoto-modern-datacenter
11.基於swarm+consul+nginx達到HA和auto scaling的架構 http://genchilu-blog.logdown.com/posts/317095-based-on-swarm-and-consul-ha-and-dynamically-extensible-architectures
12.使用Docker、Registrator、Consul、Consul Template和Nginx實現高可擴展的Web框架 http://dockone.io/article/272
13.Consul多數據中心配置 https://www.consul.io/docs/guides/datacenters.html
歡迎微信掃碼關注微信公衆號【dotNET博士】