Raft 读请求性能分析

Raft保证读请求Linearizability的方法
  • Leader把每次读请求作为一条日志记录,以日志复制的形式提交,并应用到状态机后,读取状态机中的数据返回。(一次RTT、一次磁盘写)

  • 使用Leader Lease,保证整个集群只有一个Leader,Leader接收到都请求后,记录下当前的commitIndex为readIndex,当applyIndex大于等于readIndex 后,则可以读取状态机中的数据返回。(0次RTT、0次磁盘写)

  • 不使用Leader Lease,而是当Leader通过以下两点来保证整个集群中只有其一个正常工作的Leader:

    (1)在每个Term开始时,由于新选出的Leader可能不知道上一个Term的commitIndex,所以需要先在当前新的Term提交一条空操作的日志;

    (2)Leader每次接到读请求后,向多数节点发送心跳确认自己的Leader身份。之后的读流程与Leader Lease的做法相同。(一次RTT、0次磁盘写)

  • 从Follower节点读:

    • Follower先向Leader询问readIndex,Leader收到Follower的请求后依然要通过2或3中的方法确认自己Leader的身份,然后返回当前的commitIndex作为readIndex,Follower拿到readIndex后,等待本地的applyIndex大于等于readIndex后,即可读取状态机中的数据返回。(2次或1次RTT、0次磁盘写)
Raft保证读请求Sequential Consistency的方法
  • Leader处理每次读写、Follower处理每次读请求时,都返回本节点的applyIndex,客户端在本地保存自己看到的最新的applyIndex。客户端每次请求时都带上这个applyIndex(假设为clientIndex),Leader或者Follower拿客户端请求中的clientIndex和自己本地的applyIndex比较,如果applyIndex大于等于clientIndex,则可以读取状态机数据返回,否则等待,直到applyIndex大于等于clientIndex。(0次RTT、0次写磁盘)
Linearizability和Sequential Consistency的区别

Linearizability - All processes see all shared accesses in the same order. Accesses are furthurmore ordered according to a global timestamp
Sequential - All processes see all shared accesses in the same order. Accesses are not ordered in time.

  • 举个例:在Raft中,Linearizability读保证任何一个客户端的读请求对其他所有客户端后续的请求都是可见的 ,而Sequential读保证某个客户端自己的读请求对后续自己的请求是可见的。比如其中一个客户端提交了写请求且Leader上更新了状态机,接着此客户端向Leader发起读请求,而由于Follower可能还没有apply这条日志,所以另一个客户端向Follower发起了读请求,这样两个客户端将读取到不同的数据。
相关推荐
Java王小怪1 小时前
Docker环境Redis没挂载保存数据
运维·docker·容器
保定公民1 小时前
达梦数据库存储过程中的数组类型详解:基础数组与记录数组的差异化应用
数据库·达梦·存储过程·达梦数据库·dm8·dm
你住过的屋檐1 小时前
【Nginx】linux上安装nginx
linux·运维·nginx
梦Arrebol2 小时前
Redis 内容及相关实验
数据库·redis
大模型码小白2 小时前
Spring AI Tool 实现自然语言操作 MySQL 数据库详解
服务器·开发语言·数据库·人工智能·python·mysql·spring
晓晓_za8986683 小时前
开源 GEO 优化源码二次开发:贴牌改造与业务模块扩展实践
java·运维·服务器·开发语言·性能优化·开源
云计算DevOps-韩老师4 小时前
【MySQL运维DBA】【SQL基础系列002篇】
运维·mysql·dba
云贝教育-郑老师4 小时前
【麒麟服务器系统交付:一个DBA的六年信创实战笔记】
服务器·笔记·dba
DBA大董4 小时前
TDengine3.0 DBA常用的运维命令和SQL2
运维·数据库·时序数据库·dba·tdengine