自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

基于 Prometheus 的云上 MySQL 監(jiān)控實踐

數(shù)據(jù)庫 MySQL
MySQL 8.0是當前Oracle公司一直在大力宣傳的新版本,從架構(gòu)到性能均有顯著變化,同時,隨著kubernetes的普及,為更好的提升資源利用率,可以進行MySQL上云的探索。

[[326538]]

一、背景

MySQL 8.0是當前Oracle公司一直在大力宣傳的新版本,從架構(gòu)到性能均有顯著變化,同時,隨著kubernetes的普及,為更好的提升資源利用率,可以進行MySQL上云的探索。MySQL上云如何進行運行狀態(tài)的監(jiān)控呢?MySQL運行狀態(tài)監(jiān)控需要滿足:監(jiān)控數(shù)據(jù)實時準備,報警機制響應迅速,支持異地集中監(jiān)控。本文將探索云上MySQL的監(jiān)控方案。

二、方案對比

方案一:

Zabbix監(jiān)控系統(tǒng),基于c+php開發(fā)的開源監(jiān)控系統(tǒng),支持多種監(jiān)控采集方式,應用廣泛,支持比較成熟,社區(qū)活躍,缺點是對容器支持度比較差。

方案二:

Prometheus監(jiān)控系統(tǒng),基于go開發(fā)的開源監(jiān)控系統(tǒng),支持pull和push兩種采集模式,有完整的監(jiān)控、報警、展示、數(shù)據(jù)異地傳輸能力,配置簡單,對容器支持良好。

由于目前使用的MySQL在云上部署,而且公司現(xiàn)有對PaaS云監(jiān)控基于Promehteus,因此,方案二是更佳選項,既能滿足MySQL監(jiān)控,又能充分利用現(xiàn)有資源。

三、Prometheus監(jiān)控系統(tǒng)概述

Prometheus是由SoundeCloud公司基于go語言開發(fā)的一款開源的監(jiān)控報警解決方案,基于時間序列監(jiān)控數(shù)據(jù)。

1、組件及架構(gòu)

組件:

  • promethues server:主要獲取和存儲時間序列數(shù)據(jù)
  • Exporters(導出器):主要是作為agent收集數(shù)據(jù)發(fā)送到prometheus server,不同的數(shù)據(jù)收集由不同的exporters實
  • pushgateway:允許短暫和批處理的jobs推送它們的數(shù)據(jù)到prometheus;然后由prometheus拉取數(shù)據(jù)。
  • alertmanager:實現(xiàn)prometheus的告警功能。

組件間關系如下:

 

圖1 組件架構(gòu)圖

2、Prometheus特點

  • 指標收集:prometheus服務器定義了名為目標(target)的配置,執(zhí)行抓取所需要的信息。
  • 服務發(fā)現(xiàn):可以通過通過多種方式來處理要監(jiān)控的資源。包括:靜態(tài)資源列表、基于文件發(fā)現(xiàn)、自動發(fā)現(xiàn)。
  • 聚合和報警:在服務器上可以查詢和聚合時間序列數(shù)據(jù)。通過規(guī)則記錄常用的查詢并做聚合??梢栽O置報警規(guī)則,滿足報警條件時會觸發(fā)報警,把報警信息推送的alertmanager。
  • 自治:不依賴分布式存儲,單個服務器節(jié)點是自主的。
  • 冗余和高可用性:可部署多臺prmehteus服務器,實現(xiàn)監(jiān)控系統(tǒng)的高可用性。
  • 查詢語言:prometheus服務器提供了查詢語言PromQL,用于對時序數(shù)據(jù)進行篩選和運算。
  • 可視化:prometheus內(nèi)置表達式瀏覽器可提供可視化,可與grafana配合實現(xiàn)監(jiān)控數(shù)據(jù)可視化展示。

四、MySQL數(shù)據(jù)庫監(jiān)控

1、監(jiān)控方案

Prometheus官方提供了mysqld_exporter導出器,可實現(xiàn)對MySQL監(jiān)控。該導出器通過MySQL用戶連接數(shù)據(jù)庫,查詢相關數(shù)據(jù)庫表、狀態(tài)信息,通過http服務的方式暴露監(jiān)控數(shù)據(jù)。

