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 探活
-
安装和配置 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 端口。
-
配置 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 配置。 -
验证监控结果
在 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。
-
MySQL HTTP 接口配置
MySQL 本身并没有内置的 HTTP 接口。我们需要借助一些插件或工具来实现。例如,可以使用
mysql_http_plugin
或者使用一个简单的 HTTP 服务器来代理 MySQL 查询。这里我们假设你已经配置了一个 HTTP endpoint,可以通过
http://mysql.example.com:8080/health
访问,并且这个 endpoint 会返回 HTTP 200 OK 表示 MySQL 服务正常。 -
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方法。
-
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。 -
验证监控结果
在 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: summary
和description
:定义告警摘要和描述。
将这个规则添加到 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服务的故障,保障其高可用性。 通过灵活的配置,我们还可以实现更复杂的健康检查逻辑,满足不同的监控需求。