Consul+Prometheus係統監控之注冊發現
緣起
前麵幾篇文章分別對係統服務、MySql以及Redis相關軟件做了監控預警,但是大家有沒有發現,在prometheus.yml裏配置需要監聽的服務時,我們需要按服務名手動寫入,也就是說以後每增加一個服務,就得手動修改此配置,並重啟promethues服務。
那麼我們如何做到動態的監聽服務呢?相信不少接觸過分布式框架Dubbo的小夥伴們都知道它是靠zookeeper做注冊監聽的,最近比較流行的Spring Cloud Netflix的Eureka,consul也是比較常用的注冊中心。
參考官方文檔consul_sd_config,可以發現promethues已經可以借助consul實現動態監聽服務的功能了。
Consul簡介
Consul是一個服務發現和注冊的工具,其具有分布式、高擴展性能特點。
Consul主要包含如下功能:
- 服務發現: 支持 http 和 dns 兩種協議的服務注冊和發現方式。
- 監控檢查: 支持多種方式的健康檢查。
- Key/Value存儲: 支持通過HTTP API實現分布式KV數據存儲。
- 多數據中心支持:支持任意數量數據中心。
官方架構圖:
使用場景
- docker 實例的注冊與配置共享
- coreos 實例的注冊與配置共享
- vitess 集群
- SaaS 應用的配置共享
- 與 confd 服務集成,動態生成 nginx 和 haproxy 配置文件
優勢
- 使用 Raft 算法來保證一致性, 比複雜的 Paxos 算法更直接. 相比較而言, zookeeper 采用的是 Paxos, 而 etcd 使用的則是 Raft.
- 支持多數據中心,內外網的服務采用不同的端口進行監聽。 多數據中心集群可以避免單數據中心的單點故障,而其部署則需要考慮網絡延遲, 分片等情況等. zookeeper 和 etcd 均不提供多數據中心功能的支持.
- 支持健康檢查. etcd 不提供此功能.
- 支持 http 和 dns 協議接口. zookeeper 的集成較為複雜, etcd 隻支持 http 協議.
- 官方提供web管理界麵, etcd 無此功能.
角色
- client: 客戶端, 無狀態, 將 HTTP 和 DNS 接口請求轉發給局域網內的服務端集群.
- server: 服務端, 保存配置信息, 高可用集群, 在局域網內與本地客戶端通訊, 通過廣域網與其他數據中心通訊. 每個數據中心的 server 數量推薦為 3 個或是 5 個.
Consul安裝
下載並解壓:
## 下載
wget https://releases.hashicorp.com/consul/1.0.0/consul_1.0.0_linux_amd64.zip?_ga=2.31706621.2141899075.1510636997-716462484.1510636997
## 解壓
unzip consul_1.0.0_linux_amd64.zip
以UI形式後台啟動:
./consul agent -server -ui -bootstrap-expect 1 -data-dir /tmp/consul &
查看啟動狀態:
[root@iZ2ze74 home]# ./consul members
Node Address Status Type Build Protocol DC Segment
iZ2ze74 172.17.120.102:8301 alive server 1.0.0 2 dc1 <all>
說明:
- Address:節點地址
- Status:alive表示節點健康
- Type:server運行狀態是server狀態
- DC:dc1表示該節點屬於DataCenter1
查看節點:
curl 127.0.0.1:8500/v1/catalog/nodes
Nginx代理訪問:
server {
listen 80;
server_name consul.52itstyle.com;
charset utf-8;
location / {
default_type text/html;
proxy_pass https://127.0.0.1:8500;
}
}
界麵:
服務注冊
使用http的方式,直接調用/v1/agent/service/register接口注冊:
curl -X PUT -d '{"id": "MySql","name": "MySql","address": "localhost","port": 9104,"tags": ["dev"],"checks": [{"http": "https://localhost:9104/","interval": "5s"}]}' https://localhost:8500/v1/agent/service/register
使用配置文件注冊服務,創建文件夾/etc/consul.d
vi mysql.json內容如下:
{
"service":{
"id": "mysql",
"name": "mysql",
"address": "MySql",
"port": 9104,
"tags": ["dev"],
"checks": [
{
"http": "https://localhost:9104",
"interval": "5s"
}
]
}
}
指定文件啟動:
./consul agent -server -ui -bootstrap-expect 1 -data-dir /tmp/consul -config-dir /etc/consul.d &
如果文件變更,我們可以通過以下方式重新加載配置:
consul reload
我們也可以通過curl的方式注銷服務:
curl --request PUT https://localhost:8500/v1/agent/service/deregister/MySql
配置promethues.yml:
global:
scrape_interval: 15s
evaluation_interval: 15s
- job_name: prometheus
static_configs:
- targets: ['localhost:9090']
labels:
instance: prometheus
- job_name: 'consul'
consul_sd_configs:
#consul服務地址
- server: 'localhost:8500'
#services是微服務名的數組,如果什麼都不填,則默認取consul上注冊的所有微服務
services: ['redis', 'mysql', 'linux']
然後我們重啟promethues,這時候隻要Consul有服務注冊,promethues就會檢測到。
常用命令
常用命令command:
- agent:運行一個consul agent
- join:將agent加入到consul cluster
- members:列出consul cluster集群中的members
常用選項option:
-data-dir
- 作用:指定agent儲存狀態的數據目錄
- 這是所有agent都必須的
- 對於server尤其重要,因為他們必須持久化集群的狀態
-config-dir
- 作用:指定service的配置文件和檢查定義所在的位置
- 通常會指定為"某一個路徑/consul.d"(通常情況下,.d表示一係列配置文件存放的目錄)
-config-file
- 作用:指定一個要裝載的配置文件
- 該選項可以配置多次,進而配置多個配置文件(後邊的會合並前邊的,相同的值覆蓋)
-dev
- 作用:創建一個開發環境下的server節點
- 該參數配置下,不會有任何持久化操作,即不會有任何數據寫入到磁盤
- 這種模式不能用於生產環境(因為第二條)
-bootstrap-expect
- 作用:該命令通知consul server我們現在準備加入的server節點個數,該參數是為了延遲日誌複製的啟動直到我們指定數量的server節點成功的加入後啟動。
-node
- 作用:指定節點在集群中的名稱
- 該名稱在集群中必須是唯一的(默認采用機器的host)
- 推薦:直接采用機器的IP
-bind
- 作用:指明節點的IP地址
-server
- 作用:指定節點為server
- 每個數據中心(DC)的server數推薦為3或5(理想的是,最多不要超過5)
- 所有的server都采用raft一致性算法來確保事務的一致性和線性化,事務修改了集群的狀態,且集群的狀態保存在每一台server上保證可用性
- server也是與其他DC交互的門麵(gateway)
-client
- 作用:指定節點為client
- 若不指定為-server,其實就是-client
-join
- 作用:將節點加入到集群
參考鏈接
https://consul.la/intro/what-is-consul
https://kkkkkk.blog.51cto.com/468162/1914469
https://prometheus.io/docs/prometheus/latest/configuration/configuration/
最後更新:2017-11-17 19:04:20