監控MySQL你還應該收集表信息

1. Story

也許你常常會被問到,庫裏某個表最近一年的內每月的數據量增加狀況。固然若是你有按月分表比較好辦,挨個 show table status,若是隻有一個大表,那估計要在你們都休息的時候,寂寞的夜裏去跑sql統計了,由於你只能獲取當前的表信息,歷史信息追查不到了。python

除此之外,做爲DBA自己也要對數據庫空間增加狀況進行預估,用以規劃容量。咱們說的表信息主要包括:mysql

  1. 表數據大小(DATA_LENGTH)git

  2. 索引大小(INDEX_LENGTH)github

  3. 行數(ROWS)sql

  4. 當前自增值(AUTO_INCREMENT,若是有)數據庫

目前是沒有看到哪一個mysql監控工具上提供這樣的指標。這些信息不須要採集的太頻繁,並且結果也只是個預估值,不必定準確,因此這是站在一個全局、長遠的角度去監控(採集)表的。json

本文要介紹的本身寫的採集工具,是基於組內現有的一套監控體系:安全

  • InfluxDB:時間序列數據庫,存儲監控數據服務器

  • Grafana:數據展現面板工具

  • Telegraf:收集信息的agent
    看了下 telegraf 的最新的 mysql 插件,一開始很欣慰:支持收集 Table schema statistics 和 Info schema auto increment columns。試用了一下,有數據,可是如前面所說,除了自增值外其餘都是預估值,telegraf收集頻率太高沒啥意義,也許一天2次就足夠了,它提供的 IntervalSlow選項固定寫死在代碼裏,只能是放緩 global status 監控頻率。不過卻是能夠與其它監控指標分開成兩份配置文件,各自定義收集間隔來實現。

最後打算本身用python擼一個,上報到influxdb裏 :)

2. Concept

完整代碼見 GitHub項目地址:DBschema_gather
實現也特別簡單,就是查詢 information_schema 庫的 COLUMNSTABLES 兩個表:
<!-- more -->

SELECT
    IFNULL(@@hostname, @@server_id) SERVER_NAME,
    %s as HOST,
    t.TABLE_SCHEMA,
    t.TABLE_NAME,
    t.TABLE_ROWS,
    t.DATA_LENGTH,
    t.INDEX_LENGTH,
    t.AUTO_INCREMENT,
  c.COLUMN_NAME,
  c.DATA_TYPE,
  LOCATE('unsigned', c.COLUMN_TYPE) COL_UNSIGNED
  # CONCAT(c.DATA_TYPE, IF(LOCATE('unsigned', c.COLUMN_TYPE)=0, '', '_unsigned'))
FROM
    information_schema.`TABLES` t
LEFT JOIN information_schema.`COLUMNS` c ON t.TABLE_SCHEMA = c.TABLE_SCHEMA
AND t.TABLE_NAME = c.TABLE_NAME
AND c.EXTRA = 'auto_increment'
WHERE
    t.TABLE_SCHEMA NOT IN (
        'mysql',
        'information_schema',
        'performance_schema',
        'sys'
    )
AND t.TABLE_TYPE = 'BASE TABLE'

關於 auto_increment,咱們除了關注當前增加到哪了,還會在乎相比 int / bigint 的最大值,還有多少可用空間。因而計算了 autoIncrUsage 這一列,用於保存當前已使用的比例。

而後使用 InfluxDB 的python客戶端,批量存入influxdb。若是沒有InfluxDB,結果會打印出json —— 這是Zabbix、Open-Falcon這些監控工具廣泛支持的格式。

最後就是使用 Grafana 從 influxdb 數據源畫圖。

3. Usage

  1. 環境
    在 python 2.7 環境下編寫的,2.6,3.x沒測。

運行須要MySQLdbinfluxdb兩個庫:

$ sudo pip install mysql-python influxdb
  1. 配置
    settings_dbs.py 配置文件

    • DBLIST_INFO:列表存放須要採集的哪些MySQL實例表信息,元組內分別是鏈接地址、端口、用戶名、密碼
      用戶須要select表的權限,不然看不到對應的信息.

  • InfluxDB_INFO:influxdb的鏈接信息,注意提早建立好數據庫名 mysql_info
    設置爲 None 可輸出結果爲json.

  • 建立influxdb上的數據庫和存儲策略
    存放2年,1個複製集:(按需調整)

  • CREATE DATABASE "mysql_info"
    CREATE RETENTION POLICY "mysql_info_schema" ON "mysql_info" DURATION 730d REPLICATION 1 DEFAULT

    看大的信息相似於:
    schema-influxdb-data

    1. 放crontab跑
      能夠單獨放在用於監控的服務器上,不過建議在生產環境能夠運行在mysql實例所在主機上,安全起見。

    通常庫在晚上會有數據遷移的動做,能夠在遷移先後分別運行 mysql_schema_info.py 來收集一次。不建議太頻繁。

    40 23,5,12,18 * * * /opt/DBschema_info/mysql_schema_info.py >> /tmp/collect_DBschema_info.log 2>&1
    1. 生成圖表

    導入項目下的 grafana_table_stats.json 到 Grafana面板中。效果以下:
    表數據大小和行數
    表數據大小和行數

    天天行數變化增量,auto_increment使用率
    天天行數變化增量,auto_increment使用率

    4. More

    1. 分庫分表狀況下,全局惟一ID在表裏沒法計算 autoIncrUsage

    2. 實現上其實很簡單,更主要的是喚醒收集這些信息的意識

    3. 能夠增長 Graphite 輸出格式

    ---

    原文連接地址:http://seanlook.com/2016/12/0...

    ---

    相關文章
    相關標籤/搜索