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