副本数据一致性的一些分析

目录

一致性模型分析

线性一致性(强一致性,strict consistency)

顺序一致性(Sequential Consistency)

因果一致性(Casual Consistency)

腾讯朋友圈的例子

参考资料


一致性模型分析

线性一致性(强一致性,strict consistency)

对一致性的要求:

  • 任何一次读都能读到某个数据的最近一次写的数据。
  • 系统中的所有进程,看到的操作顺序,都和全局时钟下的顺序一致。

显然这两个条件都对全局时钟有非常高的要求。强一致性只是存在理论中的一致性模型,比它要求更弱一些的,是顺序一致性。

顺序一致性(Sequential Consistency)

对一致性的要求:

  • 任何一次读都能读到某个数据的最近一次写的数据。
  • 允许系统中的所有进程形成自己合理的统一的一致性,不需要与全局时钟下的顺序都一致。

在设计和证明运行在该计算机上的多进程算法[1]-[3]的正确性时,通常基于如下假设:执行结果与这些处理器以某一串行顺序执行的结果相同,同时每个处理器内部操作的执行看起来又与程序描述的顺序一致。满足该条件的多处理器系统我们就认为是sequential consistent的"。这里的处理器就代表了一个独立的执行进程(或线程),每个进程(线程)内部是串行执行的。如果并行执行的结果与某个合法的串行执行顺序(在这个执行顺序中每个线程内部的执行顺序要保留)的执行结果一致,我们就认为它是符合顺序一致性的

  • 图a是满足顺序一致性,但是不满足强一致性的。原因在于,从全局时钟的观点来看,P2进程对变量X的读操作在P1进程对变量X的写操作之后,然而读出来的却是旧的数据。但是这个图却是满足顺序一致性的,因为两个进程P1,P2的一致性并没有冲突。从这两个进程的角度来看,顺序应该是这样的:Write(y,2) , Read(x,0) , Write(x,4), Read(y,2),每个进程内部的读写顺序都是合理的,但是显然这个顺序与全局时钟下看到的顺序并不一样。
     
  • 图b满足强一致性,因为每个读操作都读到了该变量的最新写的结果,同时两个进程看到的操作顺序与全局时钟的顺序一样,都是Write(y,2) , Read(x,4) , Write(x,4), Read(y,2)。
  • 图c不满足顺序一致性,当然也就不满足强一致性了。因为从进程P1的角度看,它对变量Y的读操作返回了结果0。那么就是说,P1进程的对变量Y的读操作在P2进程对变量Y的写操作之前,这意味着它认为的顺序是这样的:write(x,4) , Read(y,0) , Write(y,2), Read(x,0),显然这个顺序又是不能被满足的,因为最后一个对变量x的读操作读出来也是旧的数据。因此这个顺序是有冲突的,不满足顺序一致性。

因果一致性(Casual Consistency)

又比顺序一致性降低:它仅要求有因果关系的操作顺序得到保证,非因果关系的操作顺序则无所谓。
因果相关的要求是这样的:

  • 本地顺序:本进程中,事件执行的顺序即为本地因果顺序。
  • 异地顺序:如果读操作返回的是写操作的值,那么该写操作在顺序上一定在读操作之前。
  • 闭包传递:和时钟向量里面定义的一样,如果a->b,b->c,那么肯定也有a->c。

图a满足顺序一致性,因此也满足因果一致性,因为从这个系统中的四个进程的角度看,它们都有相同的顺序也有相同的因果关系。
图b满足因果一致性但是不满足顺序一致性,这是因为从进程P3、P4看来,进程P1、P2上的操作因果有序,因为P1、P2上的写操作不存在因果关系,所以它们可以任意执行。不满足一致性的原因,同上面一样是可以推导出冲突的情况来。

腾讯朋友圈的例子

    在infoq分享的腾讯朋友圈的设计中,他们在设计数据一致性的时候,使用了因果一致性这个模型。用于保证对同一条朋友圈的回复的一致性,比如这样的情况:

  A发了朋友圈内容为梅里雪山的图片。

  B针对内容a回复了评论:“这里是哪里?”

  C针对B的评论进行了回复:”这里是梅里雪山“。

  那么,这条朋友圈的显示中,显然C针对B的评论,应该在B的评论之后,这是一个因果关系,而其他没有因果关系的数据,可以允许不一致。

  微信的做法是:

  每个数据中心,都自己生成唯一的、递增的数据ID,确保能排重。在下图的示例中,有三个数据中心,数据中心1生成的数据ID模1为0,数据中心1生成的数据ID模2为0,数据中心1生成的数据ID模3为0,这样保证了三个数据中心的数据ID不会重复全局唯一。

  每条评论都比本地看到所有全局ID大,这样来确保因果关系,这部分的原理前面提到的向量时钟一样。

 



  有了这个模型和原理,就很好处理前面针对评论的评论的顺序问题了。

  假设B在数据中心1上,上面的ID都满足模1为0,那么当B看到A的朋友圈时,发表了评论,此时给这个评论分配的ID是1,因此B的时钟向量数据是[1]。

  假设C在数据中心2上,上面的ID都满足模2为0,当C看到了B的评论时,针对这个评论做了评论,此时需要给这个评论分配的ID肯定要满足模2为0以及大于1,评论完毕之后C上面的时钟向量是[1,2]。

  假设A在数据中心3上,上面的ID都满足模3为0,当A看到B、C给自己的评论时,很容易按照ID进行排序和合并--即使A在收到C的数据[1,2]之后再收到B的数据[1],也能顺利的完成合并。

 

参考资料


微信朋友圈技术之道 http://www.infoq.com/cn/presenta ... y-of-weixin-moments

《分布式计算-原理、算法与系统》

《分布式系统一致性的发展历史 (一)》

https://blog.csdn.net/hit_shaoqi/article/details/79515335

http://udn.yyuap.com/thread-109249-1-1.html

https://www.jianshu.com/p/dcead11b3da9

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值