分布式理论系列html
本文主要讨论对等以及主从模型的读写冲突的解决方法。code
即有多个master,同时接受读写操做
htm
多我的在同时更新同一条数据(对于单机数据库,就是并发问题,可由乐观锁或悲观锁来解决;对于对等分布式模型,则须要保证顺序一致性,即全部节点都保证以相同顺序执行操做)。blog
从各个节点读取同一个数据的内容不同。
强一致性:strong consistency(读取的数据都是最新的),要求多少节点才行。
假设某份数据须要复制到3个节点,为了保证强一致性,不须要全部节点都确认写入操做,只须要其中两个节点(也就是超半数节点)确认就能够了。在这种状况下,若是发生两个相互冲突的写入操做,那么只有其中一个操做能为超过半数的节点所承认,这就是写入仲裁(write quorum),若是用稍微正规一点的方式说,那就是W>N/2,这个不等式的意思是参与写入操做的节点数W,必须超过副本节点数N的一半,副本节点数又称为复制因子(replication factor)。
读取仲裁(read quorum),也就是说想保证可以读到最新的数据,必须与多少个节点联系才行。假设写入操做须要两个节点来确认(W=2),那么咱们至少得联系两个节点,才能保证获取到最新数据。然而,假如某些写入操做只被一个节点所确认(W=1),那么咱们就必须3个节点都通讯一遍,才能确保获取到的数据是最新的。一个状况下,因为写入操做没有得到足够的节点支持率,因此可能会产生更新冲突。可是,只要从足够数量的节点中读出数据,就必定能侦测出此类冲突。所以,即便在写入操做不具有强一致性的状况下,也能够实现除具备强一致性的读取操做来。
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,就能够避免读写冲突/读取不一致了。