手把手教你使用 Prometheus 監控 MySQL 與 MariaDB.md

騰訊雲原生發表於2020-11-02

概述

MySQL 是常用的關係型資料庫,MariaDB 作為 MySQL 的分支版本,相容 MySQL 協議,也越來越流行。在 Kubernetes 環境中如何使用 Prometheus 來對它們進行監控呢?通常是藉助開源的 mysqld-exporter 來實現,本文將圍繞這個主題展開詳細介紹下。

mysqld-exporter 原理介紹

mysqld-exporter 通過讀取 MySQL 或 MariaDB 中的一些資料庫狀態的資料,並將其轉換為 Prometheus 的指標格式並暴露成 http 介面被 Prometheus 所採集,來實現讓原本不支援 Prometheus 指標的 MySQL 和 MariaDB 能夠被 Prometheus 監控起來:

img

操作步驟

部署 mysqld-exporter

在部署 mysqld-exporter 之前首先保證 MySQL 或 MariaDB 已經部署,可以在叢集內,也可以在叢集外,或者使用現成的雲服務。如果還沒有,這裡以從應用市場部署到叢集為例來部署一個 MySQL:

  1. 在應用市場中找到 MySQL,點選 建立應用-建立

img

  1. 檢視 mysql 是否正常執行:
$ kubectl get pods
NAME                     READY   STATUS        RESTARTS   AGE
mysql-698b898bf7-4dc5k   1/1     Running       0          11s
  1. 獲取 root 密碼:
$ kubectl get secret -o jsonpath={.data.mysql-root-password} mysql
6ZAj33yLBo

有了 MySQL 後,我們開始準備部署 mysqld-exporter,首先為 mysqld-exporter 建立一個賬號,登入 MySQL:

$ kubectl exec -it mysql-698b898bf7-4dc5k bash
$ mysql -uroot -p6ZAj33yLBo

然後輸入 SQL 來建立賬號,這裡以 mysqld-exporter/123456 為例:

CREATE USER 'mysqld-exporter' IDENTIFIED BY '123456' WITH MAX_USER_CONNECTIONS 3;
GRANT PROCESS, REPLICATION CLIENT, REPLICATION SLAVE, SELECT ON *.* TO 'mysqld-exporter';
flush privileges;

然後使用以下 yaml 來部署 mysqld-exporter:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysqld-exporter
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mysqld-exporter
  template:
    metadata:
      labels:
        app: mysqld-exporter
    spec:
      containers:
      - name: mysqld-exporter
        image: prom/mysqld-exporter:v0.12.1
        args:
        - --collect.info_schema.tables
        - --collect.info_schema.innodb_tablespaces
        - --collect.info_schema.innodb_metrics
        - --collect.global_status
        - --collect.global_variables
        - --collect.slave_status
        - --collect.info_schema.processlist
        - --collect.perf_schema.tablelocks
        - --collect.perf_schema.eventsstatements
        - --collect.perf_schema.eventsstatementssum
        - --collect.perf_schema.eventswaits
        - --collect.auto_increment.columns
        - --collect.binlog_size
        - --collect.perf_schema.tableiowaits
        - --collect.perf_schema.indexiowaits
        - --collect.info_schema.userstats
        - --collect.info_schema.clientstats
        - --collect.info_schema.tablestats
        - --collect.info_schema.schemastats
        - --collect.perf_schema.file_events
        - --collect.perf_schema.file_instances
        - --collect.perf_schema.replication_group_member_stats
        - --collect.perf_schema.replication_applier_status_by_worker
        - --collect.slave_hosts
        - --collect.info_schema.innodb_cmp
        - --collect.info_schema.innodb_cmpmem
        - --collect.info_schema.query_response_time
        - --collect.engine_tokudb_status
        - --collect.engine_innodb_status
        ports:
        - containerPort: 9104
          protocol: TCP
        env:
        - name: DATA_SOURCE_NAME
          value: "mysqld-exporter:123456@(mysql.default.svc.cluster.local:3306)/"
---
apiVersion: v1
kind: Service
metadata:
  name: mysqld-exporter
  labels:
    app: mysqld-exporter
spec:
  type: ClusterIP
  ports:
  - port: 9104
    protocol: TCP
    name: http
  selector:
    app: mysqld-exporter

! 注意根據實際情況替換 DATA_SOURCE_NAME 中的賬號密碼,以及 MySQL 的連線地址

新增監控採集配置

有了 mysqld-exporter 後,我們就可以配置監控的採集,讓 mysqld-exporter 暴露的資料被採集起來,如果你的叢集中安裝了 prometheus-operator,可以通過定義 ServiceMonitor 來配置採集規則,示例:

apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: mysqld-exporter
spec:
  endpoints:
    interval: 5s
    targetPort: 9104
  namespaceSelector:
    matchNames:
    - default
  selector:
    matchLabels:
      app: mysqld-exporter

你可以通過修改 Prometheus 原生的配置檔案來配置採集規則,示例:

    - job_name: mysqld-exporter
      scrape_interval: 5s
      kubernetes_sd_configs:
      - role: endpoints
        namespaces:
          names:
          - default
      relabel_configs:
      - action: keep
        source_labels:
        - __meta_kubernetes_service_label_app_kubernetes_io_name
        regex: mysqld-exporter
      - action: keep
        source_labels:
        - __meta_kubernetes_endpoint_port_name
        regex: http

新增監控皮膚

採集配置好,正常採集有了資料之後,還需要為 Grafana 新增監控皮膚進行展示,如果只是看 MySQL 或 MariaDB 的一些概覽情況,可以匯入 grafana.com 的這個皮膚: https://grafana.com/grafana/dashboards/7362

img

如果需要更豐富的皮膚,可以匯入 percona 開源的一些皮膚,地址: https://github.com/percona/grafana-dashboards/tree/master/dashboards (匯入 MySQL_ 開頭的 json 檔案中的內容即可)。

小結

本文介紹瞭如何利用開源的 mysqld-exporter 將原本不支援 Prometheus 的 MySQL 或 MariaDB 接入進來,讓 Prometheus 也能採集資料庫的監控指標,並新增 Grafana 監控皮膚,讓檢視監控更加方便。

【騰訊雲原生】雲說新品、雲研新術、雲遊新活、雲賞資訊,掃碼關注同名公眾號,及時獲取更多幹貨!!

相關文章