tidb server缓存region分布过期问题

tidb server 本身会缓存近期访问的 leader region位置,但如果再次访问时,缓存记录过期了怎么办;
1、当leader切换了
2、当leader分裂了
是由原leader告诉你最新切换的leader去哪了,还是去PD问
是由原leader告诉你分裂后的信息,还是去PD问

1赞

tidb这头是问pd,pd这头是接收tikv,region的心跳信息来获取

如果需要获取一个范围内的多个 Region,我们会从这个范围的 StartKey 开始,多次调用 GetRegion 这个接口,每次返回的 Region 的 EndKey 做为下次请求的 StartKey,直到返回的 Region 的 EndKey 大于请求范围的 EndKey。

以上执行过程有一个很明显的问题,就是我们每次读取数据的时候,都需要先去访问 PD,这样会给 PD 带来巨大压力,同时影响请求的性能。

为了解决这个问题,tikv-client 实现了一个 RegionCache 的组件,缓存 Region 信息, 当需要定位 key 所在的 Region 的时候,如果 RegionCache 命中,就不需要访问 PD 了。RegionCache 的内部,有两种数据结构保存 Region 信息,一个是 map ,另一个是 b-tree ,用 map 可以快速根据 region ID 查找到 Region,用 b-tree 可以根据一个 key 找到包含该 key 的 Region。

严格来说,PD 上保存的 Region 信息,也是一层 cache,真正最新的 Region 信息是存储在 tikv-server 上的,每个 tikv-server 会自己决定什么时候进行 Region 分裂,在 Region 变化的时候,把信息上报给 PD,PD 用上报上来的 Region 信息,满足 tidb-server 的查询需求。

当我们从 cache 获取了 Region 信息,并发送请求以后, tikv-server 会对 Region 信息进行校验,确保请求的 Region 信息是正确的。

如果因为 Region 分裂,Region 迁移导致了 Region 信息变化,请求的 Region 信息就会过期,这时 tikv-server 就会返回 Region 错误。遇到了 Region 错误,我们就需要 清理 RegionCache ,重新 获取最新的 Region 信息 ,并重新发送请求。

1赞

image
还是没回答这时候是从哪去获取,是直接kv告诉,还是再回pd问。这时候kv告诉的开销是最小而且最准确的吧

1赞

PD 阿,因为 Region 会心跳上传到 PD,

通过 cache获取失败,则会去 PD 去获取最新的,然后更新到 Cache,就不需要每次都查
这个过程被称为 backoff

从PD获取