跳到主要内容

用夜莺监控 MySQL

连上实例跑 SHOW STATUS、SHOW VARIABLES 和复制状态,慢查询堆积、连接数打满、主从中断与延迟都有现成规则和处置步骤。

最后校对于

MySQL 插件的原理很直接:连到实例,执行 SHOW GLOBAL STATUS、SHOW GLOBAL VARIABLES、SHOW SLAVE STATUS 等语句,把结果整理成指标。默认采集基础状态和复制状态,InnoDB 扩展指标、processlist、库表大小这些按需打开。还可以写自定义 SQL,把查询结果当指标上报。

模板里的告警规则覆盖运维上最常见的几类事故:慢查询堆积、连接数接近 max_connections、线程大面积 running、主从 IO/SQL 线程中断、复制延迟、实例重启、打开文件数逼近上限,每条都附处置步骤。仪表盘分「本机采集」「按 address 筛选远端多实例」「按 instance 标签筛选」三种用法,另有一套按 mysqld_exporter 指标名写的。

给监控账号 PROCESS、REPLICATION CLIENT 和 SELECT 权限即可,不要用 root。

模板里有什么​

  • 7 张仪表盘,共 227 个面板
  • 20 条告警规则,每条附处置步骤
  • 31 条指标说明
  • Categraf 采集配置:input.mysql

怎么接入​

  1. 安装 Categraf,把下面的配置放到 conf/input.mysql/mysql.toml,按实际地址和凭据改好后重启 Categraf。启动日志里出现 input: local.mysql started 就说明插件已加载。

    # # collect interval
    # interval = 15

    # [[queries]]
    # measurement = "users"
    # metric_fields = [ "total" ]
    # label_fields = [ "service" ]
    # timeout = "3s"
    # request = '''
    # select 'n9e' as service, count(*) as total from n9e_v5.users
    # '''

    [[instances]]
    # address = "127.0.0.1:3306"
    # username = "root"
    # password = "1234"

    # # set tls=custom to enable tls
    # parameters = "tls=false"

    # extra_status_metrics = true
    # extra_innodb_metrics = false
    # gather_processlist_processes_by_state = false
    # gather_processlist_processes_by_user = false
    # gather_schema_size = true
    # gather_table_size = false
    # gather_system_table_size = false
    # gather_slave_status = true

    # # timeout
    # timeout_seconds = 3

    # # interval = global.interval * interval_times
    # interval_times = 1

    # important! use global unique string to specify instance
    # labels = { instance="n9e-10.2.3.4:3306" }

    ## Optional TLS Config
    # use_tls = false
    # tls_min_version = "1.2"
    # tls_ca = "/etc/categraf/ca.pem"
    # tls_cert = "/etc/categraf/cert.pem"
    # tls_key = "/etc/categraf/key.pem"
    ## Use TLS but skip chain & host verification
    # insecure_skip_verify = true

    #[[instances.queries]]
    # measurement = "lock_wait"
    # metric_fields = [ "total" ]
    # timeout = "3s"
    # request = '''
    #SELECT count(*) as total FROM information_schema.innodb_trx WHERE trx_state='LOCK WAIT'
    #'''

    # [[instances.queries]]
    # measurement = "users"
    # metric_fields = [ "total" ]
    # label_fields = [ "service" ]
    # # field_to_append = ""
    # timeout = "3s"
    # request = '''
    # select 'n9e' as service, count(*) as total from n9e_v5.users
    # '''
  2. 在夜莺「集成中心」里找到 MySQL,把仪表盘和告警规则导入到业务组。

  3. 导入的告警规则默认是停用的。先确认指标已经入库,再按自己环境的阈值逐条启用。

内置仪表盘​

仪表盘面板数
MySQL 仪表盘(使用 address 筛选,用于中心端 Categraf 采集远端多个 mysql 实例的场景)39
MySQL 仪表盘(使用 instance 筛选,需要采集时自行打上 instance 标签)39
MySQL 仪表盘,适用于 Categraf 采集本机 MySQL 的场景39
MySQL Overview by categraf24
MySQL Overview by categraf, group by ident38
MySQL Overview by categraf, group by instance24
MySQL Overview by exporter24

内置告警规则​

共 20 条,导入后默认停用,按自己环境的阈值逐条启用。每条规则的触发条件(PromQL)和处置步骤收录在告警规则库:MySQL 告警规则。

