# 数据的读取 Follower Read 

__*Follower Read*__

![left](./student-guide/diagram/FollowerRead_aa_001_2022051.png)
-------------------------------------------------------------
之前介绍的读写操作都是在 leader 节点上进行的,于是就自然而然引出了这样的想法,follower 节点是不是能够分担 leader 的读压力呢？

答案是可以的,这个功能就是 Follower Read,它的实现方法主要为:

1. 当 TiDB Server向某个 follower 节点发出读请求时,follower 为获知当前最新 commit 的 raft log 的序号（ commit index ）需要询问 leader 节点。

2. Leader 节点将当前自己的 commit index 告知 follower 节点,如果 follower 发现目前自己还没有 apply 这个序号的 raft log,便开始等待。

3. 直到 follower 确认本地已经 apply 到了 leader 刚才发送过来的 commit index 后,follower 和 leader 已经同步,此时读取数据给 TiDB Server。

这里有个问题需要我们注意:

在上面提到的步骤 2, 有可能 leader 发送给 follower 的 commit index 的 raft log,在 follower 上已经被 append 并且 apply 了（因为 leader 可能还没有来得及 apply,而 follower 已经 apply 了）,这个时候有可能出现 follower 先读到,leader 过一会儿才读到的现象。