{
    "componentChunkName": "component---src-templates-blog-blog-detail-tsx",
    "path": "/blog/use-grafana-to-monitor-and-analyze-tidb-metrics",
    "result": {"pageContext":{"blog":{"id":"Blogs_132","title":"如何高效利用 Grafana 监控分析 TiDB 指标","tags":["Prometheus","Grafana","监控"],"category":{"name":"产品技术解读"},"summary":"使用 TiDB Ansible 部署 TiDB 集群，会同时部署一套 Grafana + Prometheus 的监控平台，这套监控用来收集和展示 TiDB 集群各个组件和机器的 metric 信息，这些 metric 信息非常丰富，可以帮助使用者分析 TiDB 集群的状态以及 Trouble shooting。","body":">**作者介绍**：李坤，PingCAP 互联网架构师，TUG Ambassador，前美团、去哪儿数据库专家。\n\n## 一、概述\n\n使用 TiDB Ansible 部署 TiDB 集群，会同时部署一套 Grafana + Prometheus 的监控平台，这套监控用来收集和展示 TiDB 集群各个组件和机器的 metric 信息，这些 metric 信息非常丰富，可以帮助使用者分析 TiDB 集群的状态以及 Trouble shooting。随着使用经验的增多，我们积累了一些监控使用上的技巧，在这里分享给大家。\n\n## 二、监控架构\n\nPrometheus 是一个拥有多维度数据模型的、灵活的查询语句的时序数据库。Grafana 是一个开源的 metric 分析及可视化系统。\n\n![图 1 TiDB 监控整体架构](https://img1.www.pingcap.com/prod/1_b266975f9f.png)\n\n<div class=\"caption-center\">图 1 TiDB 监控整体架构</div>\n\n从 TiDB 2.1.3 版本开始，监控采用 pull 的方式，而之前采用的是 push 的方式，这是一个非常好的调整，它解决了几个问题：\n\n* 之前如果 Prometheus 需要迁移，需要重启整个集群，因为组件要调整 push 的目标地址。\n\n* 现在可以部署 2 套 Prometheus，防止监控的单点，因为 pull 的 source 端是可以多个。\n\n* 去掉了 `PushGateWay` 这个单点组件。\n\n## 三、监控数据的来源与展示\n\nTiDB 的 3 个核心组件（TiDB，TiKV，PD）可以通过 http 接口来获取 metric 数据，这些指标都是从程序代码中统计上传的，端口如下：\n\n| 组件 | 端口 |\n|:-----|:-----|\n| tidb-server | 10080 |\n| tikv-server | 20181 |\n| pd-server | 2379 |\n\n用 tidb-server 举例，我们通过 http 接口，看一个 statement QPS 的 metric：\n\n```\n# 可以看到实时 qps 的数据，区分不同的 type，value 是 counter 类型的累计值（科学计数法）\n\ncurl http://__tidb_ip__:10080/metrics |grep tidb_executor_statement_total\ntidb_executor_statement_total{type=\"Delete\"} 520197\ntidb_executor_statement_total{type=\"Explain\"} 1\ntidb_executor_statement_total{type=\"Insert\"} 7.20799402e+08\ntidb_executor_statement_total{type=\"Select\"} 2.64983586e+08\ntidb_executor_statement_total{type=\"Set\"} 2.399075e+06\ntidb_executor_statement_total{type=\"Show\"} 500531\ntidb_executor_statement_total{type=\"Use\"} 466016\n```\n\n这个数据会在 Prometheus 存储下来，然后在 Grafana 展示，我们在面板上点击右键会出现 `Edit` 按钮（或直接按 e），如下图所示：\n\n![图 2 metric 面板的编辑入口](https://img1.www.pingcap.com/prod/2_81fb1f5e21.png)\n\n<div class=\"caption-center\">图 2 metric 面板的编辑入口</div>\n\n我们可以在 `Metric` 面板上，看到利用该 metric 的 query 表达式。\n\n面板上一些细节的含义：\n\n1. `rate[1m]`：表示 1 分钟的增长速率，只能用于 counter 类型的数据。\n\n2. `sum`：表示 value 求和。\n\n3. `by type`：表示将求和后的数据按 metric 的原始值中的 type 进行分组。\n\n4. `Legend format`：表示指标名称的格式。\n\n5. `Resolution`：默认打点步长是 15s，`Resolution` 表示是否分解。\n\n![图 3 metric 面板中的表达式](https://img1.www.pingcap.com/prod/3_79c27ec459.png)\n\n<div class=\"caption-center\">图 3 metric 面板中的表达式</div>\n\nPrometheus 支持很多表达式与函数，更多表达式请参考 [官网页面](https://prometheus.io/docs/prometheus/latest/querying)。\n\n## 四、Grafana 使用技巧\n\n### 技巧 1：查看所有维度并编辑表达式\n\n如上一小节的例子，是按照 type 进行分组，是否还能用其他维度分组？如何能快速得知还有哪些维度呢？这里推荐的技巧是，在 query 的表达式上只用指标名称，不做任何计算，format 也留空，这样就能显示出原始的 metric 数据，比如下图能看到有 3 个维度（`instance`、`job`、`type`）。\n\n![图 4 编辑表达式并查看所有维度](https://img1.www.pingcap.com/prod/4_bafd336e52.png)\n\n<div class=\"caption-center\">图 4 编辑表达式并查看所有维度</div>\n\n得到 `instance` 这个维度后，我们调整表达式，在原有的 type 后面加上 `instance` 这个维度，调整 `legend format` 格式增加 `{{instance}}`，就可以看到每个 tidb-server 上执行的不同类型 SQL 的 QPS 了。如下图：\n\n![图 5 给表达式增加一个 instance 维度](https://img1.www.pingcap.com/prod/5_3141a8f291.png)\n\n<div class=\"caption-center\">图 5 给表达式增加一个 instance 维度</div>\n\n### 技巧 2：调整 Y 轴标尺的计算方式\n\n以 `query duration` 指标为例，默认的比例尺采用 2 的对数计算，显示上会将差距缩小。为了观察明显的变化，可以将比例尺改为线性，通过下面两张图，可以看到显示上的区别，明显的发现那个时刻有个 SQL 运行较慢。\n\n当然也不是所有场景都适合用线性，比如观察 1 个月的性能趋势，用线性可能就会有很多噪点，不好观察。\n\n![图 6 标尺默认的比例尺为 2 的对数](https://img1.www.pingcap.com/prod/6_d3f722f1fb.png)\n\n<div class=\"caption-center\">图 6 标尺默认的比例尺为 2 的对数</div>\n\n![图 7 调整标尺的比例尺为线性](https://img1.www.pingcap.com/prod/7_d9914731fd.png)\n\n<div class=\"caption-center\">图 7 调整标尺的比例尺为线性</div>\n\n>提示：我们可以结合技巧 1，发现这里还有一个 `sql_type` 的维度，可以立刻分析出是 select 慢还是 update 慢，并且可以分析出是在哪个 instance 上慢。\n\n### 技巧 3：调整 Y 轴基线，放大变化\n\n有一种情况：已经用了线性显示，还是看不出变化趋势。比如下图中，我们在扩容后想观察 `Store size` 的实时变化效果，由于基数较大，微弱的变化观察不到。 这时我们可以将 Y 轴最小值从 `0` 改为 `auto`，将上部放大，观察下面两张图的区别，可以观察到数据已开始迁移了。\n\n![图 8 基线默认为 0](https://img1.www.pingcap.com/prod/8_7bee565f49.png)\n\n<div class=\"caption-center\">图 8 基线默认为 0</div>\n\n![图 9 调整基线为 auto](https://img1.www.pingcap.com/prod/9_fd0c1d6c35.png)\n\n<div class=\"caption-center\">图 9 调整基线为 auto</div>\n\n### 技巧 4：标尺联动\n\n在 Setting 面板中，有 `Graph Tooltip` 的设置，默认使用 `Default`。\n\n![图 10 图形展示工具](https://img1.www.pingcap.com/prod/10_390ecd4aad.png)\n\n<div class=\"caption-center\">图 10 图形展示工具</div>\n\n我们调整为 `Shared crosshair` 和 `Shared Tooltip` 分别试一下效果： 可以看到标尺可以联动展示了，方便排查问题时，确认 2 个指标的关联性。\n\n![图 11 调整图形展示工具为 Shared crosshair](https://img1.www.pingcap.com/prod/11_fd761935e2.png)\n\n<div class=\"caption-center\">图 11 调整图形展示工具为 Shared crosshair</div>\n\n![图 12 调整图形展示工具为 Shared Tooltip](https://img1.www.pingcap.com/prod/12_db11490203.png)\n\n<div class=\"caption-center\">图 12 调整图形展示工具为 Shared Tooltip</div>\n\n### 技巧 5：调整过滤项\n\nPD 的 Dashboard，只展示当前 leader 的 metric 信息，有时候会想看一下历史上 pd-leader 当时的状况，但是 instance 下拉列表中不存在这个成员了，我们也可以手动输入 `ip:2379` 来看到当时的数据。\n\n![图 13 手动输入并查看 metric](https://img1.www.pingcap.com/prod/13_223a390e0b.png)\n\n<div class=\"caption-center\">图 13 手动输入并查看 metric</div>\n\n### 技巧 6：巧用 `Avg` 函数\n\n通常默认图例中只有 `Max` 和 `Current`，但有时指标波动较大时，我们可以增加 `Avg` 等其他汇总函数的图例，可以看一段时间的整体趋势。\n\n\n![图 14 增加 Avg 等汇总函数](https://img1.www.pingcap.com/prod/14_d1a2b7b342.png)\n\n<div class=\"caption-center\">图 14 增加 Avg 等汇总函数</div>\n\n![图 15 增加 Avg 函数](https://img1.www.pingcap.com/prod/15_ca3583e945.png)\n\n<div class=\"caption-center\">图 15 增加 Avg 函数</div>\n\n\n### 技巧 7：使用 Prometheus 的 API 接口获得表达式的结果\n\nGrafana 通过 Prometheus 的接口获取数据，我们也可以用该接口获取数据，这个用法可以扩散出很多功能：\n\n* 自动化平台获取集群规模、状态等信息。\n\n* 对表达式稍加改动给报表提供数据，如统计每天的 QPS 总量、每天的 QPS 峰值、每天响应时间的汇总。\n\n* 将重要的指标进行定期健康巡检。\n\n![图 16 Prometheus 的 API 接口](https://img1.www.pingcap.com/prod/16_82d3495fb1.png)\n\n<div class=\"caption-center\">图 16 Prometheus 的 API 接口</div>\n\n```\ncurl -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\n{\n    \"data\": {\n        \"result\": [\n            {\n                \"metric\": {\n                    \"instance\": \"xxxxxxxxxx:20181\"\n                },\n                \"values\": [\n                    [\n                        1565879269,\n                        \"1006046235280\"\n                    ],\n                    [\n                        1565879299,\n                        \"1006057877794\"\n                    ],\n                    [\n                        1565879329,\n                        \"1006021550039\"\n                    ],\n                    [\n                        1565879359,\n                        \"1006021550039\"\n                    ],\n                    [\n                        1565882869,\n                        \"1006132630123\"\n                    ]\n                ]\n            }\n        ],\n        \"resultType\": \"matrix\"\n    },\n    \"status\": \"success\"\n}\n```\n\n## 五、总结\n\nGrafana + Prometheus 是一套非常强大的组合，用好他们可以为我们的分析节省很多时间，提高效率，更重要的是能增加发现问题的可能性。在运维 TiDB 集群时，尤其数据量大的时候，这套工具能派上大用场。这里抛砖引玉，也希望大家也能提供一些技巧，一起共同学习。","date":"2019-09-09","author":"李坤","fillInMethod":"writeDirectly","customUrl":"use-grafana-to-monitor-and-analyze-tidb-metrics","file":null,"relatedBlogs":[]}}},
    "staticQueryHashes": ["1327623483","1820662718","3081853212","3430003955","3649515864","4265596160","63159454"]}