本文主要介紹如何利用Prometheus官網提供的
mysqld_exporter
進行多MySQL實例的監控指標采集
建議安裝最新版的mysqld_exporter
, 因為從’2022-09-01’ 之后才支持多實例功能的。具體的官網說明詳見
Support for scraping multiple mysqld hosts (#651)
ok,開始今天的教程~
1、下載安裝 mysqld_exporter
# 參考 下載地址Release列表,選擇適合的平臺安裝包
# 進入運維規范 軟件安裝目錄
cd /opt/app
# 下載并解壓
wget https://github.com/prometheus/mysqld_exporter/releases/download/v0.15.1/mysqld_exporter-0.15.1.linux-amd64.tar.gz
tar -zxvf mysqld_exporter-0.15.1.linux-amd64.tar.gz
# 設置軟連接
ln -s /opt/app/mysqld_exporter-0.15.1.linux-amd64 mysqld_exporter
2、進行配置
配置之前創建Prometheus exporter 賬號并賦權
CREATE USER 'prometheus'@'192.168.%' IDENTIFIED BY 'XXXXXXXX' WITH MAX_USER_CONNECTIONS 10;
GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'prometheus'@'192.168.%';
配置連接MySQL的配置文件
# vim ./.my.cnf
[client]
user = prometheus
password = XXXXXXXX
其他的配置說明詳見 https://github.com/prometheus/mysqld_exporter
為了方便管理,在每個MySQL實例初始化的時候,創建相同的賬號 'prometheus'@'192.168.%'
和對應的密碼, 這樣在 mysql exporter中只用配置一個[client]
即可。
3、啟動MySQL exporter并測試
注意可以通過 ./mysqld_exporter --help
查看以 --collect.xx
開頭的參數,這個是該exporter支持的metrics
另外需要特殊說明幾個參數
-
--config.my-cnf=".my.cnf"
配置exporter連接數據庫時使用的認證信息(這里只要是配置用戶和密碼),默認是讀取當前目錄下的
.my.cnf
,可以修改指定 -
--web.listen-address=:9104
exporter默認監聽的端口,可以修改
啟動 exporter 服務
nohup ./mysqld_exporter --config.my-cnf=./.my.cnf --collect.global_status --collect.global_variables --collect.mysql.user --collect.binlog_size --collect.slave_status &
當然還可以配置systemd
方式來管理該exporter服務
# vim /usr/lib/systemd/system/mysqld_exporter.service
[Unit]
Description=Prometheus MySQL exporter
[Service]
ExecStart=/opt/app/mysqld_exporter/mysqld_exporter --config.my-cnf=/opt/app/mysqld_exporter/.my.cnf --collect.global_status --collect.global_variables --collect.mysql.user --collect.binlog_size --collect.slave_status
Restart=on-failure
[Install]
WantedBy=multi-user.target
然后執行配置開機自啟動
# 開啟自啟動
systemctl enable mysqld_exporter
# 啟動
systemctl start mysqld_exporter
# 查看狀態
systemctl status mysqld_exporter
4、測試驗證
根據官網提示可以使用 /probe?target=foo:3306
的方式來驗證
To use the multi-target functionality, send an http request to the endpoint /probe?target=foo:3306 where target is set to the DSN of the MySQL instance to scrape metrics from.
本次環境測試地址 http://192.168.3.100:9104/probe?target=xxxx:3306 然后在瀏覽器中打開如下,看到exporter部署成功
5、注冊MySQL實例信息到Consul
備注: 關于Consul大家知道是目前比較常用的注冊中心系統,常見的用法有
a)比如Java服務啟動的時候注冊到Consul,其他比如網關服務就可以自動發現服務進行請求轉發
b)Nginx做服務動態轉發時,可以借助于Consul中的KV功能實現在發布服務時,動態下線對應的服務節點,等服務節點重啟成功之后再動態上線。可以實現后端服務的無損上線
具體Consul的服務安裝和API用法詳見官網文檔即可,后者關于我博客中的相關文章說明
這里直接給出具體的注冊代碼
#!/usr/bin/env bash
# encoding: utf-8
# 批量初始化注冊到Consul
while read line
do
# echo $line
instance_id=$(echo $line|awk '{print $1}')
instance_name=$(echo $line|awk '{print $2}')
instance_address=$(echo $line|awk '{print $3}')
suffix=$(echo $instance_name|awk -F"_" '{print $NF}')
if [[ $suffix == 'slave' ]]
then
role="slave"
else
role="master"
fi
data="{
\"id\": \"rds-${instance_name}\",
\"name\": \"mysql\",
\"address\" : \"${instance_address}\",
\"port\": 3306,
\"tags\": [\"prod\", \"mysql_exporter\"],
\"meta\": {
\"env\": \"prod\",
\"role\": \"${role}\",
\"instance_id\": \"${instance_id}\",
\"instance_name\": \"${instance_name}\"
}
}"
# echo $data
curl -X PUT 'http://192.168.x.x:8500/v1/agent/service/register' -H 'Content-Type: application/json' -d "$data"
done < /opt/scripts/db-register-into-consul/db-list.txt
其中 db-list.txt
文件的內容格式如下
instance-id-xxx instance-name instance-address
或者可以手動單個實例的注冊
curl -X PUT 'http://192.168.x.x:8500/v1/agent/service/register' -H 'Content-Type: application/json' \
-d '{
"id": "rds-xxx",
"name": "mysql",
"address": "rm-xxxxxxxx.mysql.rds.aliyuncs.com",
"port": 3306,
"tags": [
"prod",
"mysql_exporter"
],
"meta": {
"env": "prod",
"instance_id": "rm-xxxxxxxx.mysql.rds.aliyuncs.com:3306",
"role": "master",
"instance_name": "rds-xxx"
}
}'
然后打開 Consul的 Web 控制臺,在 Services
中搜索 mysql
(這里定義的服務名稱) 就可以看到有對應的實例注冊到該服務下
6、配置Prometheus 自動發現多個MySQL實例
為了規范配置Prometheus的配置,建議按照如下把不同的Job配置到 scrape_configs
目錄下單個文件存放管理
# cat scrape_configs/mysql_exporter.yml
scrape_configs:
- job_name: 'consul_discovery_mysql'
consul_sd_configs:
# Consul的服務地址(這里配置的內網域名)
- server: 'consul.xxx.local'
# 這里是獲取Consul中的服務,如上知道我們是把所有的MySQL實例注冊到了`mysql`服務下
services: ['mysql']
relabel_configs:
# 核心是獲取 `__parm_target` 就是 上面第四步提到的probe抓取的target
- source_labels: [__address__]
target_label: __param_target
- source_labels: [__meta_consul_service_id]
target_label: instarnce_name
- source_labels: [__param_target]
target_label: instance
- target_label: __address__
# 注意這里: 該地址就是MySQL exporter服務的地址
replacement: 192.168.3.100:9104
劃重點
雖然在 mysql_exporter 的 config.file 對應的配置文件中可以配置多個 client 然后給配置不同的賬號密碼,且 prometheus也支持auth_module
參數。
但是如果Prometheus配置auth_module
參數時且每個job的賬號密碼不一樣。那么就變成了手動配置多個Job的場景,那么基于Consul自動發現的多實例配置就失去了其意義。
所這里這里沒有配置,且針對Prometheus監控猜忌,建議配置統一的賬號密碼就行
劃重點
如果在進行relabel
配置的時候,不知道都有哪些原始的labels,可以后兩種方案
1、就是Prometheus中先不進行relabel_configs
的配置,然后配置生效之后打開 Prometheus Web控制臺在 Status
中找到 Targets
,然后鼠標
放到對應job下endpoint
行 的Labels
列,就會有彈窗顯示 Before relabeling
都有哪些
2、查看Prometheus官網介紹 Prometheus consul_sd_config relabel參數
但是個人建議第一種方式,因為筆者剛開始參考第二種方式在meta中存放了定制的參數,但是獲取不到。最終分析定位發現是因為筆者的Consul版本太低,很多consul_sd_config參數不支持導致。
但是第一種方式,顯示出來的參數就是當前版本支持的可用的參數。
當然具體使用自己更具自己的實際情況來判斷就行。
7、驗證Prometheus多實例采集
這里給實際的結果截圖
看到筆者這里已經采集到了36個實例數據,點擊Endpoint就看到需要的結果,和上面第四步測試驗證
一致。
8、配置Grafana
配置Grafana 就相對很簡單了。這里就不展開詳細說明了。
大概的步驟就是
1)在grafana中添加該Prometheus數據源
2)然后新創建dashboard 在官網搜到需要的模板之后,按照模板id導致即可
如有疑問歡迎關注微信公眾號或者QQ交流分享