以客户为中心的一致性模型
以客户为中心的一致性也就是从用户视角来看,数据是一致的。用户只关心数据最终是否会一致。
只要保证对于同一个用户,他访问到的数据是一致的就可以了。如果用户只是访问一个副本,这个就很好实现,否则就需要一定的策略了。当没有更多的更新时,要保证当前的更新最终会传播到所有副本上。著名的例子有DNS系统、万维网。
最终一致性需要注意一个典型的问题,即当客户访问不同的副本时,问题就出现了。更具体的例子比如,作者在博客上更改了一篇博文内容,在A地的用户先访问到最新的内容,而B地由于离博客服务器远,看到的还是原先的内容。
对于最终一致性的数据存储而言,这个示例很有代表性。问题是由用户有时可能对不同的副本进行操作的事实引起的。以客户为中心的一致性分为如下几大类。
单调读一致性
当进程从一个地方读出数据x,那么以后再读到的x应该是和当前x相同或比当前更新的版本。也就是说,如果进程迁移到了别的位置,那么对x的更新应该比进程先到达。
以分布式邮件数据库系统为例。每个用户的邮箱可能分布式地复制在多台机器上。邮件可能被插入任何一个位置的邮箱。但是,数据更新是以一种懒惰的方式传播的。假设用户在杭州读取到了他的邮件(假定只读取邮件不会影响其他邮箱,也就是说,消息不会被删除,甚至不会被标记为已读),当用户飞到惠州后,再次打开他的邮箱时,单调读一致性(Monotonic-read Consistency)可以保证当他在惠州打开他的邮箱时,邮箱中仍然有杭州邮箱里的那些消息。
单调写一致性
跟单调读相应,如果一个进程写一个数据x,那么它在本地或者迁移到别的地方再进行写操作的时候,原来的写操作必须先传播到这个位置。也就是说,进程要在任何地方至少和上一次写一样新的数据。
读写一致性
读写一致性(Read-your-writes Consistency)指一个进程对于数据x的写操作,进程无论到任何副本上,都应该能被后续读操作看到这个写操作的影响,也就是看到自己写操作的影响或者更新的值。
也就是说,写操作总是在同一个进程执行的后续读操作之前完成,而不管这个后续读操作发生在什么位置。
写读一致性
顾名思义,写读一致性(Writes-follow-reads Consistency)指在读操作后面的写操作是基于至少和上一次读出来一样新的值。也就是说,如果进程在地点1读了x,那么在地点2要写x的副本的话,写的时候应该是基于至少和地点1读出的一样新的值。
举个例子,用户先读了文章A,然后他回复了一篇文章B。为了满足读写一致性,B被写入任何副本之前,需要保证A也必须已经被写入那个副本。即,当原文章存储在某个本地副本上时,该文章的回复文章才能被存储到这个本地副本上。
本章小结
本章介绍了分布式系统中的数据一致性问题及分类,同时介绍了CAP理论对于解决数据一致性问题的指导意义。