关于读热点参数tidb_load_based_replica_read_threshold设置

打散读热点

在读热点场景中,热点 TiKV 无法及时处理读请求,导致读请求排队。但是,此时并非所有 TiKV 资源都已耗尽。为了降低延迟,TiDB v7.1.0 引入了负载自适应副本读取功能,允许从其他 TiKV 节点读取副本,而无需在热点 TiKV 节点排队等待。你可以通过 tidb_load_based_replica_read_threshold 系统变量控制读请求的排队长度。当 leader 节点的预估排队时间超过该阈值时,TiDB 会优先从 follower 节点读取数据。在读热点的情况下,与不打散读热点相比,该功能可提高读取吞吐量 70%~200%。

请问这个参数tidb_load_based_replica_read_threshold设置多大才比较适合,如果不想重建表打散主键ID的话。

从 100ms 开始尝试,观察 Leader 节点的 CPU/IO 负载变化,以及读延迟是否下降
若读延迟仍高,可逐步减小阈值(如 50ms、20ms),但需注意跨节点读会增加网络开销
若跨节点读导致延迟上升,可适当调大阈值,平衡负载与延迟

这个最好做压力测试调整这个参数的具体设置

官方所有的参数都没一个建议值,咱们只能盲人过河,系统都已经上线了,没办法压力测试.

tidb_load_based_replica_read_threshold 从 v7.0.0 版本开始引入

  • 作用域:SESSION | GLOBAL
  • 是否持久化到集群:是
  • 默认值:"1s"
  • 范围:[0s, 1h]
  • 类型:字符串
  • 这个变量用来设置基于负载的 replica read 的触发阈值。当 leader 节点的预估排队时间超过阈值时,TiDB 会优先从 follower 节点读取数据。格式为时间,例如 "100ms""1s"。详情见 TiDB 热点问题处理

mysql> show variables like ‘%tidb_load_based_replica_read_threshold%’;
±---------------------------------------±------+
| Variable_name | Value |
±---------------------------------------±------+
| tidb_load_based_replica_read_threshold | 1s |
±---------------------------------------±------+
1 row in set (0.00 sec)

这个值默认是1s,已经开启了,但感觉没什么用,每次还是有其中一个tikv节点负载高,提高读取吞吐量 70%~200%,没有发现有任何提升。

全局 Follower Read 开关,必须设为leader-and-follower。阀值改为200ms试试