规则级别持续
MySQL slow queries are piling up - categrafS2 警告2 分钟
More than 60% of the connections in Mysql are in a running state - categrafS2 警告2 分钟
Mysql has just restarted. Please be advised - categrafS3 提醒—
Mysql has opened a large number of file handles. Please be aware - categrafS2 警告2 分钟
Mysql instance has crashed - categrafS1 紧急—
MysqlInnodbLogWaits - categrafS2 警告—
MysqlSlaveIoThreadNotRunning - categrafS1 紧急—
MysqlSlaveReplicationLag - categrafS1 紧急1 分钟
MysqlSlaveSqlThreadNotRunning - categrafS1 紧急—
The number of connections in Mysql has exceeded 80% - categrafS2 警告2 分钟
More than 60% of the connections in MySQL are in a running stateS2 警告2 分钟
More than 80% of MySQL files openS2 警告2 分钟
MySQL connection count has exceeded 80%S2 警告2 分钟
Mysql has just restarted. Please be advised - exporterS3 提醒—
MySQL slow queries are piling upS2 警告2 分钟
MysqlInnodbLogWaits - exporterS2 警告—
MysqlSlaveIoThreadNotRunning - exporterS1 紧急—
MysqlSlaveReplicationLag - exporterS1 紧急1 分钟
MysqlSlaveSqlThreadNotRunning - exporterS1 紧急—
The MySQL instance is downS1 紧急—

指标说明​

共 31 条,和仪表盘、告警规则里用到的指标一一对应。

指标含义单位
mysql_global_status_buffer_pool_bytes_dataGlobal Status InnoDB 缓冲池 data 大小bytes
mysql_global_status_buffer_pool_bytes_dirtyGlobal Status InnoDB 缓冲池 dirty 大小bytes
mysql_global_status_buffer_pool_bytes_freeGlobal Status InnoDB 缓冲池 free 大小bytes
mysql_global_status_buffer_pool_pages_utilizationGlobal Status InnoDB 缓冲池 page 使用率%
mysql_global_status_buffer_pool_bytes_usedGlobal Status InnoDB 缓冲池 used 大小bytes
mysql_global_status_buffer_pool_bytes_totalGlobal Status InnoDB 缓冲池总大小bytes
mysql_global_status_uptimeGlobal Status 启动时长s
mysql_global_status_threads_runningGlobal Status 当前 running 的 threads 数量
mysql_global_status_open_filesGlobal Status 当前打开的文件句柄数
mysql_global_status_threads_connectedGlobal Status 当前连接数
mysql_global_status_max_used_connectionsGlobal Status 最大曾用连接数 — 曾经达到过的最大连接数
irate(mysql_global_status_commands_total[3m])Global Status 每秒 Command 数量
irate(mysql_global_status_queries[3m])Global Status 每秒 query 数量
irate(mysql_global_status_questions[3m])Global Status 每秒 question 数量
irate(mysql_global_status_slow_queries[3m])Global Status 每秒 slow query 数量
sum(irate(mysql_global_status_commands_total{command=~"commit|rollback"}[3m])) without (command)Global Status 每秒事务操作数量
sum(irate(mysql_global_status_commands_total{command=~"insert|update|delete|replace"}[3m])) without (command)Global Status 每秒写操作数量
irate(mysql_global_status_bytes_sent[3m])Global Status 每秒发送流量bytes/s
irate(mysql_global_status_bytes_received[3m])Global Status 每秒接收流量bytes/s
sum(irate(mysql_global_status_commands_total{command="select"}[3m])) without (command)Global Status 每秒读操作数量
increase(mysql_global_status_aborted_clients[3m])Global Status 近 3 分钟 abort 的客户端 — 原始指标 mysql_global_status_aborted_clients 表示由于客户端未正确关闭连接而终止的连接数,Counter 类型,单调递增。
increase(mysql_global_status_aborted_connects[3m])Global Status 近 3 分钟 abort 的连接数 — 原始指标 mysql_global_status_aborted_connects 表示尝试连接到 MySQL 服务器失败的次数,Counter 类型,单调递增。
increase(mysql_global_status_table_locks_waited[3m])Global Status 近 3 分钟 table lock 等待次数
mysql_global_variables_innodb_buffer_pool_sizeGlobal Variables InnoDB 缓冲池配置大小bytes
mysql_global_variables_read_onlyGlobal Variables read_only 开关值 — 0 就是 OFF,1 是 ON
mysql_global_variables_open_files_limitGlobal Variables 允许打开的文件句柄数
mysql_global_variables_max_connectionsGlobal Variables 最大连接数限制 — 允许的最大连接数,默认值是 151,过小了。 通过 SHOW VARIABLES LIKE 'max_connections' 命令查看当前设置; 通过 SET GLOBAL max_connections = 2048 重新设置最大连接数; 通过修改 MySQL 配置文件,在 [mysqld] 下面添加 max_connections = 2048 使其重启依旧生效
mysql_global_variables_query_cache_sizeGlobal Variables 查询缓存大小bytes
mysql_upMySQL 实例是否 UP — 1 表示 UP,说明能正常连到 MySQL 采集数据;0 表示无法连通 MySQL 实例,可能是网络问题、认证问题,或者 MySQL 本身就是挂了
mysql_scrape_use_secondsMySQL 指标抓取耗时s
mysql_version_infoMySQL 版本信息

相关链接​