sofastack / sofa-jraft

A production-grade java implementation of RAFT consensus algorithm.
https://www.sofastack.tech/projects/sofa-jraft/
Apache License 2.0
3.56k stars 1.14k forks source link

[OSPP] #1002

Closed 1294566108 closed 1 year ago

1294566108 commented 1 year ago

简介 RAFT SOFAJRaft 是一个基于 RAFT 一致性算法的生产级高性能 Java 实现,JRaft的运行过程分为两个阶段:

Leader选举,Leader选举用于在集群中选出一个数据最完成的成员当选Leader,处理日志复制; 日志复制,用于Raft集群协商事务请求,客户端的指令。 在原始的RAFT算法中,Leader选举、日志复制,都要求获得多数派(即:⌊N / 2⌋ + 1)成员的支持。即:某个成员获得多数派成员的支持则晋升为Leader;某个日志复制到多数派则达成共识。

NWR NWR模型,常用于动态调整一致性强度。具体描述如下:

N:成员总数 W:写入数据的Quorum数 R:读取数据的Quorum数 满足W+R>N的情况下,读Quorum和写Quorum一定存在交集,这个相交的成员一定拥有最新的数据,那么这个分布式系统一定是满足强一致性的。

目标 在一些场景中,我们期望能够动态调整Quorum的数量,使其更贴合自己的业务场景。例如:一个5成员组成的集群,在一个写多读少的场景中,则期望把多数派(3)调整为2,降低达成共识的条件,使得写请求能尽快的完成。同时,为了继续满足RAFT的正确性,将写Quorum调整为2需要付出代价是读Quorum要调整为4,这样才能满足W+R>N。

基于这个设计,用户甚至可以将Quorum调整到一个极端情况。例如:W=1,R=N,此时写效率最高,当然这需要付出的代价是不允许有成员宕机。

RAFT结合NWR Raft中Leader选举存在两个功能:

选出集群认可的成员处理写请求 选出的成员,必须拥有最完整的日志,这用于确保已达成共识的不会被覆盖 这正好对应了NWR模型中的读场景,而处理事务日志对应NWR模型中的写场景。

NWR的计算方式 因为JRaft是支持成员变更的,N是动态变化的,因此我们所配置的W或R不能是一个整数,可以考虑为(0, 1]范围内的小数。再通过计算获得W和R的具体值。 例如:N=5,w=0.4,计算公式为:W=⌈N * w⌉,R=N - W + 1。得到以下表格