做者介绍:李坤,PingCAP 互联网架构师,TUG Ambassador,前美团、去哪儿数据库专家。
使用 TiDB Ansible 部署 TiDB 集群,会同时部署一套 Grafana + Prometheus 的监控平台,这套监控用来收集和展现 TiDB 集群各个组件和机器的 metric 信息,这些 metric 信息很是丰富,能够帮助使用者分析 TiDB 集群的状态以及 Trouble shooting。随着使用经验的增多,咱们积累了一些监控使用上的技巧,在这里分享给你们。python
Prometheus 是一个拥有多维度数据模型的、灵活的查询语句的时序数据库。Grafana 是一个开源的 metric 分析及可视化系统。sql
<center>图 1 TiDB 监控总体架构</center>数据库
从 TiDB 2.1.3 版本开始,监控采用 pull 的方式,而以前采用的是 push 的方式,这是一个很是好的调整,它解决了几个问题:json
PushGateWay
这个单点组件。TiDB 的 3 个核心组件(TiDB,TiKV,PD)能够经过 http 接口来获取 metric 数据,这些指标都是从程序代码中统计上传的,端口以下:api
组件 | 端口 |
---|---|
tidb-server | 10080 |
tikv-server | 20181 |
pd-server | 2379 |
用 tidb-server 举例,咱们经过 http 接口,看一个 statement QPS 的 metric:架构
# 能够看到实时 qps 的数据,区分不一样的 type,value 是 counter 类型的累计值(科学计数法) curl http://__tidb_ip__:10080/metrics |grep tidb_executor_statement_total tidb_executor_statement_total{type="Delete"} 520197 tidb_executor_statement_total{type="Explain"} 1 tidb_executor_statement_total{type="Insert"} 7.20799402e+08 tidb_executor_statement_total{type="Select"} 2.64983586e+08 tidb_executor_statement_total{type="Set"} 2.399075e+06 tidb_executor_statement_total{type="Show"} 500531 tidb_executor_statement_total{type="Use"} 466016
这个数据会在 Prometheus 存储下来,而后在 Grafana 展现,咱们在面板上点击右键会出现 Edit
按钮(或直接按 e),以下图所示:运维
<center>图 2 metric 面板的编辑入口</center>ssh
咱们能够在 Metric
面板上,看到利用该 metric 的 query 表达式。curl
面板上一些细节的含义:函数
rate[1m]
:表示 1 分钟的增加速率,只能用于 counter 类型的数据。sum
:表示 value 求和。by type
:表示将求和后的数据按 metric 的原始值中的 type 进行分组。Legend format
:表示指标名称的格式。Resolution
:默认打点步长是 15s,Resolution
表示是否分解。<center>图 3 metric 面板中的表达式</center>
Prometheus 支持不少表达式与函数,更多表达式请参考 官网页面。
如上一小节的例子,是按照 type 进行分组,是否还能用其余维度分组?如何能快速得知还有哪些维度呢?这里推荐的技巧是,在 query 的表达式上只用指标名称,不作任何计算,format 也留空,这样就能显示出原始的 metric 数据,好比下图能看到有 3 个维度(instance
、job
、type
)。
<center>图 4 编辑表达式并查看全部维度</center>
获得 instance
这个维度后,咱们调整表达式,在原有的 type 后面加上 instance
这个维度,调整 legend format
格式增长 {{instance}}
,就能够看到每一个 tidb-server 上执行的不一样类型 SQL 的 QPS 了。以下图:
<center>图 5 给表达式增长一个 instance 维度</center>
以 query duration
指标为例,默认的比例尺采用 2 的对数计算,显示上会将差距缩小。为了观察明显的变化,能够将比例尺改成线性,经过下面两张图,能够看到显示上的区别,明显的发现那个时刻有个 SQL 运行较慢。
固然也不是全部场景都适合用线性,好比观察 1 个月的性能趋势,用线性可能就会有不少噪点,很差观察。
<center>图 6 标尺默认的比例尺为 2 的对数</center>
<center>图 7 调整标尺的比例尺为线性</center>
提示:咱们能够结合技巧 1,发现这里还有一个
sql_type
的维度,能够马上分析出是 select 慢仍是 update 慢,而且能够分析出是在哪一个 instance 上慢。
有一种状况:已经用了线性显示,仍是看不出变化趋势。好比下图中,咱们在扩容后想观察 Store size
的实时变化效果,因为基数较大,微弱的变化观察不到。 这时咱们能够将 Y 轴最小值从 0
改成 auto
,将上部放大,观察下面两张图的区别,能够观察到数据已开始迁移了。
<center>图 8 基线默认为 0</center>
<center>图 9 调整基线为 auto</center>
在 Setting 面板中,有 Graph Tooltip
的设置,默认使用 Default
。
<center>图 10 图形展现工具</center>
咱们调整为 Shared crosshair
和 Shared Tooltip
分别试一下效果: 能够看到标尺能够联动展现了,方便排查问题时,确认 2 个指标的关联性。
<center>图 11 调整图形展现工具为 Shared crosshair</center>
<center>图 12 调整图形展现工具为 Shared Tooltip</center>
PD 的 Dashboard,只展现当前 leader 的 metric 信息,有时候会想看一下历史上 pd-leader 当时的情况,可是 instance 下拉列表中不存在这个成员了,咱们也能够手动输入 ip:2379
来看到当时的数据。
<center>图 13 手动输入并查看 metric</center>
Avg
函数一般默认图例中只有 Max
和 Current
,但有时指标波动较大时,咱们能够增长 Avg
等其余汇总函数的图例,能够看一段时间的总体趋势。
<center>图 14 增长 Avg 等汇总函数</center>
<center>图 15 增长 Avg 函数</center>
Grafana 经过 Prometheus 的接口获取数据,咱们也能够用该接口获取数据,这个用法能够扩散出不少功能:
<center>图 16 Prometheus 的 API 接口</center>
curl -u user:pass 'http://__grafana_ip__:3000/api/datasources/proxy/1/api/v1/query_range?query=sum(tikv_engine_size_bytes%7Binstancexxxxxxxxx20181%22%7D)%20by%20(instance)&start=1565879269&end=1565882869&step=30' |python -m json.tool { "data": { "result": [ { "metric": { "instance": "xxxxxxxxxx:20181" }, "values": [ [ 1565879269, "1006046235280" ], [ 1565879299, "1006057877794" ], [ 1565879329, "1006021550039" ], [ 1565879359, "1006021550039" ], [ 1565882869, "1006132630123" ] ] } ], "resultType": "matrix" }, "status": "success" }
Grafana + Prometheus 是一套很是强大的组合,用好他们能够为咱们的分析节省不少时间,提升效率,更重要的是能增长发现问题的可能性。在运维 TiDB 集群时,尤为数据量大的时候,这套工具能派上大用场。这里抛砖引玉,也但愿你们也能提供一些技巧,一块儿共同窗习。
阅读原文:https://pingcap.com/blog-cn/use-grafana-to-monitor-and-analyze-tidb-metrics/