![036e2761e9e028d1c93ff175142f1ed9.png](https://img-blog.csdnimg.cn/img_convert/036e2761e9e028d1c93ff175142f1ed9.png)
Raft 只读操作优化
为什么需要优化只读操作
raft是一个为分布式集群达成一致性的协议。对于集群需要保证一致性的数据,每次一操作其实都要确认此操作是否在集群中达成了一致。从是否会改变数据的角度,操作就分两个只读操作与写操作。只读操作顾名思义就是不会对数据做任何的改动。写操作包含了增删改等需要修改数据的操作,通俗说就是这次操作处理完后,数据有可能跟操作前不一样。
正是因为只读操作不对数据进行修改,所以raft可以优化只读操作。
- 因为只要客户端请求的是现集群真正的leader,那么获取到的数据就不会有错误。一个只读操作没有必要征求整个raft集群的共识。毕竟使用raft达成一个操作的共识还需要多节点网络请求与log持久化落磁盘等开销。
- 在恢复和安装快照,或者是raft集群加入新节点同步log与数据的时,因为只读操作并没有改变数据,所以不需要还原这些操作也能保持数据的完整与一致,提高数据恢复的效率。
如何优化
优化只读操作的核心就是保证此时请求到该集群leader确实是能够向集群中法定人数的节点commit log成功。否则用户可能会读到陈旧的数据信息,无法保证线性一致。
用论文[1]中的话说就是
- leader必须拥有最新被提交的日志的信息
- 在处理只读请求前,leader必须确认自己是否已经被替换掉了
围绕这一核心目标