https://zhuanlan.zhihu.com/p/647831844
在日常业务使用或运维管理 TiDB 的过程中,每个开发人员或数据库管理员都或多或少遇到过 SQL 变慢的问题。这类问题大部分情况下都具有一定的规律可循,通过经验的积累可以快速的定位和优化。但是有些情况下不一定很好排查,尤其涉及到内核调优等方向时,如果事先没有对各个组件的互访关系、引擎存储原理等有一定的了解,往往难以下手。
本文针对写 TiDB 集群的场景,总结业务 SQL 在写突然变慢时的分析和排查思路,旨在沉淀经验、共享与社区。
业务对集群的数据写入流程会被 TiDB Server 封装为一个个的写事务,写事务的完成主要涉及的组件是 TiDB Server 和 TiKV Server。如下所示,是 TiDB 集群写入流程的架构简图:
事务在写入的过程,分别会与 TiDB Server、TiPD Server 和 TiKV Server进行交互:
TiDB Server
TiKV Server
TiKV 的 Scheduler Worker Pool 模块负责接收通过 gRPC 传过来的写请求数据,在这里它能实现写入流量的控制、锁冲突检查与获取(latch)、快照(snapshot)版本对比的功能
前面的校验通过后,写入的数据会进入到 Raftstore Pool 模块,它会将写入数据的请求封装为 raft log (Propose ),在本地持久化(append)的同时并发分发到 follower 节点,接着完成 raft log 的 commit 操作,最后将 raft log 日志数据写入到 rocksdb raft
Apply Pool 模块充当消费者的的角色,会消费 rocksdb raft 里面的日志数据,转为真正的 KV 数据存储到 rocksdb KV,至此完成了一次写入数据的流程
图中 Raftstore Pool 和 Apply Pool 这两步通常统称为 Async Write 操作,这个是 TiKV 写入数据的关键流程,也是数据写入分析的重点环节所在。
通常业务的 SQL 变慢后,我们在 TiDB Server 的 Grafana 面板可以看到整体的或者某一百分位的请求延迟会升高,我们可以依次排查物理硬件环境、是否有业务变更操作、数据库运行的情况等,定位到问题后再针对性解决。
如上图是一个写入慢的常规排查思路,在实际工作中对于各项内容的排查可以同时进行,交叉分析,互相配合定位问题所在。
遇到问题,先到 Dashboard 看看,对整个集群运行状况有个整体的把握
物理硬件排查
业务变更
对于常规分析无法确认的或者复杂业务的问题,通常排查起来比较棘手,这时候可以分析数据从写入 TiDB Server 到 TiKV Server 、再落盘至 RocksDB 的整个过程,对全部写入链路逐一进行排查,从而确认写入慢所在的节点,定位到原因后再进行优化即可,这一过程大致如下图所示。
毫无疑问,这个是一个兜底的排查思路,适用范围较广,通用性较强,但是排查起来要花费更多的时间和精力,也要求管理员对数据库本身的运行原理有一定的掌握。
对于写入慢的全链路分析,我们首先在问题时段从整体上把握延迟情况,再分析 TiDB Server 和 TiKV Server 在对应时段的延迟,确认问题处于计算层还是存储层,接着再深入分析
上面的写入过程的延迟情况,可以从集群的 Grafana 监控面板观察得到,其中 TiKV 是重点所在,其每个阶段写入的流程以及对应在 Grafana 上的延迟监控面板如下。
gRPC duration 或 Scheduler command duration 表示整个写入过程在 TiKV 侧的耗时情况
TiKV Details 下 Scheduler - commit 的 Scheduler latch wait duration表示由于等到锁 latch wait 造成的时间开销,正常情况下应该小于 1s
通过对比分析不同阶段的延迟在整体中的占比,通常可以定位到比较慢的环节,然后再针对性优化即可。
对于开发人员或 DBA,会解决具体的问题是一项很重要的能力,但定位问题根因所在的能力更难能可贵!
这里想表达的意思,和大家耳熟能详的故事异曲同工:
“老师傅,故障已排除,但就凭这一条线也要 10000$ ?!”
“画这条线要 1$,但知道在哪里画要 9999$”!