We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
https://summer-ospp.ac.cn/org/prodetail/2395a0390?list=org&navpage=org
JRaft是一个基于RAFT一致性算法的生产级高性能Java实现,它运行过程分为两个阶段,即Leader选举和日志复制。在原始的RAFT算法中,Leader选举和日志复制都需要获得多数派成员的支持。而NWR模型则可以在动态调整一致性强度的场景中使用,它需要满足W+R>N,以保证强一致性。JRaft将RAFT和NWR结合起来,使得用户可以根据不同的业务需求来动态调整Quorum的数量。例如,在一个写多读少的场景中,用户可以将多数派的数量从3调整为2,以降低达成共识的条件,从而提高写请求的效率。同时,为了保证RAFT的正确性,写Quorum的调整需要付出代价,即读Quorum的数量也需要相应调整。JRaft支持成员变更,因此用户可以配置(0,1]范围内的小数来计算W和R的具体值。通过使用JRaft,用户可以根据自己的业务需求来灵活地调整一致性强度,使得分布式系统在不同场景下都可以获得最佳的性能和正确性。
进阶
刘源远 [email protected]
Raft协议的Leader选举和日志复制等部分使用到多数派确认模型的地方,我们都需要对应为其添加NWR模型选择。 所以在如下的模块中,需要新增NWR模型的逻辑:
Leader选举模块: 一个节点想要成为leader,会经过以下几个阶段:预投票、正式投票、当选leader。所以对于preVote、electSelf、becomeLeader等等与多数派模型相关的方法都会涉及代码的变更。
日志复制模块: 当leader收到客户端的事务请求或者follower与leader数据存在差距时,会调用 Replicator#sendEntries 去复制日志,日志复制消息属于事务消息;而心跳消息和探测消息,则是由 Replicator#sendEmptyEntries 发送的。 在日志复制中,有哪些过程会涉及到多数派确认呢?一个是 NodeImpl#executeApplyingTasks ,一个是 NodeImpl#unsafeApplyConfiguration 。在执行这些方法的时候,都会使用 BallotBox#appendPendingTask 方法来构造一个待投票的Ballot(现在叫MajorityQuorum/NWRQuorum)并放置到投票箱中。
一致性读模块: 对于一致性读模块,在raft共识算法中,读取R个节点其实体现在R个节点的心跳响应。通过R个节点的心跳,能保证这个节点一定是leader,一定拥有最新的数据,我们并不是真正需要从R个节点里面读取数据。对应的修改部分,像 NodeImpl#ReadIndexHeartbeatResponseClosure 这样的方法,我们可以看到执行了心跳消息的多数派确认模型的逻辑,ReadIndexHeartbeatResponseClosure构造器里面传入了quorum的值,这里我们需要对应修改为NWR模型的逻辑。
成员变更模块: 对于JRaft成员变更来讲,核心逻辑是采用单成员变更的方式,即使需要同时变更多个成员时,也是会先整理出新add与新remove的成员,再逐个进行单成员变更。其核心方法 addPeer、removePeer、changePeers、resetPeers 等等都会涉及NWR模型的适配。
The text was updated successfully, but these errors were encountered:
@1294566108 辛苦啦,听起来很不错,来尝试完成它吧!
另外可以把最新的文档,补充下,或者维护在rfc里面 https://github.com/sofastack/sofa-jraft/tree/master/rfcs
Sorry, something went wrong.
@1294566108 辛苦啦,听起来很不错,来尝试完成它吧! 另外可以把最新的文档,补充下,或者维护在rfc里面 https://github.com/sofastack/sofa-jraft/tree/master/rfcs
最新文档已提交到rfc里面:https://github.com/sofastack/sofa-jraft/pull/1005/files#diff-1f06352a32904cf8e6d712819eb401cdf6b2239122d6a971c7fdbef72fa2da5b
Successfully merging a pull request may close this issue.
OSPP开源之夏官网课题链接:
https://summer-ospp.ac.cn/org/prodetail/2395a0390?list=org&navpage=org
背景:
JRaft是一个基于RAFT一致性算法的生产级高性能Java实现,它运行过程分为两个阶段,即Leader选举和日志复制。在原始的RAFT算法中,Leader选举和日志复制都需要获得多数派成员的支持。而NWR模型则可以在动态调整一致性强度的场景中使用,它需要满足W+R>N,以保证强一致性。JRaft将RAFT和NWR结合起来,使得用户可以根据不同的业务需求来动态调整Quorum的数量。例如,在一个写多读少的场景中,用户可以将多数派的数量从3调整为2,以降低达成共识的条件,从而提高写请求的效率。同时,为了保证RAFT的正确性,写Quorum的调整需要付出代价,即读Quorum的数量也需要相应调整。JRaft支持成员变更,因此用户可以配置(0,1]范围内的小数来计算W和R的具体值。通过使用JRaft,用户可以根据自己的业务需求来灵活地调整一致性强度,使得分布式系统在不同场景下都可以获得最佳的性能和正确性。
项目产出要求:
难度:
进阶
导师:
刘源远
[email protected]
项目技术要求:
Quorum设计思路:
NWR涉及模块
Raft协议的Leader选举和日志复制等部分使用到多数派确认模型的地方,我们都需要对应为其添加NWR模型选择。
所以在如下的模块中,需要新增NWR模型的逻辑:
Leader选举模块: 一个节点想要成为leader,会经过以下几个阶段:预投票、正式投票、当选leader。所以对于preVote、electSelf、becomeLeader等等与多数派模型相关的方法都会涉及代码的变更。
日志复制模块: 当leader收到客户端的事务请求或者follower与leader数据存在差距时,会调用 Replicator#sendEntries 去复制日志,日志复制消息属于事务消息;而心跳消息和探测消息,则是由 Replicator#sendEmptyEntries 发送的。
在日志复制中,有哪些过程会涉及到多数派确认呢?一个是 NodeImpl#executeApplyingTasks ,一个是 NodeImpl#unsafeApplyConfiguration 。在执行这些方法的时候,都会使用 BallotBox#appendPendingTask 方法来构造一个待投票的Ballot(现在叫MajorityQuorum/NWRQuorum)并放置到投票箱中。
一致性读模块: 对于一致性读模块,在raft共识算法中,读取R个节点其实体现在R个节点的心跳响应。通过R个节点的心跳,能保证这个节点一定是leader,一定拥有最新的数据,我们并不是真正需要从R个节点里面读取数据。对应的修改部分,像 NodeImpl#ReadIndexHeartbeatResponseClosure 这样的方法,我们可以看到执行了心跳消息的多数派确认模型的逻辑,ReadIndexHeartbeatResponseClosure构造器里面传入了quorum的值,这里我们需要对应修改为NWR模型的逻辑。
成员变更模块: 对于JRaft成员变更来讲,核心逻辑是采用单成员变更的方式,即使需要同时变更多个成员时,也是会先整理出新add与新remove的成员,再逐个进行单成员变更。其核心方法 addPeer、removePeer、changePeers、resetPeers 等等都会涉及NWR模型的适配。
The text was updated successfully, but these errors were encountered: