3.3 诊断结果表

1. 背景

在 3.1 和 3.2 中介绍了 TiDB 4.0 引入的集群信息表和集群监控表,也通过 SQL 演示了如何通过查询这些表来发现集群问题,比如通过 information_schema.cluster_config 发现集群不同节点配置不一致,通过 information_schema.cluster_info 发现是否存在组件版本不一样。

手动执行固定模式的 SQL 排查集群问题是低效的,所以 TiDB 4.0 利用已有的基础信息表提供了诊断相关的系统表来自动执行诊断:

  • information_schema.inspection_result
  • information_schema.inspection_summary

诊断功能可以帮助用户快速发现问题,减少用户的重复性手动工作。诊断功能使用 SQL select * from information_schema.inspection_result 触发内部的诊断。

诊断模块内部包含一系列的规则,这些规则会通过查询已有的监控表和集群信息表,对结果和预先设定的阈值进行对比,如果结果超过阈值或低于阈值将生成 warning / critical 的结果,并在 details 列中提供进一步信息。

2. 诊断结果表

诊断结果表 information_schema.inspection_result 的表结构如下:

  1. mysql> desc inspection_result;
  2. +-----------+--------------+------+------+---------+-------+
  3. | Field | Type | Null | Key | Default | Extra |
  4. +-----------+--------------+------+------+---------+-------+
  5. | RULE | varchar(64) | YES | | NULL | |
  6. | ITEM | varchar(64) | YES | | NULL | |
  7. | TYPE | varchar(64) | YES | | NULL | |
  8. | INSTANCE | varchar(64) | YES | | NULL | |
  9. | VALUE | varchar(64) | YES | | NULL | |
  10. | REFERENCE | varchar(64) | YES | | NULL | |
  11. | SEVERITY | varchar(64) | YES | | NULL | |
  12. | DETAILS | varchar(256) | YES | | NULL | |
  13. +-----------+--------------+------+------+---------+-------+
  14. 8 rows in set (0.00 sec)

字段解释:

  • RULE:诊断规则,由于规则在持续添加,以下列表可能已经过时,最新的规则列表可以通过 select * from inspection_rules where type='inspection' 查询
    • config:配置一致性检测,如果同一个配置在不同节点配置值不同,会生成 warning 级别的诊断结果
    • version:版本一致性检测,如果同一类型的节点版本 githash 不同,会生成 critical 级别的诊断结果
    • current-load:如果当前系统负载太高,会生成对应的 warning 诊断结果
    • critical-error:系统各个模块定义了严重的错误,如果某一个严重错误在对应时间段内超过阈值,会生成 warning 诊断结果
    • threshold-check:诊断系统会对大量指标进行阈值判断,如果超过阈值会生成对应的诊断信息
  • ITEM:每一个规则会对不同的项进行诊断,这个用来表示对应规则下面的具体诊断项。
  • TYPE:诊断的实例类型,可能是 tidb/tikv/pd
  • INSTANCE:诊断的具体实例
  • VALUE:针对这个诊断项得到的值
  • REFERENCE:针对这个诊断项的参考值(阈值),如果 VALUE 和阈值差距比较大,就会产生对应的结果
  • SEVERITY:严重程度,warning/critical
  • DETAILS:诊断的详细信息,可能包含进一步调查的 SQL 或文档链接

查询已有的诊断规则:

  1. mysql> select * from inspection_rules where type='inspection';
  2. +-----------------+------------+---------+
  3. | NAME | TYPE | COMMENT |
  4. +-----------------+------------+---------+
  5. | config | inspection | |
  6. | version | inspection | |
  7. | current-load | inspection | |
  8. | critical-error | inspection | |
  9. | threshold-check | inspection | |
  10. +-----------------+------------+---------+
  11. 5 rows in set (0.00 sec)

3. 诊断汇总表

诊断结果需要基于确定性的阈值进行判断,比如当前 Coprocessor 配置的线程池为 8,如果 Coprocessor 的 CPU 使用率达到了 750%,可以确定这里有风险,或者可能提前成为瓶颈。但是部分监控会因为用户的 workload 不同而差异较大,所以难以定义确定的阈值。这部分场景问题排查也非常重要,所以新增了 information_schema.inspection_summary 对特定链路或模块的监控汇总,是用户可以根据整个模块或链路的上下文来排查定位问题。

诊断结果表 information_schema.inspection_summary 的表结构如下:

  1. mysql> desc inspection_summary;
  2. +--------------+-----------------------+------+------+---------+-------+
  3. | Field | Type | Null | Key | Default | Extra |
  4. +--------------+-----------------------+------+------+---------+-------+
  5. | RULE | varchar(64) | YES | | NULL | |
  6. | INSTANCE | varchar(64) | YES | | NULL | |
  7. | METRICS_NAME | varchar(64) | YES | | NULL | |
  8. | LABEL | varchar(64) | YES | | NULL | |
  9. | QUANTILE | double unsigned | YES | | NULL | |
  10. | AVG_VALUE | double(22,6) unsigned | YES | | NULL | |
  11. | MIN_VALUE | double(22,6) unsigned | YES | | NULL | |
  12. | MAX_VALUE | double(22,6) unsigned | YES | | NULL | |
  13. +--------------+-----------------------+------+------+---------+-------+
  14. 8 rows in set (0.00 sec)

字段解释:

  • RULE:汇总规则,由于规则在持续添加,以下列表可能已经过时,最新的规则列表可以通过 select * from inspection_rules where type='summary' 查询
  • INSTANCE:监控的具体实例
  • METRIC_NAME:监控表
  • QUANTILE:对于包含 QUANTILE 的监控表有效,可以通过谓词下推指定多个百分位,比如 select * from inspection_summary where rule='ddl' and quantile in (0.80, 0.90, 0.99, 0.999) 来汇总 ddl 相关监控,查询百分位为 80/90/99/999 的结果。 AVG_VALUE/MIN_VALUE/MAX_VALUE 分别表示聚合的平均、最小、最大值。

注意事项:

由于汇总所有结果有一定开销,所以 information_summary 中的规则是惰性触发的,即通过 SQL 的谓词中显示指定的 rule 才会运行。比如 select * from inspection_summary 语句会得到一个空的结果集。select * from inspection_summary where rule in ('read-link', 'ddl') 会汇总读链路和 DDL 相关的监控。

4. 诊断时间范围

诊断结果表和诊断监控汇总表都可以通过 hint 的方式指定诊断的时间范围,比如 select /*+ time_range('2020-03-07 12:00:00','2020-03-07 13:00:00') */ * from inspection_summary2020-03-07 12:00:00 - 2020-03-07 13:00:00 时间段的监控汇总。和监控汇总表一样,通过两个不同时间段的数据进行对比,快速发现差异较大的监控项。以下为一个例子:

  1. mysql> SELECT
  2. t1.avg_value / t2.avg_value AS ratio,
  3. t1.*,
  4. t2.*
  5. FROM
  6. (
  7. SELECT
  8. /*+ time_range("2020-01-16 16:00:54.933", "2020-01-16 16:10:54.933")*/ *
  9. FROM inspection_summary WHERE rule='read-link'
  10. ) t1
  11. JOIN
  12. (
  13. SELECT
  14. /*+ time_range("2020-01-16 16:10:54.933","2020-01-16 16:20:54.933")*/ *
  15. FROM inspection_summary WHERE rule='read-link'
  16. ) t2
  17. ON t1.metrics_name = t2.metrics_name
  18. and t1.instance = t2.instance
  19. and t1.label = t2.label
  20. ORDER BY
  21. ratio DESC;