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发起了读请求,这样两个客户端将读取到不同的数据。
相关推荐
远方160939 分钟前
14-Oracle 23ai Vector Search 向量索引和混合索引-实操
数据库·ai·oracle
GUIQU.2 小时前
【Oracle】数据仓库
数据库·oracle
ABB自动化2 小时前
for AC500 PLCs 3ADR025003M9903的安全说明
服务器·安全·机器人
努力学习的小廉2 小时前
深入了解linux系统—— 进程池
linux·运维·服务器
恰薯条的屑海鸥2 小时前
零基础在实践中学习网络安全-皮卡丘靶场(第十六期-SSRF模块)
数据库·学习·安全·web安全·渗透测试·网络安全学习
咖啡啡不加糖2 小时前
Redis大key产生、排查与优化实践
java·数据库·redis·后端·缓存
曼汐 .2 小时前
数据库管理与高可用-MySQL高可用
数据库·mysql
秃头菜狗2 小时前
各个主要目录的功能 / Linux 常见指令
linux·运维·服务器
利刃大大2 小时前
【在线五子棋对战】二、websocket && 服务器搭建
服务器·c++·websocket·网络协议·项目
2301_793102493 小时前
Linux——MySql数据库
linux·数据库