阿里雲RDS監控可以不那麼“難看”【實操系列】


雲廠商可以幫助我們解決8-90%的“髒亂臭”的活,方便的不要不要的,當然也是有得有失吧。但個人覺得RDS監控用起來確實有點不是太方便,自然要想辦法改善使用。

Prometheus+Grafana,這套萬金流自然首當其衝(有的人喜歡zabbix,都可以,仁者見仁)

1. 工具收集階段

1.1 Prometheus+Grafana環境部署

此處不做過多贅述,網上文章很多。推薦電子書鏈接:prometheus-book

1.2 阿里雲RDS(mysqld)相關監控

MySQL數據採集工具:mysqld_exporter,此工具也是prometheus官方工具下載地址
部署也相當簡單,創建好採集MySQL數據需要的用戶,以及選擇需要採集的指標,直接啓動即可,如:

export DATA_SOURCE_NAME='user:password@(hostname:3306)/'
./mysqld_exporter <flags>

1.3 資源監控

除了RDS(MySQL)本身的一些監控,還需要關注資源的一些信息。如果是自建IDC,肯定是使用node_exporter

誰讓我們使用的是雲產品呢,哎~

幸運的是PingCAP的工程師Aylei寫了一套aliyun-exporter,原理是調用阿里雲API收集監控數據(可以監控ECS、SLB、Redis、Mongodb、RDS等),以prometheus格式存儲,同時非常nice的做了非常漂亮的Grafana圖。
但是,由於“年久失修”,在使用的時候遇到不少問題,再加上個人代碼能力青銅三段,重寫有點難,那就硬修吧。以下是在使用時遇到的問題。

1.3.1 重新打包Dockerfile

原因是,pip3 install aliyun-exporter拉的鏡像沒有SLB的模塊(其實這個根RDS監控沒什麼關係,另一位同事在搞SLB的監控,順道都修了),人肉了很久,發現github中最新的代碼有這個功能。尷尬~想用也只能自己動手了,替換最新的代碼文件info_provider.py,重新打包。腳本如下:

$ cat docker.file
FROM aylei/aliyun-exporter:0.3.0
RUN pip3 install -U aliyun-exporter==0.3.1 PyYAML==5.1.2
RUN pip3 install  aliyun-python-sdk-slb aliyun-python-sdk-dds
COPY info_provider.py /usr/local/lib/python3.7/site-packages/aliyun_exporter/info_provider.py # 注意:作者沒有把最新的代碼打包進docker中,沒辦法只能我們先去下載代碼,然後替換


$ docker build -f docker.file -t aliyun-exporter:0.3.1 .

1.3.2 修改bug配置

這個地方應該是一個bug。
首先說明,aliyun_exporter本身是可以獲取所有監控信息,也就是說1.2中的mysqld_exporter完全可以不需要,但是,在實際使用中又發現,如果增加rds_performance的監控項,服務無法啓動。所以無奈,對於RDS勁限於做資源監控。

幸運的是有mysqld_exporter作爲補充。

1.3.3 啓動docker

$ docker run -d  -p 9526:9525  -e "ALIYUN_ACCESS_ID=XXXX" -e "ALIYUN_ACCESS_SECRET=XXXX" -e "ALIYUN_REGION=cn-XXXX"  -v $(pwd)/aliyun-exporter-test.yml:/aliyun-exporter.yml  aliyun-exporter:0.3.1  -p 9525 -c  /aliyun-exporter.yml

1.3.4 Grafana配置圖

這部分的大小改動也不少:數據源的配置啊、怎麼劃分部門啊、加標籤啊、Alter怎麼解決不能給模版加告警啊 等等等等,就不贅述了。具體問題具體分析吧。

2. 工具組合

2.1 架構圖

+----+
|RDS1+---------+
+----+         |        ECS
               >+----------------------+    +-------------+
  .             |  mysqld_exporter     |    | Prometheus  |
  .   +-------->+         +            +---->      +      |
  .             |  aliyun_exporter     |    |   Grafana   |
  .            >+----------------------+    +-------------+
               |
+----+         |
|RDSn+---------+
+----+

