NRW算法是基于Quorum机制的是一种CP(Consistency&Partion tolerance)算法。
NWR策略(又称为Quorum仲裁协议),其中,N为数据的副本总数,W为更新一个数据对象时需要确保成功更新的份数,R为读取一个数据时需要读取的副本个数。
如果W+R>N, 那么久可以保证某个数据不能被两个不同的事物同时读/写。否则,如果有两个事物同时对同一数据进行读/写,那么在W+R>N的情况下,至少会有一个副本发生读/写冲突。
如果W>N/2, 那么可以保证两个事务不能并发写同一个数据,否则,至少会有一个副本发生写冲突。
强一致性:NRW中N=W, R=1, 比如313,616。
弱一致性:NRW中N!=W, R+W>N, 比如634。
最终一致性:暂时有段时间副本之间不一致,但是最终会成为一致。NRW中,N+W<=N, NRW=311
N: 数据复制的份数。
W:更新数据是需要保证写完成的节点数。
R:读取数据的时候需要读取的节点数。
一般采取N = 3, R = 2, W =2。
N至少达到3,大于3则付出更高的成本。小于3无法保障高可用。
W = 2 可以保障大多数写成功。 W未必等于N,则一定存在数据不一致的情况。 冲突解决策略一般有Cassandra使用的client tiemstamps和Riak的Vector clock等,如果无法解决,冲突可能会硬性覆盖或者推到业务代码。
R = 2 能保障读到大多数一致的最新版本。
参考文档
Quorum机制与NRW算法
https://blog.csdn.net/jeffsmish/article/details/54171812