MySQL性能诊断与调优之:`MySQL`的`Black Box Exporter`:其在`Prometheus`中的`MySQL`服务探活。

MySQL 服务探活与 Prometheus 监控:基于 Blackbox Exporter 的实战指南

大家好!今天我们来聊聊如何利用 Prometheus 和 Blackbox Exporter 来实现对 MySQL 服务的探活和监控。探活,简单来说,就是定期检查服务是否正常运行,并及时发出告警。这对于保证 MySQL 数据库的可用性至关重要。

为什么要用 Blackbox Exporter 做 MySQL 探活?

传统的 MySQL 监控通常依赖于直接连接数据库,执行查询来收集指标。这种方式存在一些问题:

  • 权限管理复杂: 需要为监控用户授予数据库访问权限,增加了安全风险。
  • 资源消耗: 频繁的数据库连接和查询会消耗 MySQL 的资源,影响性能。
  • 依赖性: 监控系统依赖于数据库的正常运行,如果数据库出现问题,监控系统可能无法正常工作。

而 Blackbox Exporter 提供了一种更优雅的解决方案。它是一个通用的探活工具,可以通过多种协议(HTTP、HTTPS、TCP、ICMP、DNS 等)检查目标服务的可用性,而无需直接访问数据库本身。对于 MySQL,我们可以利用 TCP 协议检查端口是否开放,或者通过自定义 HTTP 探针来执行更复杂的健康检查。

Blackbox Exporter 的工作原理

Blackbox Exporter 接收 Prometheus 的请求,根据配置的探测模块(probe module)执行相应的探测操作,并将探测结果以 Prometheus 指标的形式返回。 Prometheus 再从 Blackbox Exporter 抓取这些指标,并根据告警规则触发告警。

实战:基于 TCP 协议的 MySQL 探活

  1. 安装和配置 Blackbox Exporter

    首先,你需要下载 Blackbox Exporter 的二进制文件。你可以从 Prometheus 官网下载对应平台的版本:https://prometheus.io/download/

    下载完成后,解压文件,并找到 blackbox.yml 配置文件。这个文件定义了探测模块。

    我们创建一个简单的 TCP 探测模块,用于检查 MySQL 端口是否开放:

    modules:
     tcp_mysql:
       prober: tcp
       timeout: 5s
       tcp:
         query: "status" # 可以发送一些数据,这里不发
         tls: false
         tls_config:
           insecure_skip_verify: false
    • prober: tcp:指定使用 TCP 探测器。
    • timeout: 5s:设置探测超时时间为 5 秒。
    • tcp::定义 TCP 探测的具体配置。
      • query: 设置连接后发送的数据。如果为空字符串或者不设置,则不发送任何数据。
      • tls: false: 禁用TLS加密
      • tls_config: TLS配置。 insecure_skip_verify: false:不跳过证书校验

    保存 blackbox.yml 文件,并启动 Blackbox Exporter。假设你将 Blackbox Exporter 安装在 /opt/blackbox_exporter 目录下,可以使用以下命令启动:

    /opt/blackbox_exporter/blackbox_exporter --config.file=/opt/blackbox_exporter/blackbox.yml

    默认情况下,Blackbox Exporter 会监听 9115 端口。

  2. 配置 Prometheus 抓取 Blackbox Exporter 指标

    接下来,需要在 Prometheus 的配置文件 (prometheus.yml) 中添加一个 job,用于抓取 Blackbox Exporter 的指标。

    scrape_configs:
     - job_name: 'blackbox_mysql'
       metrics_path: /probe
       params:
         module: [tcp_mysql]  # 使用 tcp_mysql 模块
       static_configs:
         - targets:
           - mysql.example.com:3306  # 你的 MySQL 服务地址
       relabel_configs:
         - source_labels: [__address__]
           target_label: __param_target
         - source_labels: []
           regex: .*
           target_label: __address__
           replacement: 127.0.0.1:9115  # Blackbox Exporter 地址
    • job_name: job名称
    • metrics_path: 抓取指标的路径。Blackbox Exporter 默认是 /probe
    • params: 指定要使用的探测模块。这里我们使用之前定义的 tcp_mysql 模块。注意这里写的是数组的形式。
    • static_configs: 定义要探测的目标服务地址。这里我们假设 MySQL 服务运行在 mysql.example.com 的 3306 端口。
    • relabel_configs: 重写标签,以便 Blackbox Exporter 知道要探测的目标地址。
      • 第一个 relabel_configs__address__ (MySQL的服务地址)标签的值复制到 __param_target标签。 __param_target 是Blackbox Exporter期望的包含目标地址的标签。
      • 第二个 relabel_configs__address__ 标签替换为 Blackbox Exporter 的地址。

    保存 prometheus.yml 文件,并重新加载 Prometheus 配置。

  3. 验证监控结果

    在 Prometheus 的 Web 界面 (通常是 9090 端口) 中,你可以查询以下指标来验证监控是否正常工作:

    • probe_success:表示探测是否成功。1 表示成功,0 表示失败。
    • probe_duration_seconds:表示探测所花费的时间。

    你可以使用以下 PromQL 查询:

    probe_success{job="blackbox_mysql", module="tcp_mysql"}

    如果返回值为 1,则表示 MySQL 端口可以正常访问。如果返回值为 0,则表示 MySQL 端口无法访问,可能服务已经停止。

进阶:基于 HTTP 协议的 MySQL 探活

