readIndex read、lease read、follower read是解决什么问题的?

【 TiDB 使用环境】线上、测试、调研
【 TiDB 版本】
【遇到的问题】
【复现路径】做过哪些操作出现的问题
【问题现象及影响】

【附件】

请提供各个组件的 version 信息,如 cdc/tikv,可通过执行 cdc version/tikv-server --version 获取。

readindex read与local read

inspect:判断请求类别和处理方式。让我们聚焦到读请求,处理方式总共有两种:

RequestPolicy::ReadLocal,也就是 local read,说明该 Peer 是 leader 且在 lease 内,可以直接读取数据。

RequestPolicy::ReadIndex,也就是 read index,说明该 Peer 是 leader 但不在 lease 内,或者该请求明确要求使用 read index 处理。

self.read_local:以 loca read 方式处理请求,直接读取 RocksDB。

self.read_index:以 read index 方式处理请求,询问一遍大多数节点,确保自己是合法 leader,然后到达或超过线性一致性的点(read index)后读取 RocksDB。

inspect 方法也不复杂,我们住逐行看一下:

req.get_header().get_read_quorum():该请求明确要求需要用 read index 方式处理,所以返回 ReadIndex。

self.has_applied_to_current_term():如果该 leader 尚未 apply 到它自己的 term,则使用 ReadIndex 处理,原因见 TiKV 功能介绍 - Lease Read。

self.raft_group.raft.in_lease():如果该 leader 不在 raft 的 lease 内,说明可能出现了一些问题,比如网络不稳定,心跳没成功等。使用 ReadIndex 处理。

self.leader_lease.inspect(None):使用 CPU 时钟判断 leader 是否在 lease 内,如果在,则使用 ReadLocal 处理。

这判断总的来说就是,如果不确定能安全地读 RocksDB 就用 read index,否则大胆地使用 local read 处理。

是为了解决“当前读取到的region Leader角色就一定是leader吗?”的问题,从而保证在分布式环境下数据读取的准确性,确认下readindex read是TiDB默认的吧?可以修改吗?

为了保证读请求的线性一致性

你说的修改是指修改什么呢

readIndex read :是一种读的请求,获取当前时刻能保证线性一致的 Raft log index,保证线性一致性
lease read(local read):该 Peer 是 leader 且在 lease 内,可以直接读取数据
readIndex :该 Peer 是 leader 但不在 lease 内,或者该请求明确要求使用 read index 处理,以 read index 方式处理请求,询问一遍大多数节点,确保自己是合法 leader,然后到达或超过线性一致性的点(read index)后读取 RocksDB
follower read :顾名思义,就是在强一致性读的前提下使用 Region 的 follower 副本来承载数据读取的任务

讲课时说是默认采用readIndex read,这里的默认指的是什么情况?

这里的默认readIndex read可以调整为lease read吗?

你好默认不能修改,执行逻辑是由 TiKV 代码控制,不知道您是否阅读过这两篇源码文章,以便更好的了解
ReadIndex Read 和 Lease Read 的场景和原理,欢迎讨论,谢谢
https://cn.pingcap.com/blog/lease-read
https://cn.pingcap.com/blog/tikv-source-code-reading-19

我阅读下,谢谢

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