为保证在各个节点副本数据一致性,以前一般采用加锁的方法。 然而加锁是悲观的方法,对性能影响比较大。 这里介绍乐观的NRW 方法来进行一致性。
N表示数据所具有的副本数。
R表示完成读操作所需要读取的最小副本数,即一次读操作所需参与的最小节点数目。
W表示完成写操作所需要写入的最小副本数,即一次写操作所需要参与的最小节点数目。
该策略中,只需要保证R + W>N,就可以保证强一致性。 如果R + W ≤ N,这时读取和写入操作是不重叠的,系统只能保证最终一致性,而副本达到一致的时间则依赖于系统异步更新的实现方式,不一致性的时间段也就等于从更新开始到所有的节点都异步完成更新之间的时间。
假设N=5, 如果R=1, 那么W必须是5. 所以就是写入所有的节点是全部节点,那么读取任何一个节点就可以最新的数据。 有点就是像读写锁了。
如果R=5, 那么W只要是1就可以了。 那么写的效率就非常高。 读取的效率比较低。
如果R=N/2+1, W=N/2, 读写之间为达到某个平衡。 是不错的策略。兼顾了性能和可用性,Dynamo系统的默认设置就是这种。