1.一致性
1.1 以数据为中心的一致性模型
1)严格一致性(Strict Consistency):任意读操作都要读到最新的 写的结果,严格一致性是限制性最强的模型,依赖于绝对的全局时钟,但是在分布式系统中实现这种模型的代价太大,所以在实际系统的运用有限,基本不可能做到。
2)持续一致性(Continuous Consistency):有多种不同的方法来为应用程序指定它们能容忍哪些不一致性,其中有一种通用的方法,它定义了区分了不一致性的三个互相独立的坐标轴:副本之家你的数值偏差、副本之间的新旧程度偏差,以及更新操作顺序的偏差。这些偏差形成了持续一致性的范围。
数值偏差:已应用于其他的副本,但还没有应用于给定副本的更新数目。比如,Web缓存可能还没有得到Web服务器执行的一批操作。
新旧程度偏差与副本最近一次的更新相关。对于某些应用,只要副本提供的数据不是很旧,都是可以容忍的,比如,天气预报通常会滞留一段时间。
更新操作顺序的偏差是指。只要可以界定副本之间的差异,就允许不同的副本采用不同的更新顺序。
3)顺序一致性(Sequential Consistency):任何执行结果都是相同的,就好像所有进程对数据存储的读写操作是按某种序列顺序执行的一样,并且每个进程的操作按照程度所制定的顺序出现在这个序列中,也就是说,任何读或者写操作的交叉都是可以接受的,当时所有进程都看到相同的操作交叉。
4)因果一致性(Casual Consistency):所有进程必须以相同的顺序看到具有潜在因果关系的写操作。不同机器上的进程可以以不同的顺序看到并发的写操作。相比顺序一致性,因果一致性去掉了那些没有联系的操作需达成一致顺序观点的要求,只保留了那些有因果关系的顺序。
5)顺序一致性(Entry Consistency):入口一致性其实也就是对每个共享的数据定义一个同步变量(锁)。当然,没有进行同步就进行读操作,是不能保证结果正确的。
1.2 以客户为中心的一致性
1)单调读一致性(Monotonic-read Consistency):当进程从一个地方读入数据x,那么以后再读到的x应该是和当前x相同或比当前更新的版本。也就是说,如果进程迁移到别的位置,那么对x的更新应该比进程先到达。
2)单调写一致性(Read-your-writes Consistency):如果一个进程写一个数据x,那么它在本地或迁移到别的地方再进行写操作的时候,原来的写操作必须先传播到那个位置,也就是说,进程要在任何地方至少和上次写一样新的数据。
3)读写一致性(Read-your-writes Consistency):读写一致性指一个进程对于数据x的写操作,进程无论到任何副本都应该能被后续读操作看到这个写操作的影响,也就是看到写操作的影响或更新的值。也就是说,写操作总是在同一个进程执行的后续读操作之前完成的,而不管这个后续读操作发生在什么位置。
4)写读一致性(Write-follow-reads Consistency):在读操作的后面的写操作基于至少上一次读出来一样新的值。也就是说,如果进程在地点1读了x,那么在地点2要写x的副本的话,至少写的时候应该基于和地点1读出的一样新的值。