分布式一致性算法05 NWR协议
一、基本概念
NWR模型是一种强一致性算法,它巧妙的利用了N(备份数)、W(写入成功数)、R(读取成功数)之间的关系(W+R>N),从而达到一致性的要求。
其中:
N(备份数):系统中备份的总数。
W(写入成功数):执行写操作时,需要写入成功的最小备份数量。
R(读取成功数):执行读操作时,需要查询成功的最小备份数量。
为了保证一致性,必须满足以下条件:
W+R>N
这个不等式确保了在执行读操作时,至少有一个最新的备份被读取到,从而避免了读到过时的数据。
二、相关角色
NWR协议中,所有的节点是一样的。
三、算法流程
1、客户端请求写入
各节点收到消息,写入成功后,返回写入成功
当客户端收到W以上个写入成功后,认为写入成功
2、客户端读取请求
个节点收到读取消息,返回结果
当客户端收到R个以上的结果后,直接使用最新版本的数据即可。
由于W+R>N,所以客户端至少可以读取到一份最新的数据,不会读取到历史版本。
四、举例说明
假设我们有一个分布式系统,其中有5个节点,即N=5。
要求确保写操作在至少3个节点上成功(W=3),并且读操作至少查询3个节点(R=3)。
1、写操作
客户端向系统发送一个写请求,比如更新某个键值对。
2、写操作的传播
写请求被发送到所有5个备份节点,等待至少3个节点确认写操作成功。
3、写操作的确认
假设有3个节点成功更新了数据,满足了W=3的要求,写操作被认为是成功的。
4、读操作
客户端发送一个读请求,希望获取最新的键值对数据。
5、读操作的数据收集
系统从5个备份节点中的任意3个节点获取数据,由于W+R>N(3+3>5),至少有一个节点上的数据是最新的。
6、结果的确认
客户端收到来自3个节点的响应,可能会发现不同节点的数据版本不同。
客户端选择版本号最高的数据使用即可。
五、NWR的优点
1、实现简单
2、在NWR体系下,无需等待所有节点都写入成功,即可判定数据更新成功,而且保证可以读取到最新数据,提升了系统的吞吐量,同时系统的可用性也有较大提升。
3、即使部分节点宕机,只要能保证W+R>N,系统还是处于可运行状态,比如
N=5,W=3,R=3
即使宕掉2个节点,仍然可以保证运行,只不过系统退化为了强C系统。
六、NWR突破了CAP的限制吗?
并没有哦,其实我们挑战一下NWR的设置就可以看懂了(先不考虑P,我们讨论一下CA)
当W=N、R=1的时候,其实就是写入时,牺牲了A,保证了C(节点都一致)
当W=1、R=N,其实就是写入时,保证了A,牺牲了C(节点都不一致)