【SOP】最佳实践之 TiDB 业务写变慢分析

作者: 李文杰_Jellybean 原文来源: https://tidb.net/blog/d3d4465f

前言

在日常业务使用或运维管理 TiDB 的过程中,每个开发人员或数据库管理员都或多或少遇到过 SQL 变慢的问题。这类问题大部分情况下都具有一定的规律可循,通过经验的积累可以快速的定位和优化。但是有些情况下不一定很好排查,尤其涉及到内核调优等方向时,如果事先没有对各个组件的互访关系、引擎存储原理等有一定的了解,往往难以下手。

本文针对写 TiDB 集群的场景,总结业务 SQL 在写突然变慢时的分析和排查思路,旨在沉淀经验、共享与社区。

写入原理

业务对集群的数据写入流程会被 TiDB Server 封装为一个个的写事务,写事务的完成主要涉及的组件是 TiDB Server 和 TiKV Server。如下所示,是 TiDB 集群写入流程的架构简图:

image.png

事务在写入的过程,分别会与 TiDB Server、TiPD Server 和 TiKV Server进行交互:

  • TiDB Server

    • 用户提交的业务 SQL 经过 Protocol Layer 进行 SQL 协议转换后,内部 PD Client 向 TiPD Server 申请到一个 TSO,此 TSO 即为事务的开始时间 txn_start_tso,同时也是事务在全局的唯一 ID

    • 接着 TiDB Server 对 SQL 文本进行解析处理,转为抽象语法树 AST 传给下一个处理模块

    • TiDB Server 对 AST 进行编译、SQL 等价改写等逻辑优化、参考系统统计信息进行物理优化后,会生成真正可以执行的计划

    • 可执行的计划经过分析判断,点查询操作转到KV模块、复杂查询转到 DistSQL 模块(继续转为对单个表访问的多个请求),再经过 TiKV Client 模块与 TiKV 进行交互,在 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,至此完成了一次写入数据的流程

      • rocksdb 里面的数据写入包括了 LSM Tree 的写入过程,主要方面有 WAL、MemTable 、Immutable Table、L0~L6 层的内存或磁盘 IO 操作,这里并没有详细阐述,有兴趣的可以前往官网查阅。
    • 图中 Raftstore Pool 和 Apply Pool 这两步通常统称为 Async Write 操作,这个是 TiKV 写入数据的关键流程,也是数据写入分析的重点环节所在。

      • Raftstore Pool 和 Apply Pool 处理数据的过程涉及到线程池的调度和处理等,主要消耗 CPU 资源

      • rocksdb raft 和 rocksdb kv 由于涉及到数据落盘,主要消耗磁盘 IO 资源

      • 数据在不同 TiKV 节点之间进行复制、同步等,主要消耗网络带宽 IO 资源

写变慢排查思路

常规排查

通常业务的 SQL 变慢后,我们在 TiDB Server 的 Grafana 面板可以看到整体的或者某一百分位的请求延迟会升高,我们可以依次排查物理硬件环境、是否有业务变更操作、数据库运行的情况等,定位到问题后再针对性解决。

image.png

如上图是一个写入慢的常规排查思路,在实际工作中对于各项内容的排查可以同时进行,交叉分析,互相配合定位问题所在。

  • 遇到问题,先到 Dashboard 看看,对整个集群运行状况有个整体的把握

    • 查看集群热力图,关注集群高亮的区域,分析是否有写热点出现,如果有则确认对应的库表、Region 等信息

    • 排查慢 SQL 情况,查看集群慢查询结果,分析 SQL 慢查询原因

    • 查看 TOP SQL 面板,分析集群的 CPU 消耗与 SQL 关联的情况

  • 物理硬件排查

    • 排查客户端与集群之间、集群内部 TiDB 、TiPD、TiKV 各组件之间的网络问题

    • 排查集群的内存、CPU、磁盘 IO 等情况,尤其是混合部署的集群,确认是否存在资源相互竞争、挤兑的场景出现

    • 排查操作系统的内核操作是否与官方建议的最佳实践值是否一致,确认 TiDB 集群运行在最优的系统环境内

  • 业务变更

    • 确认是否是新上线业务

    • 查看集群的 DDL Jobs,确认是否由于在线 DDL 导致的问题,特别是大表加索引的场景,会消耗集群较多的资源,从而干扰集群正常的访问请求

全链路排查

