1. concul 內(nèi)部原理
Consul分為Client和Server兩種節(jié)點(所有的節(jié)點也被稱為Agent)竿拆,Server節(jié)點保存數(shù)據(jù)鸣驱,Client負(fù)責(zé)健康檢查及轉(zhuǎn)發(fā)數(shù)據(jù)請求到Server蠢壹;Server節(jié)點有一個Leader和多個Follower死姚,Leader節(jié)點會將數(shù)據(jù)同步到Follower歇终,Server的數(shù)量推薦是3個或者5個帆喇,在Leader掛掉的時候會啟動選舉機(jī)制產(chǎn)生一個新的Leader。
集群內(nèi)的Consul節(jié)點通過gossip協(xié)議(流言協(xié)議)維護(hù)成員關(guān)系油啤,也就是說某個節(jié)點了解集群內(nèi)現(xiàn)在還有哪些節(jié)點典徘,這些節(jié)點是Client還是Server。單個數(shù)據(jù)中心的流言協(xié)議同時使用TCP和UDP通信益咬,并且都使用8301端口逮诲。跨數(shù)據(jù)中心的流言協(xié)議也同時使用TCP和UDP通信幽告,端口使用8302梅鹦。
集群內(nèi)數(shù)據(jù)的讀寫請求既可以直接發(fā)到Server,也可以通過Client使用RPC轉(zhuǎn)發(fā)到Server冗锁,請求最終會到達(dá)Leader節(jié)點齐唆,在允許數(shù)據(jù)輕微陳舊的情況下,讀請求也可以在普通的Server節(jié)點完成冻河,集群內(nèi)數(shù)據(jù)的讀寫和復(fù)制都是通過TCP的8300端口完成箍邮。
具體consul的原理及架構(gòu)請訪問:http://blog.didispace.com/consul-service-discovery-exp/
2. 使用docker部署consul 集群
#啟動第1個Server節(jié)點,集群要求要有3個Server叨叙,將容器8500端口映射到主機(jī)8900端口媒殉,同時開啟管理界面
docker run -d --name=consul1 -p 8900:8500 -e CONSUL_BIND_INTERFACE=eth0 consul agent --server=true --bootstrap-expect=3 --client=0.0.0.0 -ui
#啟動第2個Server節(jié)點,并加入集群
docker run -d --name=consul2 -e CONSUL_BIND_INTERFACE=eth0 consul agent --server=true --client=0.0.0.0 --join 172.17.0.1
#啟動第3個Server節(jié)點摔敛,并加入集群
docker run -d --name=consul3 -e CONSUL_BIND_INTERFACE=eth0 consul agent --server=true --client=0.0.0.0 --join 172.17.0.2
#啟動第4個Client節(jié)點廷蓉,并加入集群
docker run -d --name=consul4 -e CONSUL_BIND_INTERFACE=eth0 consul agent --server=false --client=0.0.0.0 --join 172.17.0.2
瀏覽器訪問容器映射的8900端口:
3. 服務(wù)注冊到Consul
使用HTTP API 方式注冊node-exporter服務(wù)到Consul
curl -X PUT -d '{"id": "192.168.16.173","name": "node-exporter","address": "192.168.16.173","port": ''9100,"tags": ["DEV"], "checks": [{"http": "http://192.168.16.173:9100/","interval": "5s"}]}' http://172.17.0.4:8500/v1/agent/service/register
解注冊:
curl --request PUT http://172.17.0.4:8500/v1/agent/service/deregister/192.168.166.14
注冊多個服務(wù)到consul,使用腳本:
#!/bin/bash
all_IP=`cat /opt/ip`
name=cadvisor
port=9100
for I in $all_IP
do
curl -X PUT -d '{"id": "'$I'","name": "'$name'","address": "'$I'","port": '$port',"tags": ["cadvisor"], "checks": [{"http": "http://'$I':'$port'/","interval": "5s"}]}' http://172.17.0.4:8500/v1/agent/service/register
done
4. Prometheus 配置consul 服務(wù)發(fā)現(xiàn)
consul 可以使用的元標(biāo)簽:
__meta_consul_address:目標(biāo)的地址
__meta_consul_dc:目標(biāo)的數(shù)據(jù)中心名稱
__meta_consul_tagged_address_<key>:每個節(jié)點標(biāo)記目標(biāo)的地址鍵值
__meta_consul_metadata_<key>:目標(biāo)的每個節(jié)點元數(shù)據(jù)鍵值
__meta_consul_node:為目標(biāo)定義的節(jié)點名稱
__meta_consul_service_address:目標(biāo)的服務(wù)地址
__meta_consul_service_id:目標(biāo)的服務(wù)ID
__meta_consul_service_metadata_<key>:目標(biāo)的每個服務(wù)元數(shù)據(jù)鍵值
__meta_consul_service_port:目標(biāo)的服務(wù)端口
__meta_consul_service:目標(biāo)所屬服務(wù)的名稱
__meta_consul_tags:標(biāo)記分隔符連接的目標(biāo)的標(biāo)記列表
修改Prometheus.yml 文件马昙,使用relabel將consul的元標(biāo)簽重寫便于查看
- job_name: 'consul'
consul_sd_configs:
- server: '192.168.16.173:8900'
services: [] #匹配所有service
relabel_configs:
- source_labels: [__meta_consul_service] #service 源標(biāo)簽
regex: "consul" #匹配為"consul" 的service
action: drop # 執(zhí)行的動作
- source_labels: [__meta_consul_service] # 將service 的label重寫為appname
target_label: appname
- source_labels: [__meta_consul_service_address]
target_label: instance
- source_labels: [__meta_consul_tags]
target_label: job
Prometheus 熱加載更新
curl -X POST http://192.168.16.173:9090/-/reload
訪問Prometheus web頁面
應(yīng)用注冊到consul
在不需要開發(fā)修改代碼的前提下桃犬,我們可以使用Prometheus的jmx-exporter收集應(yīng)用的相關(guān)指標(biāo),在應(yīng)用中間件tomcat/weblogic等調(diào)用jmx-exporter行楞,具體方式查看http://www.reibang.com/p/dfd6ba5206dc
啟動應(yīng)用后會啟動12345端口暴露jvm數(shù)據(jù)攒暇,現(xiàn)在我們要做的就是將這個端口注冊到Consul上,然后Prometheus會從consul 拉取應(yīng)用主機(jī)子房。
使用腳本實現(xiàn)
$ cat ip
TEST 192.168.166.10 192.168.166.11
UNMIN 192.168.166.12 192.168.166.13
---------------
$ cat consul.sh
#!/bin/bash
port=12345
while read app
do
echo ${app}
app_tmp=(${app})
echo ${app_tmp[0]}
length=${#app_tmp[@]}
echo ${length}
for((k=1;k<${length};k++));
do
echo ${app_tmp[k]}
curl -X PUT -d '{"id": "'${app_tmp[k]}'","name": "'${app_tmp[0]}'","address": "'${app_tmp[k]}'","port": '$port',"tags": ["MIDL"],"checks": [{"http": "http://'${app_tmp[k]}':'$port'/","interval": "5s"}]}' http://172.17.0.4:8500/v1/agent/service/register
done
done < ip
執(zhí)行腳本注冊到consul
配置Grafana JVM 監(jiān)控模板
Load 8563
模板