方案不足:導出器可實現(xiàn)單節(jié)點和主從復制相關監(jiān)控項,但對于MGR模式相關監(jiān)控目前還不能很好地支持。

方案改進:prometheus提供了client libraries,可實現(xiàn)對監(jiān)控指標進行定制化采集。故可用python語言定制腳本的方式采集MGR相關數(shù)據(jù)。mysqld_exporter與python腳本能夠滿足全部監(jiān)控信息的導出。

2、部署方案

關于Paas云上MySQL監(jiān)控部署,有兩種方案:

方案一:

 

MySQL、mysqld_exporter、my_exporter_python監(jiān)控腳本三部分同在一個鏡像中,運行該容器可實現(xiàn)對MySQL的監(jiān)控。

方案二:

 

MySQL、mysqld_exporter、my_exporter_python監(jiān)控腳本分別屬于不同的鏡像,MySQL主容器與監(jiān)控容器按順序運行。監(jiān)控容器以sidecar的方式訪問MySQL。

方案對比:

MySQL數(shù)據(jù)庫服務對于應用是非常重要的一環(huán),要確保MySQL安全可靠。方案一,如果MySQL異?;虺霈F(xiàn)錯誤,對問題診斷與排錯方面,監(jiān)控導出器可能會干擾項,不利于后期MySQL運維管理。方案二,由于三部分在不同的容器中運行,不會產(chǎn)生互相干擾的可能性,因此方案二為最佳。

五、監(jiān)控具體實現(xiàn)

1、創(chuàng)建MySQL監(jiān)控用戶并授權

 

2、my_exporter_python腳本說明

9000端口提供http提供服務

start_http_server(9000)

設置Gauge對象

 

 


連接接MySQL查詢數(shù)據(jù)

 

 

設置MGR相關的metrics

 

3、鏡像拉取與定制

mysqld_exporter鏡像pull:

docker pull prom/mysqld_exporter

my_exporter_python鏡像制作

Dockerfile內(nèi)容

FROM centos7_python36:v1

RUN pip install prometheus_client pymysql

RUN pip install requests

COPY ./my_exporter_python_v2.py /my_exporter_python_v2.py

WORKDIR /

EXPOSE 9000

CMD ["python","my_exporter_python_v2.py"]

4、鏡像部署yaml文件部分內(nèi)容:

  1. apiVersion: apps/v1 
  2. kind: StatefulSet 
  3. metadata: 
  4. ...... 
  5.       containers: 
  6.         - env: 
  7.             - name: TZ 
  8.               value: Asia/Shanghai 
  9.             - name: DATA_SOURCE_NAME 
  10.               value: 'exporter:userpassword@(localhost:3306)/' 
  11.             - name: TARGET 
  12.               value: 'http://localhost:9104/metrics' 
  13.           image: 'registry.paas.test.abc/library/mysqld-exporter-python:v5' 
  14.           imagePullPolicy: Always 
  15.           name: mysqld-python 
  16.           ports: 
  17.             - containerPort: 9000 
  18.               name: mysqld-python 
  19.               protocol: TCP 
  20.           resources: 
  21.             limits: 
  22.               cpu: '2' 
  23.               memory: 4Gi 
  24.           terminationMessagePath: /dev/termination-log 
  25.           terminationMessagePolicy: File 
  26.         - env: 
  27.             - name: TZ 
  28.               value: Asia/Shanghai 
  29.             - name: DATA_SOURCE_NAME 
  30.               value: 'testuser:userpassword@(localhost:3306)/' 
  31.           image: 'registry.paas.test.abc/library/mysqld-exporter:latest' 
  32.           imagePullPolicy: Always 
  33.           name: mysqld-exporter 
  34.           ports: 
  35.             - containerPort: 9104 
  36.               name: mysqld-exporter 
  37.               protocol: TCP 
  38.           resources: 
  39.             limits: 
  40.               cpu: '2' 
  41.               memory: 4Gi 
  42.           terminationMessagePath: /dev/termination-log 
  43.           terminationMessagePolicy: File 
  44. ...... 