除了 TCP 协议,我们还可以使用 HTTP 协议进行更复杂的健康检查。这需要 MySQL 启用 HTTP 接口,并提供一个健康检查的 endpoint。

  1. MySQL HTTP 接口配置

    MySQL 本身并没有内置的 HTTP 接口。我们需要借助一些插件或工具来实现。例如,可以使用 mysql_http_plugin 或者使用一个简单的 HTTP 服务器来代理 MySQL 查询。

    这里我们假设你已经配置了一个 HTTP endpoint,可以通过 http://mysql.example.com:8080/health 访问,并且这个 endpoint 会返回 HTTP 200 OK 表示 MySQL 服务正常。

  2. Blackbox Exporter HTTP 探测模块配置

    blackbox.yml 文件中添加一个 HTTP 探测模块:

    modules:
     http_mysql:
       prober: http
       timeout: 5s
       http:
         valid_status_codes: [200]
         method: GET
         tls_config:
           insecure_skip_verify: false
    • prober: http:指定使用 HTTP 探测器。
    • http::定义 HTTP 探测的具体配置。
      • valid_status_codes: [200]:指定 HTTP 状态码为 200 OK 时表示成功。
      • method: GET: 使用GET方法。
  3. Prometheus 配置

    prometheus.yml 文件中添加一个 job:

    scrape_configs:
     - job_name: 'blackbox_mysql_http'
       metrics_path: /probe
       params:
         module: [http_mysql]
       static_configs:
         - targets:
           - http://mysql.example.com:8080/health  # 你的 MySQL 健康检查 endpoint
       relabel_configs:
         - source_labels: [__address__]
           target_label: __param_target
         - source_labels: []
           regex: .*
           target_label: __address__
           replacement: 127.0.0.1:9115  # Blackbox Exporter 地址

    与 TCP 探测类似,只是 targets 指向了 HTTP 健康检查 endpoint。

  4. 验证监控结果

    在 Prometheus 的 Web 界面中,查询以下指标:

    probe_success{job="blackbox_mysql_http", module="http_mysql"}

    如果返回值为 1,则表示 MySQL 健康检查 endpoint 返回 200 OK。

告警配置

有了监控数据,下一步就是配置告警。Prometheus 使用 Alertmanager 来管理告警。你需要定义告警规则,当满足某些条件时,Alertmanager 会发出告警。

一个简单的告警规则如下:

groups:
  - name: mysql_availability
    rules:
      - alert: MySQLDown
        expr: probe_success{job="blackbox_mysql"} == 0
        for: 1m
        labels:
          severity: critical
        annotations:
          summary: "MySQL service is down"
          description: "MySQL service on {{ $labels.instance }} is not reachable."
  • alert: MySQLDown:定义告警名称。
  • expr: probe_success{job="blackbox_mysql"} == 0:定义告警触发条件。当 probe_success 指标为 0 时触发告警。
  • for: 1m:告警持续时间。只有当告警条件持续 1 分钟后才会触发告警。
  • labels: severity: critical:定义告警级别。
  • annotations: summarydescription:定义告警摘要和描述。

将这个规则添加到 Alertmanager 的配置文件中,并配置 Alertmanager 的通知方式(例如邮件、Slack 等)。

Blackbox Exporter 的高级用法

  • DNS 探测: 可以使用 DNS 探测来检查 MySQL 域名解析是否正常。
  • ICMP 探测: 可以使用 ICMP 探测来检查 MySQL 主机是否可达。
  • 自定义 HTTP 请求: 可以自定义 HTTP 请求的 header、body 等,以满足更复杂的健康检查需求。
  • 多模块探测: 可以同时使用多个探测模块,例如同时使用 TCP 和 HTTP 探测。

表格:TCP 探活与HTTP探活对比

特性 TCP 探活 HTTP 探活
协议 TCP HTTP
复杂度 简单 相对复杂,需要配置 HTTP endpoint
适用场景 检查端口是否开放 检查服务是否正常运行,例如数据库连接、查询等
安全性 相对安全,不需要数据库访问权限 需要考虑 HTTP endpoint 的安全性,例如认证、授权等
配置 简单,只需要配置端口 需要配置 HTTP endpoint 和 Blackbox Exporter 的 HTTP 模块
探测深度 浅,只能探测端口是否开放 深,可以探测更复杂的健康状况
适用性 适用于快速检查服务是否存活 适用于更全面的健康检查

代码示例:自定义 HTTP 请求

以下是一个自定义 HTTP 请求的 Blackbox Exporter 配置示例,用于发送一个带有特定 header 和 body 的 POST 请求到 MySQL 的健康检查 endpoint:

modules:
  http_mysql_custom:
    prober: http
    timeout: 5s
    http:
      method: POST
      path: /health
      headers:
        Content-Type: application/json
      body: '{"status": "check"}'
      valid_status_codes: [200]
      tls_config:
        insecure_skip_verify: false

这个配置会发送一个 POST 请求到 /health 路径,并设置 Content-Type header 为 application/json,body 为 {"status": "check"}

总结:通过通用探活工具实现MySQL服务可用性监控

Blackbox Exporter提供了一种通用的、非侵入式的MySQL服务探活方案,它通过TCP或HTTP等协议对MySQL服务进行健康检查,并将结果暴露给Prometheus。 结合Prometheus的告警功能,我们可以及时发现并处理MySQL服务的故障,保障其高可用性。 通过灵活的配置,我们还可以实现更复杂的健康检查逻辑,满足不同的监控需求。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注