如上圖,需要一臺ECS部署mysqld_exporteraliyun_exporter進行信息採集,再將採集的信息丟給Prometheus

2.2 supervisor+mysqld_exporter

mysqld_exporter裸跑有點慌。所以使用進程管理工具supervisor協助管理。

# 腳本模版
$  cat mysqld_exporter.xxxx.conf
[program:xxxx]
directory = /opt/mysqld_exporter
command = /bin/nohup /opt/mysqld_exporter/mysqld_exporter --web.listen-address=[IP]:[PORT] --collect.global_status --collect.global_variables --collect.slave_status --collect.binlog_size --collect.engine_innodb_status --collect.info_schema.innodb_metrics --collect.info_schema.innodb_tablespaces --collect.info_schema.processlist --collect.info_schema.tablestats --collect.perf_schema.eventsstatements --collect.perf_schema.eventswaits --collect.perf_schema.file_events
autostart = true
startsecs = 5
autorestart = true
startretries = 3
user = root
redirect_stderr = true
stdout_logfile_maxbytes = 20MB
stdout_logfile_backups = 20
stdout_logfile = /var/log/supervisor/xxxx.log
environment=DATA_SOURCE_NAME='user:password@(hostname:3306)/'

查看服務

$ supervisorctl status
mysql_xxx_01                  RUNNING   pid 13935, uptime 4:15:15
mysql_xxx_02                  RUNNING   pid 14053, uptime 4:15:15
mysql_xxx_03                  RUNNING   pid 13866, uptime 4:15:15
...

2.3 prometheus服務發現

# 主配置文件
$ cat prometheus.yml
...
  - job_name: 'mysqld_exporter'
    file_sd_configs:
    - files:
      - '/usr/local/prometheus/sd_cfg/mysqld_exporter.yml'
      refresh_interval: 15s
...

# 服務發現配置文件
$ cat /usr/local/prometheus/sd_cfg/mysqld_exporter.yml
- labels:
    alias : test
    depart : "TEST"
  targets:
  - [ECS_IP]:[PORT_TEST]

- labels:
    alias : qa
    depart : "QA"
  targets:
  - [ECS_IP]:[PORT_QA]

- labels:
    alias : pro1
    depart : "PRO"
  targets:
  - [ECS_IP]:[PORT_PRO1]

- labels:
    alias : pro2
    depart : "PRO"
  targets:
  - [ECS_IP]:[PORT_PRO2]
...

服務發現好處不言而喻,自動加載新增RDS

2.4 最後一哆嗦

目前已經完成了阿里雲RDS所有層面的監控,難道每次新增一套RDS都要人肉一遍這個流程?顯然有點二了。

只描述思路,就不貼腳本了:

  1. 通過阿里雲API,獲取所有RDS信息;
  2. 根據獲取的信息爲每個RDS生成mysqld_exporter啓動腳本,並通過supervisor控制自啓動;
  3. 根據獲取的信息更新sd_cfg/mysqld_exporter.yml,實現服務自發現;
  4. 最後,計劃任務定期去掃阿里雲API,判斷是否有新的RDS創建/刪除

至此,再也不用人肉去加監控了,腳本不死,一切自動。

3. 簡單效果展示

Alien_exporter採集的數據
看板

Detail的數據源是兩部分

  • 資源監控
    在這裏插入圖片描述

  • mysql監控
    在這裏插入圖片描述
    在這裏插入圖片描述

4. 遺憾

一個mysqld_exporter進程只能監控一個RDS實例,所以N多RDS實例,就要對應啓動N個mysqld_exporter,同時要分配N個不同端口(後續可以通過修改mysqld_exporter源碼優化只啓動一個mysqld_exporter服務)

水平有限,一個監控搞的那麼碎,東拼西湊的,如哪位大佬有更優的解決方案求指導。

另外,調用阿里雲API每個月是有上限的,超出要付費的,還好一個月50塊錢的足夠用。

另外,會有API獲取不到數據的情況。出現斷圖也是很常見,但mysqld_exporter還是很ok的。

在這裏插入圖片描述

發佈了18 篇原創文章 · 獲贊 0 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章