5、Prometehus server設置target

  1. job_name: kubernetes-pods 
  2.   scrape_interval: 30s 
  3.   scrape_timeout: 10s 
  4.   metrics_path: /metrics 
  5.   scheme: http 
  6.   kubernetes_sd_configs: 
  7.   - api_server: null 
  8.     role: pod 
  9.     namespaces: 
  10.       names: [] 
  11.   relabel_configs: 
  12.   - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape] 
  13.     separator: ; 
  14.     regex: "true" 
  15.     replacement: $1 
  16.     action: keep 
  17.   - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_path] 
  18.     separator: ; 
  19.     regex: (.+) 
  20.     target_label: __metrics_path__ 
  21.     replacement: $1 
  22.     actionreplace 
  23.   - source_labels: [__address__, __meta_kubernetes_pod_annotation_prometheus_io_port] 
  24.     separator: ; 
  25.     regex: ([^:]+)(?::\d+)?;(\d+) 
  26.     target_label: __address__ 
  27.     replacement: $1:$2 
  28.     actionreplace 
  29.   - separator: ; 
  30.     regex: __meta_kubernetes_pod_label_(.+) 
  31.     replacement: $1 
  32.     action: labelmap 
  33.   - source_labels: [__meta_kubernetes_namespace] 
  34.     separator: ; 
  35.     regex: (.*) 
  36.     target_label: kubernetes_namespace 
  37.     replacement: $1 
  38.     actionreplace 
  39.   - source_labels: [__meta_kubernetes_pod_name] 
  40.     separator: ; 
  41.     regex: (.*) 
  42.     target_label: kubernetes_pod_name 
  43.     replacement: $1 
  44.     actionreplace 

六、采集指標解釋

  • 查詢mysql上線時間
  1. mysql> show status like '%uptime%'
  2. +---------------------------+---------+ 
  3. | Variable_name             | Value   | 
  4. +---------------------------+---------+ 
  5. | Uptime                    | 1284686 | 
  6. | Uptime_since_flush_status | 1284686 | 
  7. +---------------------------+---------+ 

Uptime即為mysql上線時間,單位為秒,對應輸出的監(jiān)控指標為:Mysql_uptime。可以對監(jiān)控指標運算得到相應時間單位,例如轉(zhuǎn)為天數(shù),mysql_uptime/60/60/24。

  • 查詢mysql服務端口mysql
  1. mysql> show variables like 'port'
  2. +---------------+-------+ 
  3. | Variable_name | Value | 
  4. +---------------+-------+ 
  5. | port          | 3306  | 
  6. +---------------+-------+ 

對應輸出監(jiān)控指標為:mysql_global_variables_port

  • 查看mysql服務器是否在線

如果mysqld_exporter連接mysql服務器成功,表示服務器在線,否則表示離線狀態(tài),對應輸出的監(jiān)指標:mysql_up。數(shù)值為1表示在線,數(shù)值0表示離線。

查看數(shù)據(jù)庫連接數(shù)

  1. mysql> show status like 'Threads%'
  2. +-------------------+-------+ 
  3. | Variable_name     | Value | 
  4. +-------------------+-------+ 
  5. | Threads_cached    | 2     | 
  6. | Threads_connected | 1     | 
  7. | Threads_created   | 3     | 
  8. | Threads_running   | 2     | 
  9. +-------------------+-------+ 
  10. mysql> show variables like '%max_connection%'
  11. +------------------------+-------+ 
  12. | Variable_name          | Value | 
  13. +------------------------+-------+ 
  14. | max_connections        | 151   | 
  15. | mysqlx_max_connections | 100   | 
  16. +------------------------+-------+ 
  17. mysql> show global status like 'max_used_connections'
  18. +----------------------+-------+ 
  19. | Variable_name        | Value | 
  20. +----------------------+-------+ 
  21. | Max_used_connections | 3     | 
  22. +----------------------+-------+ 

Thread_connected:表示打開的鏈接數(shù),對應輸出的監(jiān)控指標為:mysql_global_status_threads_connected。

Threads_running:表示激活的連接數(shù),并發(fā)數(shù),對應輸出的監(jiān)控指標為:mysql_global_status_threads_running。

