TiDB 的 Follower Read 功能

【 TiDB 使用环境】生产环境 /测试/ Poc
【 TiDB 版本】6.5.2
【复现路径】
【遇到的问题:问题现象及影响】
看到有文档说tidb默认只能从leader region读数据,也可以通过修改参数从follower读取。问题是
1.开启从follower读是否能提高读性能
2.follower读会不会有不一致情况,和leader读有区别

要开启 TiDB 的 Follower Read 功能,将 SESSION 变量 tidb_replica_read 的值设置为 follower 或 leader-and-follower 即可:
set @@tidb_replica_read = ‘<目标值>’;
作用域:SESSION
默认值:leader

1.开启从follower读是否能提高读性能—肯定可以了,例如你本来很多读只能读同一个leader的,容易产生读热点,现在改成follower也能读了,一下变成读1个leader和多个follower了,肯定提高性能了
2.follower读会不会有不一致情况,和leader读有区别—follower读是强一致读,就是读follower之前,先确保follower的数据和leader是最新的,和leader读区别就是,本来只有1个leader可以提供读服务的,现在follower也能提供读服务了

我补充几点:

  1. follower read的运行原理是:follower节点,收到读的请求后,去leader节点获取当前leader节点apply到哪个位置。然后当follower也apply到这个位置后,说明对于到达follower的这个读请求,数据已经和leader一致了。所以数据肯定是一致的。
  2. follower read能不能提升性能呢?对于非常均衡的读请求,这个是不能的。因为follower read多一次对leader的readindex请求。总体上是浪费了集群的cpu和网络的,所以如果本身集群各个节点的读请求都很均衡,那应该没什么性能提升。
  3. follower适合的场景:
    coprocessor的扫描请求,对于这一次请求来说,多一次和leader交互所浪费的时间对于后面的region扫描来说是非常小的消耗的话,就比较划算。但是这也有个前提条件:leader 忙不过来了,如果leader能轻松应对这些请求,那follower节点的资源不如就让给其他region的leader用。也就是说读热点的时候确实是有用的。
    另外,leader切换的时候,原来的leader变成了follower,这时候客户端对region的cache还没更新,还是发给老的leader,如果不开follower read,原来的leader会拒绝请求然后客户端重新发起。如果有follower read的话,少跑一趟也是一点收益。

个人理解,仅供参考 :grin:

此话题已在最后回复的 60 天后被自动关闭。不再允许新回复。