分布式系统-什么是一致性模型
在分布式系统中,C(一致性) 和 A(可用性)始终存在矛盾。若想保证可用性,就必须通过复制、分片等方式冗余存储。而一旦进行复制,又来带多副本数据一致性的问题——一个副本的数据更新之后,其他副本必须要保持同步,否则数据不一致就可能导致业务出现问题。
因此,每次更新数据对所有副本进行修改的时间以及方式决定了复制代价的大小。全局同步与性能实际上是矛盾的,而为了提高性能,往往会采用放宽一致性要求的方法。因此,我们需要用一致性模型来理解和推理在分布式系统中数据复制需要考虑的问题和基本假设。
那么什么是一致性模型呢?
一致性模型本质上是进程与数据存储的约定:如果进程遵循某些规则,那么进程对数据的读写操作都是可预期的。
下图即为 Jepsen 概括的常见的一致性模型:
不可用(Unavailable):粉色代表网络分区后完全不可用。当出现网络隔离等问题的时候,为了保证数据的一致性,不提供服务。熟悉 CAP 理论的同学应该清楚,这就是典型的 CP 系统了。
严格可用 (Sticky Available):黄色代表严格可用。即使一些节点出现问题,在一些还没出现故障的节点,仍然保证可用,但需要保证 client 的操作是一致的。
完全可用(Highly Available):蓝色代表完全可用。就是网络全挂掉,在没有出现问题的节点上面,仍然可用。
一致性模型主要可以分为两类:能够保证所有进程对数据的读写顺序都保持一致的一致性模型称为强一致性模型,而不能保证的一致性模型称为弱一致性模型。
强一致性模型
强一致性包含线性一致性和顺序一致性,其中前者对安全性的约束更强,也是分布式系统中能保证的最好的一致性。
线性一致性(Linearizable Consistency)
线性一致性是最严格的且可实现的单对象单操作一致性模型。在这种模型下,写入的值在调用和完成之间的某个时间点可以被其他节点读取出来。且所有节点读到数据都是原子的,即不会读到数据转换的过程和中间未完成的状态。
要想达到线性一致,需要满足以下条件:
任何一次读都能读取到某个数据最近的一次写的数据。
所有进程看到的操作顺序都跟全局时钟下的顺序一致。
所有进程都按照全局时钟的时间戳来区分事件的先后,那么必然所有进程看到的数据读写操作顺序一定是一样的
我们发现,这个要求十分苛刻,难以在现实中实现。因为各种物理限制使分布式数据不可能一瞬间去同步这种变化。(通信是必然有延迟的,一旦有延迟,时钟的同步就没法做到一致。)
顺序一致性(Sequential Consistency)
由于线性一致的代价高昂,因此人们想到,既然全局时钟导致严格一致性很难实现,那么我们能否放弃了全局时钟的约束,改为分布式逻辑时钟实现呢?
Lamport 在 1979 年就提出的顺序一致性正是基于上述原理。顺序一致性中所有的进程以相同的顺序看到所有的修改。读操作未必能及时得到此前其他进程对同一数据的写更新,但是每个进程读到的该数据的不同值的顺序是一致的。
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 如遇到加密压缩包,请使用WINRAR解压,如遇到无法解压的请联系管理员!
7. 本站有不少源码未能详细测试(解密),不能分辨部分源码是病毒还是误报,所以没有进行任何修改,大家使用前请进行甄别!
66源码网 » 分布式系统-什么是一致性模型