max_used_connections:表示當前使用過的最大連接數(shù),對應輸出的監(jiān)控指標為:mysql_global_status_max_used_connections。

max_connections:表示并發(fā)執(zhí)行的最大連接數(shù),對應輸出的監(jiān)控指標為:mysql_global_variables_max_connections。

  • 查看慢查詢數(shù)量
  1. mysql> show global status like '%Slow_queries%'
  2. +---------------+-------+ 
  3. | Variable_name | Value | 
  4. +---------------+-------+ 
  5. | Slow_queries  | 0     | 
  6. +---------------+-------+ 

對應輸出監(jiān)控指標為:mysql_global_status_slow_queries

此指標為當前慢查詢的總數(shù),如果想要更精確的顯示慢查詢額狀態(tài),可以使用promQL,將監(jiān)控指標顯示為每秒慢查詢的數(shù)量,可以如下所示:irate(mysql_global_status_slow_queries[5m]),顯示5分鐘內(nèi),每秒慢查詢的數(shù)量。

  • 查詢QPS
  1. mysql> show global status like 'questions';  
  2. +---------------+--------+ 
  3. | Variable_name | Value  | 
  4. +---------------+--------+ 
  5. | Questions     | 407158 | 
  6. +---------------+--------+ 

Questions:表示為收到的總請求的次數(shù),對應輸出的監(jiān)控指標為:mysql_global_status_questions。如果想要得到?jīng)]秒請求的數(shù)量,可以如下方法所示:

irate(mysql_global_status_questions[5m]),顯示5分鐘內(nèi)每秒請求的數(shù)量,即QPS。

  • 查詢innodb_buffer_pool命中率
  1. mysql> show global status like 'innodb_buffer_pool_read%'
  2. +---------------------------------------+-------+ 
  3. | Variable_name                         | Value | 
  4. +---------------------------------------+-------+ 
  5. | Innodb_buffer_pool_read_ahead_rnd     | 0     | 
  6. | Innodb_buffer_pool_read_ahead         | 0     | 
  7. | Innodb_buffer_pool_read_ahead_evicted | 0     | 
  8. | Innodb_buffer_pool_read_requests      | 19268 | 
  9. | Innodb_buffer_pool_reads              | 887   | 
  10. +---------------------------------------+-------+ 

Innodb_buffer_pool_reads:表示直接從磁盤讀的次數(shù),對應輸出的監(jiān)控指標為:

mysql_global_status_innodb_buffer_pool_reads。

Innodb_buffer_pool_read_requests:表示邏輯讀的次數(shù),

對應輸出的監(jiān)控指標為:

mysql_global_status_innodb_buffer_pool_read_requests。

計算邏輯讀的命中率,公式為:100 - 100 * (mysql_global_status_innodb_buffer_pool_reads/

 

mysql_global_status_innodb_buffer_pool_read_requests)。

計算邏輯讀的命中率,公式為:100 - 100 * (mysql_global_status_innodb_buffer_pool_reads/

mysql_global_status_innodb_buffer_pool_read_requests)。

  • 查詢打開表的數(shù)量
  1. mysql> show global status like 'open_tables'
  2. +---------------+-------+ 
  3. | Variable_name | Value | 
  4. +---------------+-------+ 
  5. | Open_tables   | 371   | 
  6. +---------------+-------+ 

對應輸出的監(jiān)控指標為:mysql_global_status_open_tables

  • 查詢表緩存命中率
  1. mysql> show global status like 'threads_created'
  2. +-----------------+-------+ 
  3. | Variable_name   | Value | 
  4. +-----------------+-------+ 
  5. | Threads_created | 3     | 
  6. +-----------------+-------+ 
  7. mysql> show global status like 'connections'
  8. +---------------+-------+ 
  9. | Variable_name | Value | 
  10. +---------------+-------+ 
  11. | Connections   | 33479 | 
  12. +---------------+-------+ 

Threads_created:表示創(chuàng)建過的線程數(shù),對應輸出的監(jiān)控指標為:mysql_global_status_threads_created。