对于常规分析无法确认的或者复杂业务的问题,通常排查起来比较棘手,这时候可以分析数据从写入 TiDB Server 到 TiKV Server 、再落盘至 RocksDB 的整个过程,对全部写入链路逐一进行排查,从而确认写入慢所在的节点,定位到原因后再进行优化即可,这一过程大致如下图所示。

毫无疑问,这个是一个兜底的排查思路,适用范围较广,通用性较强,但是排查起来要花费更多的时间和精力,也要求管理员对数据库本身的运行原理有一定的掌握。

image.png

  • 对于写入慢的全链路分析,我们首先在问题时段从整体上把握延迟情况,再分析 TiDB Server 和 TiKV Server 在对应时段的延迟,确认问题处于计算层还是存储层,接着再深入分析

    • 对于 TiDB Server层,主要观察 SQL 的解析优化过程耗时,以及和 TiPD 进行交互过程的延迟情况

    • 对于 TiKV Server 层,重点关注 Scheduler Worker Pool 、Raft log 同步复制与写入、Apply 这几个过程

上面的写入过程的延迟情况,可以从集群的 Grafana 监控面板观察得到,其中 TiKV 是重点所在,其每个阶段写入的流程以及对应在 Grafana 上的延迟监控面板如下。

image.png

  • gRPC duration 或 Scheduler command duration 表示整个写入过程在 TiKV 侧的耗时情况

    • gRPC duration 是请求在 TiKV 端的总耗时。通过对比 TiKV 的 gRPC duration 以及 TiDB 中的 KV duration 可以发现潜在的网络问题。比如 gRPC duration 很短但是 TiDB 的 KV duration 显示很长,说明 TiDB 和 TiKV 之间网络延迟可能很高,或者 TiDB 和 TiKV 之间的网卡带宽被占满

    • TiKV Details 下 Scheduler - commit 的 Scheduler command duration 表示执行 commit 命令所需花费的时间,正常情况下,应该小于 1s

  • TiKV Details 下 Scheduler - commit 的 Scheduler latch wait duration表示由于等到锁 latch wait 造成的时间开销,正常情况下应该小于 1s

<!---->

  • TiKV Details 下 Storage 的 Storage async snapshot duration 表示异步处理 snapshot 所花费的时间,99% 的情况下应该小于 1s
  • TiKV Details 下 Storage 的 Storage async write duration 表示异步写所花费的时间,99% 的情况下应该小于 1s
  • TiKV Details 下 Raft propose 的 Propose wait duration 表示将写入数据请求转为 raft log 的等待时间
  • TiKV Details 下 Raft IO 的 Append log duration 表示 Raft append 日志所花费的时间
  • TiKV Details 下 Raft IO 的 Commit log duration 表示 Raft commit 日志所花费的时间
  • TiKV Details 下 Raft propose 的 Apply wait duration 表示 apply 的等待时间
  • TiKV Details 下 Raft IO 的 Apply log duration 表示 Raft apply 日志所花费的时间

通过对比分析不同阶段的延迟在整体中的占比,通常可以定位到比较慢的环节,然后再针对性优化即可。

总结

  • 常规写入慢的问题,我们可以依次排查物理硬件环境、是否有业务新上线,是否有 DDL 变更操作、执行计划不准、热点问题等情况,通常可以定位到问题,再针对性解决

  • 对于复杂问题则需要对写入过程逐一分析和对比,通常需要反复观察、对比、验证才能找到根本的原因

对于开发人员或 DBA,会解决具体的问题是一项很重要的能力,但定位问题根因所在的能力更难能可贵!

这里想表达的意思,和大家耳熟能详的故事异曲同工:

“老师傅,故障已排除,但就凭这一条线也要 10000$ ?!”

“画这条线要 1$,但知道在哪里画要 9999$”!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/56619.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python Opencv实践 - 基本图像IO操作

import numpy as np import cv2 as cv import matplotlib.pyplot as plt#读取图像 #cv2.IMREAD_COLOR&#xff1a; 读取彩色图像&#xff0c;忽略alpha通道&#xff0c;也可以直接写1 #cv2.IMREAD_GRAYSCALE: 读取灰度图&#xff0c;也可以直接写0 #cv2.IMREAD_UNCHANGED: 读取…

2023中国数字人力峰会|用「消失的Ta」解读数字化人效管理

