本章我们简单介绍一下分布式存储系统中的NWR协议。

1. NWR协议

NWR是一种在分布式存储系统中用于控制一致性级别的一种策略。在Amazon的Dynamo云存储系统中,就应用NWR来控制一致性。

如下我们先来看看这三个字母的含义:

  • N: 在分布式存储系统中,有多少份备份数据;

  • W: 代表一次成功的更新操作要求至少有W份数据写入成功;

  • R: 代表一次成功的读数据操作要求至少有R份数据成功读取;

NWR值的不同组合会产生不同的一致性效果,当 W+R > N的时候,整个系统对于客户端来讲能保证强一致性。当W+R以常见的N=3、W=2、R=2为例:

N=3表示任何一个对象都必须有三个副本(Replica)

W=2表示对数据的修改操作(Write/Modify)只需要在3个Replica中的2个上面完成就返回;

R=2表示从三个对象中要读取到2个数据对象才能返回;

在分布式系统中,数据的单点是不允许存在的。即线上正常存在的Replica数量是1的情况是非常危险的,因为一旦这个Replica再次错误,就可能发生数据的永久性错误。假如我们把N设置为2,那么只要有一个存储节点发生损坏,就会有单点的存在。所以N必须大于2,N越高,系统的维护和整体成本就越高。

工业界通常把N设置为3。当W是2,R是2的时候,W+R>N,这种情况对于客户端就是强一致性的:

nwr-322

在上图中,如果R+W>N,则读取操作和写入操作成功的数据一定会有交集(如图中的B),这样就可以保证一定能够读取到最新版本的更新数据,数据的强一致性得到了保证。在满足一致性协议的前提下,R或者W设置的越大,则系统延迟越大,因为这取决于最慢的那份备份数据的响应时间。而如果R+W<=N,则无法保证数据的强一致性,以为成功写和成功读可能不存在交集,这样读操作无法读取到最新的更新数值,也就无法保证数据的强一致性。

在具体实现系统时,仅仅依靠NWR协议还不能完成一致性保证,因为在上述过程中,当读取到多个备份数据时,需要判断哪些数据是最新的,如何判断数据的新旧? 这需要向量时钟来配合,所以对于Dynamo来说,是通过NWR协议结合向量时钟来共同完成一致性保证的。



参看:

  1. NWR协议