Connections:表示試圖鏈接mysql服務器的次數(shù),對應輸出的監(jiān)控指標為:mysql_global_status_connections。

表緩存命中率為:(1-mysql_global_status_threads_created/mysql_global_status_connections)*100 。

  • 查詢鎖狀態(tài)
  1. mysql> show global status like 'table_locks%'
  2. +-----------------------+--------+ 
  3. | Variable_name         | Value  | 
  4. +-----------------------+--------+ 
  5. | Table_locks_immediate | 156335 | 
  6. | Table_locks_waited    | 0      | 
  7. +-----------------------+--------+ 

Table_locks_immediate:表示行鎖總數(shù)量,對應輸出監(jiān)控指標為:mysql_global_status_table_locks_immediate,可以計算每秒行鎖數(shù)量,如:

irate(mysql_global_status_table_locks_immediate[5m])。

Table_locks_waited 表示為表鎖數(shù)量,對應輸出監(jiān)控指標為:mysql_global_status_table_locks_waited。

  • 查詢臨時表狀態(tài)
  1. mysql> show global status like '%tmp%'
  2. +-------------------------+--------+ 
  3. | Variable_name           | Value  | 
  4. +-------------------------+--------+ 
  5. | Created_tmp_disk_tables | 0      | 
  6. | Created_tmp_files       | 6      | 
  7. | Created_tmp_tables      | 111563 | 
  8. +-------------------------+--------+ 

Created_tmp_disk_tables:表示為創(chuàng)建磁盤臨時表數(shù)量,對應輸出監(jiān)控指標為:mysql_global_status_created_tmp_disk_tables。

Created_tmp_tables:表示服務器內(nèi)部創(chuàng)建臨時表的數(shù)量,對應輸出指標為:mysql_global_status_created_tmp_tables。

臨時表比例計算為:

mysql_global_status_created_tmp_disk_tables/mysql_global_status_created_tmp_tables。

python腳本實現(xiàn)監(jiān)控指標及sql語句

mysql組復制相關信息記錄在performance_schema庫中的replicaion_conection_status、replication_group_member_stats、replication_group_members表中,通過關聯(lián)查詢能夠得到組復制相關的監(jiān)控項

  • 查詢當前mysql待應用的事務數(shù)
  1. SELECT  
  2.     @@GLOBAL .server_uuid, 
  3.     GTID_SUBTRACT(RECEIVED_TRANSACTION_SET, 
  4.             @@GLOBAL .GTID_EXECUTED) 
  5. FROM 
  6.     performance_schema.replication_connection_status 
  7. WHERE 
  8.     channel_name = 'group_replication_applier' 

對應輸出的監(jiān)控指標為:mysql_mgr_apply_queue

  • 查詢當前mysql待認證的事務數(shù)
  1. SELECT  
  2.     MEMBER_ID, Count_Transactions_in_queue 
  3. FROM 
  4.     performance_schema.replication_group_member_stats 
  5. WHERE 
  6.     member_id = @@GLOBAL .server_uuid 

對應輸出的監(jiān)控指標為:mysql_mgr_cert_queue

  • 查尋當前mysql的節(jié)點狀態(tài),如果是online返回1,如果是offline返回2,如果是error返回3,如果是recovering返回4.
  1. SELECT  
  2.     member_id, 
  3.     CASE 
  4.         WHEN MEMBER_STATE = 'ONLINE' THEN 1 
  5.         WHEN MEMBER_STATE = 'OFFLINE' THEN 2 
  6.         WHEN MEMBER_STATE = 'ERROR' THEN 3 
  7.         WHEN MEMBER_STATE = 'RECOVERING' THEN 4 
  8.         ELSE 0 
  9.     END AS MEMBER_STATE 
  10. FROM 
  11.     performance_schema.replication_group_members 
  12. WHERE 
  13.     MEMBER_ID = @@GLOBAL .server_uuid 
  14.         OR MEMBER_ID = '' 

