ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Apache SkyWalking 监控 MySQL/MariaDB 完全指南:基于 mysqld_exporter 的指标采集与 fluentbit 慢 SQL 分析

Apache SkyWalking 监控 MySQL/MariaDB 完全指南:基于 mysqld_exporter 的指标采集与 fluentbit 慢 SQL 分析 Apache SkyWalking 监控 MySQL/MariaDB 完全指南基于 mysqld_exporter 的指标采集与 fluentbit 慢 SQL 分析【免费下载链接】skywalkingAPM, Application Performance Monitoring System项目地址: https://gitcode.com/gh_mirrors/sk/skywalkingApache SkyWalking 提供了针对 MySQL/MariaDB 数据库的两条监控通道一条基于prometheus/mysqld_exporter采集服务器性能指标经由 OpenTelemetry Collector 转送 OAP Server 的 Meter 系统另一条基于 fluentbit 等日志 Agent 采集慢 SQL 语句通过 LAL 规则解析入库。本文以 backend-mysql-monitoring.md 为核心骨架结合仓库内的 MAL 规则、LAL 规则与 e2e 测试配置完整讲解数据流、部署步骤、指标语义与自定义扩展方式。架构总览两条独立的数据链路SkyWalking 对 MySQL/MariaDB 的监控由两条互不依赖的链路组成分别解决服务器状态监控与慢 SQL 采样分析两个问题。链路一服务器性能指标Metricsmysqld_exporter从 MySQL/MariaDB 实例采集指标数据OpenTelemetry Collector 通过其Prometheus Receiver抓取 mysqld_exporter 暴露的指标再由OTLP gRPC exporter推送给 SkyWalking OAP ServerOAP Server 使用 MALMeter Analysis Language解析表达式完成过滤、计算、聚合后将结果写入存储。链路二采样慢 SQLLogsfluentbit或其他日志 Agent从 MySQL/MariaDB 采集慢查询日志fluentbit 通过 HTTP 调用 SkyWalking 原生 Meter API/v3/logs将数据发送至 OAP ServerOAP Server 使用 LALLog Analysis Language解析/提取字段并存储结果。两条链路最终在 OAP 中的建模一致MySQL/MariaDB 集群被归类为Layer: MYSQL的Service每一台 MySQL/MariaDB 服务器被归类为Instance。服务器指标监控mysqld_exporter OpenTelemetry Collector部署步骤第 1 步部署 mysqld_exporter使用 Docker 运行 prometheus/mysqld_exporter并通过MYSQLD_EXPORTER_PASSWORD等环境变量传入数据库凭据。exporter 默认暴露在9104端口输出 Prometheus 格式的指标。第 2 步部署并配置 OpenTelemetry CollectorCollector 的职责是抓取 → 批处理 → 转送。仓库 e2e 测试中给出了可直接参考的完整配置otel-collector-config.yamlreceivers: prometheus: config: scrape_configs: - job_name: mysql-monitoring scrape_interval: 5s static_configs: - targets: [mysql-service:9104, mysql-service_2:9104, mysql-service_3:9104] labels: host_name: root[root] processors: batch: exporters: otlp: endpoint: oap:11800 tls: insecure: true service: pipelines: metrics: receivers: - prometheus processors: - batch exporters: - otlp该配置的要点job_name: mysql-monitoring必须保留——它正是后续 MAL 规则filter的匹配依据详见下文规则如何匹配labels.host_name用于区分不同实例MAL 规则会将其加工成 SkyWalking 的 service/instance 名称scrape_interval: 5s控制采集频率可按需调整exporters.otlp.endpoint指向 OAP 的 gRPC 端口默认11800使用非 TLS 连接。第 3 步配置 SkyWalking OpenTelemetry ReceiverOAP 启动时加载$CLASSPATH/otel-rules下的规则文件。需要激活 OTLP handler 并开启 MySQL 规则参考 opentelemetry-receiver.mdreceiver-otel: selector: ${SW_OTEL_RECEIVER:default} default: enabledHandlers: ${SW_OTEL_RECEIVER_ENABLED_HANDLERS:otlp-metrics} enabledOtelMetricsRules: ${SW_OTEL_RECEIVER_ENABLED_OTEL_METRICS_RULES:mysql}也可以通过环境变量SW_OTEL_RECEIVERdefault激活接收器。规则文件位于$CLASSPATH/otel-rulesMySQL 相关规则为otel-rules/mysql/mysql-instance.yaml与otel-rules/mysql/mysql-service.yaml。注意receiver-otel因其 push 模式仅支持 MAL scheme 中的group、defaultMetricLevel与metricsRules节点。规则如何匹配MAL 表达式与指标命名MySQL 的 MAL 规则文件位于 otel-rules/mysql/mysql-service.yaml 和 otel-rules/mysql/mysql-instance.yaml。两个文件都以filter与expSuffix开头filter: { tags - tags.job_name mysql-monitoring } # The OpenTelemetry job name expSuffix: tag({tags - tags.host_name mysql:: tags.host_name}).service([host_name] , Layer.MYSQL) metricPrefix: meter_mysqlfilter只接收job_name为mysql-monitoring的数据。Collector 的 Prometheus Receiver 会自动把 Prometheus 的job标签转换为service.nameOAP 接收器再将其回退映射为job_name标签详见 opentelemetry-receiver 文档中的 fallback label mappingsexpSuffixservice 级把标签host_name加工成mysql::host_name形式的服务名归类到Layer.MYSQLinstance 级规则额外追加.instance([host_name], [service_instance_id], Layer.MYSQL)将每台服务器建模为 InstancemetricPrefix所有派生指标统一加meter_mysql前缀因此最终指标名形如meter_mysql_uptime、meter_mysql_qps。以 QPS 为例其 MAL 表达式为- name: qps exp: mysql_global_status_queries.rate(PT1M).sum([service_instance_id,host_name])含义是取 mysqld_exporter 暴露的mysql_global_status_queries计数指标按 1 分钟窗口求速率rate(PT1M)再按实例维度求和最终产出meter_mysql_qps。TPS 的表达式则通过tagMatch(command,rollback|commit)过滤出提交与回滚两类命令后求速率- name: tps exp: mysql_global_status_commands_total.tagMatch(command,rollback|commit).sum([host_name, service_instance_id]).rate(PT1M)支持的指标清单下表为 OAP 默认提供的 MySQL/MariaDB 监控指标指标名均带meter_mysql前缀数据源均为 mysqld_exporter监控面板单位指标名说明数据源MySQL Uptimedaymeter_mysql_uptimeMySQL 启动时长mysqld_exporterMax Connectionsmeter_mysql_max_connections最大连接数mysqld_exporterInnodb Buffer Pool SizeMBmeter_mysql_innodb_buffer_pool_sizeInnoDB 引擎缓冲池大小mysqld_exporterThread Cache Sizemeter_mysql_thread_cache_size线程缓存大小mysqld_exporterCurrent QPSmeter_mysql_qps每秒查询数Queries Per Secondmysqld_exporterCurrent TPSmeter_mysql_tps每秒事务数Transactions Per Secondmysqld_exporterCommands Ratemeter_mysql_commands_insert_ratemeter_mysql_commands_select_ratemeter_mysql_commands_delete_ratemeter_mysql_commands_update_rate当前服务器执行的 insert/select/delete/update 速率mysqld_exporterThreadsmeter_mysql_threads_connectedmeter_mysql_threads_createdmeter_mysql_threads_cachedmeter_mysql_threads_running当前打开的连接数threads_connected已创建的线程数threads_created线程缓存中的线程数threads_cached非休眠状态的线程数threads_runningmysqld_exporterConnectsmeter_mysql_max_connectionsmeter_mysql_status_thread_connectedmeter_mysql_connects_aborted可用连接数connects_availableMySQL 实例连接拒绝数connects_abortedmysqld_exporterConnection Errorsmeter_mysql_connection_errors_internalmeter_mysql_connection_errors_max_connections因超过 max_connections 导致的错误connection_errors_max_connections内部系统错误connection_errors_internalmysqld_exporterSlow Queries Ratemeter_mysql_slow_queries_rate慢查询速率mysqld_exporter从源码规则可以进一步看到部分指标的底层推导逻辑位于 mysql-instance.yamlconnects_available可用连接数并非直接采集而是由最大连接数减去当前已连接数计算得出- name: instance_connects_available exp: mysql_global_variables_max_connections.sum([host_name,service_instance_id]) - mysql_global_status_threads_connected.sum([host_name,service_instance_id])innodb_buffer_pool_size / max_connections / thread_cache_size来自mysql_global_variables_*服务器配置变量其余状态类指标来自mysql_global_status_*连接错误通过tagEqual(error,max_connection)/tagEqual(error,internal)从mysql_global_status_connection_errors_total中按错误类型过滤。慢 SQL 采样监控fluentbit LAL部署步骤第 1 步启用 MySQL/MariaDB 慢查询日志MySQL 与 MariaDB 的参考配置见 e2e 用例中的 my.cnfMySQL与 mariadb my.cnfMariaDB[mysqld] init_connectSET NAMES utf8 slow_query_logON event_schedulerON long_query_time1 slow_query_log_file/var/lib/mysql/slow.log [client] default-character-setutf8 [mysql] default-character-setutf8关键项slow_query_logON开启慢查询日志long_query_time1定义超过 1 秒即视为慢查询可按需调整阈值slow_query_log_file指定慢日志文件路径。第 2 步部署并配置 fluentbitfluentbit 负责 tail 慢日志文件、按多行规则合并日志块、过滤噪音行、改写为 SkyWalking 期望的 JSON 结构并上报。完整参考配置见 fluent-bit.confMySQL与 mariadb fluent-bit.confMariaDB[SERVICE] flush 1 log_level info parsers_File fluent-bit-parser.conf [INPUT] name tail path /tmp/skywalking-logs/slow.log read_from_head true multiline.parser my-log-format [FILTER] name grep match * exclude log mysqld, Version:.* [FILTER] name grep match * exclude log Tcp port: 0.* [FILTER] name grep match * exclude log Time .* [FILTER] name lua match * script fluent-bit-script.lua call rewrite_body [OUTPUT] name stdout match * format json [OUTPUT] name http match * host oap port 12800 uri /v3/logs format json配置要点INPUTtail插件监听慢日志文件路径multiline.parser my-log-format启用多行解析用于把一条慢查询的多个日志行合并为一条完整记录FILTER grep过滤掉 MySQL 启动 bannermysqld, Version:、端口提示Tcp port:等与慢查询无关的行FILTER lua调用 fluent-bit-script.lua 中的rewrite_body函数将日志重组为 SkyWalking 要求的日志 JSON 格式OUTPUT http以 JSON 格式 POST 到 OAP 的12800端口/v3/logs接口SkyWalking 原生日志上报 API。第 3 步配置 OAP 的 LAL 规则OAP 端默认已内置慢 SQL 的 LAL 规则文件 lal/mysql-slowsql.yamlrules: - name: mysql-slowsql layer: MYSQL outputType: SlowSQL dsl: | filter { json{ } extractor{ layer parsed.layer as String service parsed.service as String timestamp parsed.time as String if (tag(LOG_KIND) SLOW_SQL) { id parsed.id as String statement parsed.statement as String latency parsed.query_time as Long } } sink { } }该规则将 fluentbit 上报的 JSON 日志解析为layer、service、timestamp并在存在LOG_KIND SLOW_SQL标签时提取id、statementSQL 语句文本与latency耗时毫秒字段输出类型为SlowSQL即写入 OAP 的 TopN 数据库语句存储。Lua 脚本如何构造上报载荷fluent-bit-script.lua 展示了慢日志到 SkyWalking JSON 的完整转换逻辑。MySQL 慢日志的典型片段为# Time: 2022-12-06T15:11:00.449826Z # UserHost: root[root] [127.0.0.1] Id: 29 # Query_time: 11.000312 Lock_time: 0.000000 Rows_sent: 1 Rows_examined: 0 SET timestamp1670339460; SELECT SLEEP(11);脚本的核心处理为记录附加标签LOG_KIND SLOW_SQL与 LAL 规则中的if (tag(LOG_KIND) SLOW_SQL)条件对应设置layer MYSQL从日志第二行解析出用户并拼装服务名service mysql:: .. root[root]注释说明也可以从该行提取任意部分作为服务名从第三行用正则%s(%S)%sLock提取Query_time并转换为毫秒作为query_time将后续行拼接为完整的statementSQL 语句转义双引号后放入 JSON body。配套的多行解析器见 fluent-bit-parser.conf它定义了从# Time:到 SQL 语句正文的状态机式规则确保一条慢查询的多个行被合并为一条记录[MULTILINE_PARSER] name my-log-format type regex flush_timeout 1000 rule start_state ^(# Time: .*) second_state rule second_state ^(# UserHost.*) third_state rule third_state ^(# Query_time: .*) statement rule statement ^\w.* statement支持的慢 SQL 指标监控面板单位指标名说明数据源Slow Statementsmstop_n_database_statementMySQL/MariaDB 慢 SQL 的耗时与语句内容fluentbit该指标由 OAP 的 TopN 机制存储可通过查询协议按服务维度检索慢语句的延迟与原文。自定义扩展指标、表达式与面板SkyWalking 允许针对 MySQL/MariaDB 监控做三层自定义自定义指标/表达式MAL 规则文件位于$CLASSPATH/otel-rules/mysql仓库内对应 otel-rules/mysql 目录。可新增metricsRules条目从 mysqld_exporter 暴露的任何mysql_*指标推导新面板例如按command标签细分更多命令类型、或组合多个状态变量计算连接利用率等。修改后需重启 OAP 加载格式错误将导致 OAP 启动失败自定义慢 SQL 表达式LAL 规则文件位于$CLASSPATH/lal/mysql-slowsql.yaml仓库内对应 lal/mysql-slowsql.yaml。可调整字段提取逻辑、增加过滤条件或改变输出结构自定义面板MySQL/MariaDB 的面板配置随 SkyWalking Horizon UI 前端包apache/skywalking-horizon-ui分发OAP 后端不再托管 UI 仪表盘 JSON。验证与测试仓库提供了完整的 e2e 验证链路可用于核对本文描述的配置是否正确MySQLmysql-cases.yaml 定义整体用例prometheus-mysql-exporter/otel-collector-config.yaml 为指标链路配置mysql-slowsql/ 目录包含慢 SQL 链路的 docker-compose、fluentbit 配置与mock.sql模拟慢查询MariaDBmariadb-cases.yaml 与 mariadb-slowsql/ 提供对应用例断言模板expected/metrics-has-value.yml 校验时序指标是否有值expected/db-has-value.yml 与 expected/service.yml 校验服务与实例是否成功建模。此外OAP 的 MAL 规则单元测试数据位于 meter-analyzer-scripts-test 的 mysql 用例LAL 规则的测试用例位于 log-analyzer 的 mysql-slowsql 用例可作为理解规则输出结构的辅助材料。小结SkyWalking 的 MySQL/MariaDB 监控方案可以概括为两个 exporter 类型 两条 OAP 分析通道性能指标mysqld_exporterPrometheus 格式→ OpenTelemetry CollectorPrometheus Receiver OTLP exporter→ OAPreceiver-otel→ MAL 规则otel-rules/mysql→meter_mysql_*指标覆盖 uptime、QPS/TPS、连接数、线程、连接错误与慢查询速率慢 SQLMySQL/MariaDB 慢日志 → fluentbit多行解析 Lua 改写→ OAP/v3/logs→ LAL 规则lal/mysql-slowsql.yaml→top_n_database_statement慢语句 TopN。部署时只需注意三处关键匹配关系Collector 的job_name必须与 MAL 规则filter一致、fluentbit 打上的LOG_KINDSLOW_SQL标签必须与 LAL 规则的判定条件一致、上报地址必须指向 OAP 的11800gRPC与12800HTTP端口。遵循上述配置即可在 SkyWalking UI 中看到完整的 MySQL/MariaDB 服务、实例与慢 SQL 视图。【免费下载链接】skywalkingAPM, Application Performance Monitoring System项目地址: https://gitcode.com/gh_mirrors/sk/skywalking创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表