1. 程式人生 > 實用技巧 >監控MySQL執行狀態:MySQLD Exporter

監控MySQL執行狀態:MySQLD Exporter

具體監控配置詳看這篇文章:https://www.cnblogs.com/sanduzxcvbnm/p/13094580.html

為了確保資料庫的穩定執行,通常會關注一下四個與效能和資源利用率相關的指標:查詢吞吐量、連線情況、緩衝池使用情況以及查詢執行效能等。

監控資料庫吞吐量

對於資料庫而言,最重要的工作就是實現對資料的增、刪、改、查。為了衡量資料庫伺服器當前的吞吐量變化情況。在MySQL內部通過一個名為Questions的計數器,當客戶端傳送一個查詢語句後,其值就會+1。可以通過以下MySQL指令查詢Questions等伺服器狀態變數的值:

mysql> SHOW GLOBAL STATUS LIKE "Questions";
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Questions     | 1326  |
+---------------+-------+
1 row in set (0.00 sec)

MySQLD Exporter中返回的樣本資料中通過mysql_global_status_questions反映當前Questions計數器的大小:

# HELP mysql_global_status_questions Generic metric from SHOW GLOBAL STATUS.
# TYPE mysql_global_status_questions untyped
mysql_global_status_questions 1016

通過以下PromQL可以檢視當前MySQL例項查詢速率的變化情況,查詢數量的突變往往暗示著可能發生了某些嚴重的問題,因此用於使用者應該關注並且設定響應的告警規則,以及時獲取該指標的變化情況:

rate(mysql_global_status_questions[2m])

一般還可以從監控讀操作和寫操作的執行情況進行判斷。通過MySQL全域性狀態中的Com_select可以查詢到當前伺服器執行查詢語句的總次數:相應的,也可以通過Com_insert、Com_update以及Com_delete的總量衡量當前伺服器寫操作的總次數,例如,可以通過以下指令查詢當前MySQL例項insert語句的執行次數總量:

mysql> SHOW GLOBAL STATUS LIKE "Com_insert";
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Com_insert    | 0     |
+---------------+-------+
1 row in set (0.00 sec)

從MySQLD Exporter的/metrics返回的監控樣本中,可以通過global_status_commands_total獲取當前例項各類指令執行的次數:

# HELP mysql_global_status_commands_total Total number of executed MySQL commands.
# TYPE mysql_global_status_commands_total counter
mysql_global_status_commands_total{command="admin_commands"} 0
mysql_global_status_commands_total{command="alter_db"} 0
mysql_global_status_commands_total{command="alter_db_upgrade"} 0
mysql_global_status_commands_total{command="select"} 10
mysql_global_status_commands_total{command="insert"} 2
mysql_global_status_commands_total{command="update"} 2
mysql_global_status_commands_total{command="delete"} 1

使用者可以通過以下PromQL檢視當前MySQL例項寫操作速率的變化情況:

sum(rate(mysql_global_status_commands_total{command=~"insert|update|delete"}[2m])) without (command)

連線情況

在MySQL中通過全域性設定max_connections限制了當前伺服器允許的最大客戶端連線數量。一旦可用連線數被用盡,新的客戶端連線都會被直接拒絕。 因此當監控MySQL執行狀態時,需要時刻關注MySQL伺服器的連線情況。使用者可以通過以下指令檢視當前MySQL服務的max_connections配置:

mysql> SHOW VARIABLES LIKE 'max_connections';
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| max_connections | 151   |
+-----------------+-------+
1 row in set (0.01 sec)

MySQL預設的最大連結數為151。臨時調整最大連線數,可以通過以下指令進行設定:

SET GLOBAL max_connections = 200;

如果想永久化設定,則需要通過修改MySQL配置檔案my.cnf,新增以下內容:

max_connections = 200

通過Global Status中的Threads_connected、Aborted_connects、Connection_errors_max_connections以及Threads_running可以檢視當前MySQL例項的連線情況。

例如,通過以下指令可以直接當前MySQL例項的連線數:

mysql> SHOW GLOBAL STATUS LIKE "Threads_connected";
+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| Threads_connected | 1     |
+-------------------+-------+
1 row in set (0.00 sec)

當所有可用連線都被佔用時,如果一個客戶端嘗試連線至MySQL,會出現“Too many connections(連線數過多)”錯誤,同時Connection_errors_max_connections的值也會增加。為了防止出現此類情況,你應該監控可用連線的數量,並確保其值保持在max_connections限制以內。同時如果Aborted_connects的數量不斷增加時,說明客戶端嘗試連線到MySQL都失敗了。此時可以通過Connection_errors_max_connections以及Connection_errors_internal分析連線失敗的問題原因。

下面列舉了與MySQL連線相關的監控指標:

  • mysql_global_variables_max_connections: 允許的最大連線數;
  • mysql_global_status_threads_connected: 當前開放的連線;
  • mysql_global_status_threads_running:當前開放的連線;
  • mysql_global_status_aborted_connects:當前開放的連線;
  • mysql_global_status_connection_errors_total{error=”max_connections”}:由於超出最大連線數導致的錯誤;
  • mysql_global_status_connection_errors_total{error=”internal”}:由於系統內部導致的錯誤;

通過PromQL查詢當前剩餘的可用連線數:

mysql_global_variables_max_connections - mysql_global_status_threads_connected

使用PromQL查詢當前MySQL例項連線拒絕數:

mysql_global_status_aborted_connects

監控緩衝池使用情況