對應輸出的監(jiān)控指標為:mysql_mgr_node_status

  • 查詢當前mysql節(jié)點的健康狀態(tài)情況,如果online返回1,如果offline返回0。
  1. SELECT  
  2.     member_id, 
  3.     IF(MEMBER_STATE = 'ONLINE' 
  4.             AND ((SELECT  
  5.                 COUNT(*) 
  6.             FROM 
  7.                 performance_schema.replication_group_members 
  8.             WHERE 
  9.                 MEMBER_STATE != 'ONLINE') >= ((SELECT  
  10.                 COUNT(*) 
  11.             FROM 
  12.                 performance_schema.replication_group_members) / 2) = 0), 
  13.         '1'
  14.         '0'
  15. FROM 
  16.     performance_schema.replication_group_members 
  17.         JOIN 
  18.     performance_schema.replication_group_member_stats USING (member_id) 
  19. WHERE 
  20.     member_id = @@GLOBAL .server_uuid 

對應輸出的監(jiān)控指標為:mysql_mgr_node_health

  • 查詢當前mysql節(jié)點角色情況,如果是主庫返回1,如果是非主庫返回0。
  1. SELECT  
  2.     @@server_uuid, 
  3.     IF(@@GLOBAL .group_replication_single_primary_mode, 
  4.         (SELECT  
  5.                 COUNT(1) 
  6.             FROM 
  7.                 performance_schema.global_status 
  8.             WHERE 
  9.                 variable_value = @@server_uuid), 
  10.         (SELECT  
  11.                 COUNT(1) 
  12.             FROM 
  13.                 performance_schema.replication_group_members 
  14.             WHERE 
  15.                 member_id = @@server_uuid 
  16.                     AND member_state = 'ONLINE')) AS isPrimary 

對應輸出的監(jiān)控指標為:mysql_mgr_role

  • 大事務查詢
  1. SELECT  
  2.     @@GLOBAL .server_uuid, COUNT(trx_id) 
  3. FROM 
  4.     information_schema.INNODB_TRX, 
  5.     sys.session AS se 
  6. WHERE 
  7.     trx_mysql_thread_id = conn_id 

對應輸出的監(jiān)控指標為:mysql_big_trx,由于此查詢需要調(diào)用MySQL系統(tǒng)sys相關視圖,所以需要為exporter額外授權。

  1. grant usage on *.* to exporter@'%'
  2. grant select,execute on sys.* to exporter@'%'

七、grafana面板

grafana是一款帶面板展示效果的開源應用。通過配置拉取prometheus服務器的指標數(shù)據(jù),支持時序數(shù)據(jù)的查詢及展示。擁有查詢編譯器功能,能夠?qū)r序數(shù)據(jù)運算后進行可視化展示。只需把prometheus提供的http服務配置即可。以下為MySQL監(jiān)控指標圖像化展示效果。

 

責任編輯:武曉燕 來源: twt企業(yè)IT社區(qū)
相關推薦

2022-03-01 16:26:09

鏈路監(jiān)控日志監(jiān)控分布式系統(tǒng)

2022-02-08 10:21:17

運維應用監(jiān)控

2022-08-27 21:37:57

PrometheusRedis?監(jiān)控

2024-06-14 08:19:45

2023-11-06 01:39:02

Go語言開發(fā)

2021-12-08 10:35:04

開源監(jiān)控Zabbix

2025-03-05 07:00:00

Grafana可視化Kubernetes

2021-09-29 07:22:09

監(jiān)控PrometheusZabbix

2020-12-30 05:34:25

監(jiān)控PrometheusGrafana

2022-03-18 10:09:14

Prometheus微服務架構(gòu)

2025-01-10 00:00:00

Prometheus優(yōu)化Kubernetes

2020-12-02 10:38:13

Prometheus微服務架構(gòu)

2022-08-21 07:25:09

Flink云原生K8S

2022-03-01 18:27:18

云原生日志監(jiān)控

2022-11-08 00:00:00

監(jiān)控系統(tǒng)Prometheus

2020-04-29 14:43:32

VMware

2015-06-19 07:20:46

OpenStack醫(yī)療私有云

2022-12-23 16:52:22

Lakehouse數(shù)據(jù)湖

2023-02-28 22:52:47

2025-04-09 11:35:00

MySQL數(shù)據(jù)庫監(jiān)控
點贊
收藏

51CTO技術棧公眾號