Telegraf数据库监控:MySQL、PostgreSQL、MongoDB
【免费下载链接】telegraf 插件驱动的服务器代理,用于收集和报告指标。 项目地址: https://gitcode.com/GitHub_Trending/te/telegraf
概述
在现代应用架构中,数据库是核心组件,其性能和稳定性直接影响整个系统的可用性。Telegraf作为InfluxData开源的指标收集代理,提供了强大的数据库监控能力,支持MySQL、PostgreSQL、MongoDB等主流数据库的深度监控。
本文将详细介绍如何使用Telegraf监控这三种数据库,包括配置方法、关键指标解读和最佳实践。
数据库监控架构
MySQL监控配置
基础配置
[[inputs.mysql]]
servers = ["user:password@tcp(127.0.0.1:3306)/?tls=false"]
metric_version = 2
# 性能模式监控
gather_innodb_metrics = true
gather_table_io_waits = true
gather_index_io_waits = true
# 复制状态监控
gather_slave_status = true
gather_all_slave_channels = true
关键监控指标
| 指标类别 | 关键指标 | 说明 |
|---|---|---|
| 连接状态 | connections_current | 当前连接数 |
| 查询性能 | queries_per_sec | 每秒查询量 |
| InnoDB状态 | innodb_buffer_pool_hit_ratio | 缓冲池命中率 |
| 复制状态 | slave_io_running | 复制IO线程状态 |
| 锁等待 | table_lock_waits | 表锁等待次数 |
性能模式深度监控
[[inputs.mysql]]
servers = ["user:password@tcp(127.0.0.1:3306)/"]
# 性能模式详细配置
gather_perf_events_statements = true
perf_events_statements_limit = 1000
perf_events_statements_digest_text_limit = 120
gather_table_io_waits = true
gather_index_io_waits = true
gather_event_waits = true
PostgreSQL监控配置
基础配置
[[inputs.postgresql]]
address = "host=localhost user=postgres sslmode=disable"
# 数据库过滤
ignored_databases = ["template0", "template1"]
# 连接配置
max_lifetime = "1h"
prepared_statements = true
权限配置
-- 授予监控权限
GRANT pg_read_all_stats TO telegraf_user;
关键监控指标表
| 指标类别 | 指标名称 | 描述 |
|---|---|---|
| 连接统计 | numbackends | 当前连接数 |
| 事务统计 | xact_commit | 提交事务数 |
| 缓存命中 | blks_hit | 缓存命中块数 |
| 死锁统计 | deadlocks | 死锁发生次数 |
| 临时文件 | temp_bytes | 临时文件使用量 |
高级配置示例
[[inputs.postgresql]]
address = "host=dbserver user=telegraf dbname=monitoring sslmode=require"
outputaddress = "production-db"
# TLS配置
tls_ca = "/etc/telegraf/ca.pem"
tls_cert = "/etc/telegraf/cert.pem"
tls_key = "/etc/telegraf/key.pem"
# 查询超时
statement_timeout = 10000
MongoDB监控配置
基础配置
[[inputs.mongodb]]
servers = ["mongodb://user:password@127.0.0.1:27017/?connect=direct"]
# 集群状态监控
gather_cluster_status = true
# 数据库级别统计
gather_perdb_stats = true
# 集合级别统计
gather_col_stats = true
col_stats_dbs = ["admin", "config", "local"]
权限要求
// MongoDB权限配置
use admin
db.createUser({
user: "telegraf",
pwd: "password",
roles: ["clusterMonitor"]
})
关键监控指标
实例级别指标
| 指标 | 类型 | 说明 |
|---|---|---|
connections_current | 计数器 | 当前连接数 |
opcounters_insert | 计数器 | 插入操作计数 |
mem_resident | 仪表盘 | 常驻内存大小 |
network_bytesIn | 计数器 | 网络输入流量 |
asserts_regular | 计数器 | 常规断言次数 |
复制集指标
[[inputs.mongodb]]
servers = ["mongodb://user:password@replica-set:27017/?connect=direct"]
gather_cluster_status = true
disconnected_servers_behavior = "skip"
高级监控配置
[[inputs.mongodb]]
servers = ["mongodb://user:password@shard1:27017,shard2:27017/?replicaSet=myRepl"]
# 分片集群监控
gather_cluster_status = true
# Top命令统计
gather_top_stat = true
# 连接行为配置
disconnected_servers_behavior = "skip"
# TLS配置
tls_ca = "/etc/telegraf/ca.pem"
tls_cert = "/etc/telegraf/cert.pem"
tls_key = "/etc/telegraf/key.pem"
统一监控配置最佳实践
多数据库统一监控
# MySQL监控
[[inputs.mysql]]
servers = ["monitor:password@tcp(mysql-prod:3306)/"]
metric_version = 2
name_prefix = "mysql_"
# PostgreSQL监控
[[inputs.postgresql]]
address = "host=postgres-prod user=telegraf sslmode=require"
name_prefix = "postgres_"
# MongoDB监控
[[inputs.mongodb]]
servers = ["mongodb://telegraf:password@mongodb-prod:27017/?authSource=admin"]
name_prefix = "mongodb_"
指标处理与增强
# 添加统一标签
[[inputs.mysql]]
servers = ["tcp(127.0.0.1:3306)/"]
[inputs.mysql.tags]
environment = "production"
region = "us-east-1"
# 指标过滤
[[inputs.processors.starlark]]
namepass = ["mysql*"]
source = '''
def apply(metric):
if metric.fields.get('connections_current', 0) > 1000:
metric.fields['connection_alert'] = 1
return metric
'''
告警规则配置
# MySQL连接数告警
[[processors.starlark]]
namepass = ["mysql"]
source = '''
def apply(metric):
if metric.fields.get('connections_current', 0) > metric.fields.get('max_connections', 0) * 0.8:
metric.fields['connection_warning'] = 1
return metric
'''
# PostgreSQL死锁告警
[[processors.starlark]]
namepass = ["postgres*"]
source = '''
def apply(metric):
if metric.fields.get('deadlocks', 0) > 0:
metric.fields['deadlock_alert'] = 1
return metric
'''
监控仪表板配置
关键性能指标展示
-- MySQL性能概览查询
SELECT
mean("queries_per_sec") AS "QPS",
mean("connections_current") AS "当前连接数",
mean("innodb_buffer_pool_hit_ratio") AS "缓冲池命中率"
FROM "mysql"
WHERE time > now() - 1h
GROUP BY time(1m)
-- PostgreSQL性能概览查询
SELECT
mean("xact_commit") AS "事务提交数",
mean("blks_hit") / (mean("blks_hit") + mean("blks_read")) AS "缓存命中率",
mean("deadlocks") AS "死锁数"
FROM "postgresql"
WHERE time > now() - 1h
GROUP BY time(1m)
-- MongoDB性能概览查询
SELECT
mean("opcounters_insert") AS "插入操作",
mean("opcounters_query") AS "查询操作",
mean("mem_resident") AS "内存使用"
FROM "mongodb"
WHERE time > now() - 1h
GROUP BY time(1m)
健康状态检查
# 健康检查配置
[[inputs.exec]]
commands = ["/usr/local/bin/check_database_health.sh"]
timeout = "10s"
data_format = "influx"
name_override = "database_health"
[[processors.regex]]
namepass = ["database_health"]
[[processors.regex.tags]]
key = "message"
pattern = '.*(OK|WARNING|CRITICAL).*'
replacement = "${1}"
故障排查与优化
常见问题排查
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| MySQL连接数飙升 | 连接泄漏或慢查询 | 检查processlist,优化查询 |
| PostgreSQL缓存命中率低 | 内存配置不足 | 调整shared_buffers配置 |
| MongoDB复制延迟 | 网络问题或负载过高 | 检查网络状况,优化索引 |
性能优化建议
-
MySQL优化
- 启用性能模式(
performance_schema=ON) - 监控慢查询日志
- 优化InnoDB缓冲池大小
- 启用性能模式(
-
PostgreSQL优化
- 调整
shared_buffers和work_mem - 定期执行
VACUUM ANALYZE - 监控长事务和锁等待
- 调整
-
MongoDB优化
- 监控复制集状态
- 优化索引设计
- 控制连接池大小
总结
Telegraf提供了强大而灵活的数据库监控能力,通过统一的配置框架可以同时监控MySQL、PostgreSQL、MongoDB等多种数据库。关键优势包括:
- 统一监控:单一工具监控多种数据库类型
- 深度指标:提供从连接数到性能模式的全面指标
- 灵活配置:支持过滤、标签、数据处理等高级功能
- 生态集成:与InfluxDB、Grafana等工具无缝集成
通过合理的配置和持续的监控,可以及时发现数据库性能问题,确保应用系统的稳定性和可靠性。
下一步行动建议:
- 根据实际环境配置数据库连接参数
- 设置适当的监控频率和数据保留策略
- 配置告警规则和通知机制
- 建立性能基线并持续优化
【免费下载链接】telegraf 插件驱动的服务器代理,用于收集和报告指标。 项目地址: https://gitcode.com/GitHub_Trending/te/telegraf
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



