序
本文主要讨论对等以及主从模型的读写冲突的解决方法。
对等式分布模型
即有多个master,同时接受读写操作
写入冲突
多个人在同时更新同一条数据(对于单机数据库,就是并发问题,可由乐观锁或悲观锁来解决;对于对等分布式模型,则需要保证顺序一致性,即所有节点都保证以相同顺序执行操作)。
读取冲突
从各个节点读取同一个数据的内容不一样。
RWN方案解决读冲突
强一致性:strong consistency(读取的数据都是最新的),要求多少节点才行。
write quorum
假设某份数据需要复制到3个节点,为了保证强一致性,不需要所有节点都确认写入操作,只需要其中两个节点(也就是超半数节点)确认就可以了。在这种情况下,如果发生两个相互冲突的写入操作,那么只有其中一个操作能为超过半数的节点所认可,这就是写入仲裁(write quorum),如果用稍微正规一点的方式说,那就是W>N/2,这个不等式的意思是参与写入操作的节点数W,必须超过副本节点数N的一半,副本节点数又称为复制因子(replication factor)。
read quorum
读取仲裁(read quorum),也就是说想保证能够读到最新的数据,必须与多少个节点联系才行。假设写入操作需要两个节点来确认(W=2),那么我们至少得联系两个节点,才能保证获取到最新数据。然而,假如某些写入操作只被一个节点所确认(W=1),那么我们就必须3个节点都通信一遍,才能确保获取到的数据是最新的。一个情况下,由于写入操作没有获得足够的节点支持率,所以可能会产生更新冲突。但是,只要从足够数量的节点中读出数据,就一定能侦测出此类冲突。因此,即使在写入操作不具备强一致性的情况下,也可以实现除具有强一致性的读取操作来。
RWN
- R
执行读取操作时所需联系的节点数R
- W
确认写入操作时所需征询的节点数W
- N
复制因子N
这三者之间的关系,可以用一个不等式来表述,即只有当R+W>N的时候,才能保证读取操作的强一致性。
实例
对于Riak这样的数据库,可以控制CAP中的参数:N(存取键值对的副本节点数)、R(顺利完成读取操作所需的最小节点数)、W(顺利完成写入操作所需的最小节点数)。假设Riak集群有5个节点,将N设为3,也就是所有数据都要至少复制到3个节点中,将R设为2,即get请求要求有两个节点应答,才能成功,将W设为2,即put请求必须写入到两个节点才算写入完毕。
主从分布式模型
针对主从分布式模型,只需要保证都向master写入数据,就可以避免写入冲突了,类似的,读取操作从master,就可以避免读写冲突/读取不一致了。
参考
- 原文链接:RWN及Quorum与强一致性