Prometheus結合Consul采集多個MySQL實例的監控指標

本文主要介紹如何利用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部署成功

prometheus-mysql-expoter-probe-test.png

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多實例采集

這里給實際的結果截圖

prometheus-consul-mysql-v2.png

看到筆者這里已經采集到了36個實例數據,點擊Endpoint就看到需要的結果,和上面第四步測試驗證一致。

8、配置Grafana

配置Grafana 就相對很簡單了。這里就不展開詳細說明了。

大概的步驟就是

1)在grafana中添加該Prometheus數據源

2)然后新創建dashboard 在官網搜到需要的模板之后,按照模板id導致即可


如有疑問歡迎關注微信公眾號或者QQ交流分享

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容