7月28日&#xff0c;DHR公会主办的「2023中国数字人力峰会」在北京顺利举办。盖雅工场联合创始人兼CEO章新波带来主题为「消失的它」的精彩分享。以下为分享内容&#xff1a; 近期&#xff0c;大家都在讨论消失的Ta&#xff0c;我也想借此话题举几个例子&#xff0c;聊聊对于企…

(论文复现)DeepAnt模型复现及应用

DeepAnt论文如下&#xff0c;其主要是用于时间序列的无监督粗差探测。 其提出的模型架构如下&#xff1a; 该文提出了一个无监督的时间序列粗差探测模型&#xff0c;其主要有预测模块和探测模块组成&#xff0c;其中预测模块的网络结构如下。 预测结构是将时间序列数据组…

SQL Server数据库 -- 索引与视图

文章目录 一、索引 聚集索引非聚集索引二、视图三、自定义函数 标量函数表值函数四、游标五、总结 前言 在学习完创建库表、查询等知识点后&#xff0c;为了更加方便优化数据库的存储和内容&#xff0c;我们需要学习一系列的方法例如索引与视图等等&#xff0c;从而使我们更加…

IDEA中Git面板操作介绍 变基、合并、提取、拉取、签出

IDEA中Git面板操作介绍 变基、合并、提取、拉取、签出 面板介绍 变基、合并 提取、拉取 签出、Checkout 面板介绍 如图&#xff0c;在IDEA的Git面板中&#xff0c;仓库会分为本地仓库和远程仓库&#xff0c;代码仓库里面放的是各个分支。 分支前面的书签&#x1f516;标志…

Linux常用命令学习总结

Linux命令分类 1. Linux目录操作命令2. Linux文件名称3. Linux磁盘命令4. Linux进程与防火墙5. Linux用户与组的关系6. Linux权限操作(chmod命令)7. Linux中的文件类型文件的寻找 最近系统地学习下Linux命令的使用&#xff0c;因此作如下记录&#xff0c;以便随时复习和翻阅。 …

微信小程序(van-tabs) 去除横向滚动条样式(附加源码解决方案+报错图)

问题描述 今天第一次接触vant组件库。 ant官网地址适用于Vue3 支持Vue2、Vue3、微信小程序等 我在使用van-tabs组件时遇到了一个问题&#xff0c;如下图所示&#xff1a; 从图片上可以看到有个灰色的横向滚动条&#xff0c;一开始领导给我说这个问题&#xff0c;我反反复复都…

宝塔面板点击SSL闪退打不开怎么解决?

宝塔Linux面板点击SSL证书闪退如何解决&#xff1f;旧版本的宝塔Linux面板确实存在这种情况&#xff0c;如何解决&#xff1f;升级你的宝塔Linux面板即可。新手站长分享宝塔面板SSL闪退的解决方法&#xff1a; 宝塔面板点击SSL证书闪退解决方法 问题&#xff1a;宝塔Linux面板…

关于策略模式的注入问题

上面抄别人的 当在实现策略方法时&#xff0c;报null&#xff0c;排查后发现是接口实现有多个&#xff0c;需要添加别名 注入时添加Qeualifier&#xff0c;指定名称&#xff0c;如下图&#xff1b;如图上修改&#xff0c; 测试类中不用new具体行为策略了&#xff0c;注入别名即…

文心一言 VS 讯飞星火 VS chatgpt (72)-- 算法导论7.1 3题

三、请简要地证明:在规模为 n 的子数组上&#xff0c;PARTITION 的时间复杂度为 Θ(n)。 文心一言&#xff1a; 首先&#xff0c;我们需要明确PARTITION函数的具体定义。PARTITION函数通常用于快速排序算法中&#xff0c;它将一个数组分为两个子数组&#xff0c;使得一个子数…

java-IDEA MAVEN查看依赖树,解决jar包重复和冲突

如果这里面的依赖关系有红线,就说明有包冲突,一般都是版本不一致,可以在idea里下一个插件Maven Helper,点击install并重启IDEA 打开pom.xml文件&#xff0c;在下方会出现Dependency Analyzer&#xff0c;选择它会出现重复依赖列表&#xff0c;选择对应的依赖&#xff0c;右键红…

K8s中的PV和PVC和监控

1.PV和PVC PV&#xff1a;持久化存储&#xff0c;对存储资源进行抽象&#xff0c;对外提供可以调用的地方&#xff08;类似&#xff1a;生产者&#xff09; PVC&#xff1a;用于调用&#xff0c;不需要关心内部实现细节&#xff08;类似&#xff1a;消费者&#xff09; 2.实…