使用Zabbix + Python對Mysql監控

小豹子加油發表於2021-12-14

一、背景介紹

隨著公司業務的變遷,公司的開發資料庫以mysql為主了。mysql伺服器層面的監控,例如CPU、記憶體、硬碟空間等就用zabbix自帶的linux模板即可。資料庫層面zabbix也自帶了一個模板,但是它需要將mysql的密碼寫到my.cnf檔案中,這樣不安全,因此決定自己寫一個。原先我寫過一個用python去監控oracle的部落格使用zabbix監控oracle資料庫,對於mysql的監控大同小異,只需要簡單改改監控項即可。

二、監控方式

Zabbix服務端的環境為:CentOS 6.10, Zabbix 3.4.15, Python 3.6.8。被監控的mysql 版本為8.0.x。監控採用外部檢查(External Check)的方式,即從zabbix服務端執行python指令碼,去查詢被監控的mysql資訊。這種方式的好處是監控指令碼放在zabbix服務端,後面想修改模板和指令碼只需要在zabbix服務端修改一次即可,被監控端不用做任何操作,省心。

三、監控項規劃

確定好了監控方式,接下來就開始對監控項進行規劃。

1. os層

port:mysql埠是否正常監聽,檢測不到監聽埠,報警
proc:mysqld程式是否存在,檢測不到mysqld程式,報警
以上兩個監控項通過zabbix agent採集資訊(需要在被監控機安裝zabbix-agent)

2. db層

主庫和從庫都包括的監控項:
readonly:是否只讀,狀態發生改變時報警
uptime:執行時間,uptime減少表示資料庫發生了重啟,報警
queries:檢查qps
select: 查詢的sql次數
update: 更新的sql次數
delete: 刪除的sql次數
insert: 插入的sql次數
slow_queries: 慢查詢次數
threads_running: 正在執行的執行緒數,設定100,超過該值報警,根據自己需求適當調整
threads_limit: 執行緒限制,設定90%,超過該值報警,根據自己需求適當調整

只在從庫有的監控項:
從庫採用自動發現的方式,即執行“show slave status”有結果就表明這個是從庫
slave_io_running:從庫的io執行緒,如果不為YES,報警
slave_sql_running: 從庫的sql執行緒,如果不為YES,報警
seconds_behind_master:從庫落後主庫的時間,設定10分鐘,超過該值報警,根據自己需求適當調整

四、實踐

  1. 我假設你已經有了zabbix服務端,因此這裡略過如何搭建zabbix。

  2. 在zabbix服務端安裝python3(略),並安裝argparse, inspect, pymysql包。

  3. 將附件中的mysqlmon.py放入/usr/lib/zabbix/externalscripts下,同時賦許可權chmod 755 mysqlmon.py,注意修改mysqlmon.py的第一行#!/usr/local/python3/bin/python3,這裡要改成你自己的python執行路徑。

  4. 將附件的mysql_template.xml匯入到zabbix中(我是基於zabbix 3.4.15寫的模板,其它zabbix版本可能會出現模板導不進去的情況)。
    微信截圖_20211206155400.png

  5. 新增伺服器,連結到模板Template-Db-Mysql-ExternalCheck-Customize。
    微信截圖_20211206155513.png

  6. 在被監控的mysql中建立監控使用者,使用者只需要有show view, replication client許可權即可。
    grant show view, replication client on . to xxx;

  7. 修改主機中的巨集(address,username,password填寫被監控mysql的資訊)
    微信截圖_20211206154759.png

後面就能看到相關圖形和報警了
微信截圖_20211206173047.png

微信截圖_20211206162033.png

如果想自己新增一個監控項,則只需要在mysqlmon.py新增一個方法,方法名與key的引數名一致即可(下面是一個示例,我用紅框圈出來的地方)
微信截圖_20211206180756.png

微信截圖_20211206173644.png

如果大家在使用過程中碰到了問題以及想新增其它的監控項,歡迎大家在部落格下面留言,我後續對這個模板進行改進。

五、附件

下面附件下載都為txt字尾,需要手工修改
mysqlmon.py下載地址
mysql_template.xml下載地址

相關文章