MySQL預設的儲存引擎InnoDB使用了一片稱為緩衝池的記憶體區域,用於快取資料表以及索引的資料。 當緩衝池的資源使用超出限制後,可能會導致資料庫效能的下降,同時很多查詢命令會直接在磁碟中執行,導致磁碟I/O不斷攀升。 因此,應該關注MySQL緩衝池的資源使用情況,並且在合理的時間擴大緩衝池的大小可以優化資料庫的效能。

Innodb_buffer_pool_pages_total反映了當前緩衝池中的記憶體頁的總頁數。可以通過以下指令檢視:

mysql> SHOW GLOBAL STATUS LIKE "Innodb_buffer_pool_pages_total";
+--------------------------------+-------+
| Variable_name                  | Value |
+--------------------------------+-------+
| Innodb_buffer_pool_pages_total | 8191  |
+--------------------------------+-------+
1 row in set (0.02 sec)

MySQLD Exporter通過以下指標返回緩衝池中各類記憶體頁的數量:

# HELP mysql_global_status_buffer_pool_pages Innodb buffer pool pages by state.
# TYPE mysql_global_status_buffer_pool_pages gauge
mysql_global_status_buffer_pool_pages{state="data"} 516
mysql_global_status_buffer_pool_pages{state="dirty"} 0
mysql_global_status_buffer_pool_pages{state="free"} 7675
mysql_global_status_buffer_pool_pages{state="misc"} 0

Innodb_buffer_pool_read_requests記錄了正常從緩衝池讀取資料的請求數量。可以通過以下指令檢視:

mysql> SHOW GLOBAL STATUS LIKE "Innodb_buffer_pool_read_requests";
+----------------------------------+--------+
| Variable_name                    | Value  |
+----------------------------------+--------+
| Innodb_buffer_pool_read_requests | 797023 |
+----------------------------------+--------+
1 row in set (0.00 sec)

MySQLD Exporter通過以下指標返回緩衝池中Innodb_buffer_pool_read_requests的值:

# HELP mysql_global_status_innodb_buffer_pool_read_requests Generic metric from SHOW GLOBAL STATUS.
# TYPE mysql_global_status_innodb_buffer_pool_read_requests untyped
mysql_global_status_innodb_buffer_pool_read_requests 736711

當緩衝池無法滿足時,MySQL只能從磁碟中讀取資料。Innodb_buffer_pool_reads即記錄了從磁碟讀取資料的請求數量。通常來說從記憶體中讀取資料的速度要比從磁碟中讀取快很多,因此,如果Innodb_buffer_pool_reads的值開始增加,可能意味著資料庫的效能有問題。 可以通過以下只能檢視Innodb_buffer_pool_reads的數量

mysql> SHOW GLOBAL STATUS LIKE "Innodb_buffer_pool_reads";
+--------------------------+-------+
| Variable_name            | Value |
+--------------------------+-------+
| Innodb_buffer_pool_reads | 443   |
+--------------------------+-------+
1 row in set (0.00 sec)

在MySQLD Exporter中可以通過以下指標檢視Innodb_buffer_pool_reads的數量。

# HELP mysql_global_status_innodb_buffer_pool_reads Generic metric from SHOW GLOBAL STATUS.
# TYPE mysql_global_status_innodb_buffer_pool_reads untyped
mysql_global_status_innodb_buffer_pool_reads 443

通過以上監控指標,以及實際監控的場景,我們可以利用PromQL快速建立多個監控項。

通過以下PromQL可以得到各個MySQL例項的緩衝池利用率。一般來說還需要結合Innodb_buffer_pool_reads的增長率情況來結合判斷緩衝池大小是否合理:

(sum(mysql_global_status_buffer_pool_pages) by (instance) - sum(mysql_global_status_buffer_pool_pages{state="free"}) by (instance)) / sum(mysql_global_status_buffer_pool_pages) by (instance)

也可以通過以下PromQL計算2分鐘內磁碟讀取請求次數的增長率的變化情況:

rate(mysql_global_status_innodb_buffer_pool_reads[2m])

查詢效能

MySQL還提供了一個Slow_queries的計數器,當查詢的執行時間超過long_query_time的值後,計數器就會+1,其預設值為10秒,可以通過以下指令在MySQL中查詢當前long_query_time的設定:

mysql> SHOW VARIABLES LIKE 'long_query_time';
+-----------------+-----------+
| Variable_name   | Value     |
+-----------------+-----------+
| long_query_time | 10.000000 |
+-----------------+-----------+
1 row in set (0.00 sec)

通過以下指令可以檢視當前MySQL例項中Slow_queries的數量:

mysql> SHOW GLOBAL STATUS LIKE "Slow_queries";
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Slow_queries  | 0     |
+---------------+-------+
1 row in set (0.00 sec)

MySQLD Exporter返回的樣本資料中,通過以下指標展示當前的Slow_queries的值:

# HELP mysql_global_status_slow_queries Generic metric from SHOW GLOBAL STATUS.
# TYPE mysql_global_status_slow_queries untyped
mysql_global_status_slow_queries 0

通過監控Slow_queries的增長率,可以反映出當前MySQL伺服器的效能狀態,可以通過以下PromQL查詢Slow_queries的增長情況:

rate(mysql_global_status_slow_queries[2m])

在MySQL中還可以通過安裝response time外掛,從而支援記錄查詢時間區間的統計資訊。啟動該功能後MySQLD Exporter也會自動獲取到相關資料,從而可以細化MySQL查詢響應時間的分佈情況。