分布式系统一致性模型:线性一致性和顺序一致性

一、分布式一致性模型基础

什么是分布式系统中的一致性?

分布式系统中的一致性(Consistency)是指:数据副本存放在分布式系统中的不同节点上,如果用户修改了系统中的数据,则在一定时间后,用户能从系统中读取到修改后的数据。

一致性模型的种类有哪些?

  • 强一致性:保证每个进程的读操作都返回最近的写操作的结果。该模型包含:线性一致性模型(Linearizability)和顺序一致性模型(Sequential Consistency)等。
  • 弱一致性:允许在一定程度上不同时间点内不同进程看到不同的结果。该模型包含:因果一致性模型(Causal Consistency)等
  • 最终一致性:保证进程之间经过一段时间最终状态一致。

二、强一致性模型

线性一致性(Linearizability)

如果一致性不存在会发生什么?

假如老板要给你涨工资,要通知到公司下的各个相关部门,邮件发给了研发中心,但是没发给职能中心(财政部门和行政部门)。你去研发中心听到你的工资已经涨了,但是在职能中心查到还是原来的工资,这就导致了一致性问题。如果邮件保证发给所有部门就可以了吗?如果邮件在发给职能中心的时候网络出现了延迟,导致一段时间内没收到邮件,恰巧你在这段时间内去职能中心问工资,结果还是没涨还是会有一致性的问题的?那如何解决呢?那就引出了线性一致性。

什么是线性一致性?

一个进程对共享变量的修改后其他进程所有读操作必须为共享变量的最新的值。在读取操作之后的任意读取操作都应返回相同的结果,直到下一次写入成功
上述的例子解释就是,当研发中心收到邮件时,那么职能中心读到的结果一定和研发中心一致,直到他们收到下一个相关的邮件,作为员工(observer)不用关心两个部门(client)是否分别接收的邮件(copy),也就是在全局上看两个部门像是读到的是同一个邮件(single copy)。

– Should provide the behavior of a single copy
– A read operation returns the most recent write, regardless of the clients.
– All subsequent read ops should return the same result until the next write, regardless of the clients.

线性一致性需要满足的约束:

  1. 所有进程看到的操作,都要与全局时钟中的顺序一致(如果事件A的开始时间晚于事件B的结束时间,则在全局时钟中,B在A之前)

  2. 在调用和响应之间的任意时间,每个操作都会被立即执行(瞬间执行、原子执行)

  3. 任何一次读都能读到某个数据的最近一次写的数据,后续的读操作必须和上一次读操作结果一致,直到下次写操作。

例如下图:
在这里插入图片描述

上图严格按照时间顺序进行,即:A1->C1->A2->C2

但是线性一致性并没有对并发进行限制!如下图:
在这里插入图片描述
在进程A的A1操作开始之后完成之前,进程B的B1操作开始了,这个时候A1和B1是并发执行的,那么A1的结果是0或者是1都不会违反线性一致性的约束。

为什么A1可能读到1也可能读到0?

对于B1的写操作,不确定在该操作中的那一时刻进行了同步,如下图:

A1.n是A1操作中的一个从内存中读的操作。
B1.n是B1操作中的将缓存中的x=1写入共享内存的操作(同步操作)。
如果A1.n发生在B1.n之前,A1读的则是0,否则则是1。
在这里插入图片描述

当出现并发问题时怎么解决?最简单的方案就是加锁。

例如:在Raft算法中leader负责接收客户端的写请求,接受请求的操作时在主线程中进行的,解决并发写的问题。

线性一致性代表:一个进程对数据写入操作之后是需要同步复制到其他线程的副本中的,即多个副本都写入成功则成功对于写入操作要么成功要么失败具有原子性。 对于线性一致性更关注的是服务器(server)完成操作的在全局时钟上的时间,而不是操作的发起时间。

优点:

一致性效果好、实时性高。

缺点:

由于全局时钟和同步复制的存在,实现复杂,性能不佳。

轮子:

Paxos算法、Raft算法等

顺序一致性(Sequence Consistency)

在线性一致性中遇到的问题

在线性一致性中发现如果想要严格的做到线性一致性是比较复杂的(要考虑全局时钟下的并发问题),那我们可以退一步取消全局时钟,不保证各进程之间在全局事件的绝对顺序,只保证各个进程在全局事件的顺序。那就引出了顺序一致性。

什么是顺序一致性?

线性一致性是顺序一致性的plus版本
线性一致性:更关注全局时间下的执行顺序(多个进程之间各个操作的执行顺序);
顺序一致性:更关注单个进程的执行顺序,即:对于顺序一致性,任何执行的结果与所有处理器的操作以某种顺序执行的结果相同,并且每个处理器的操作按照其程序指定的顺序出现在这个序列中。

在顺序一致性下,一个进程对共享变量的修改不一定会被其他进程立刻感知(同步),但不同进程对共享变量的写入必须以相同的顺序被所有进程看到。

比如在上述线性一致性中的一个例子:
如在线性一致性中的例子,由于有全局时钟的存在顺序必须是A1->C1->A2->C2

但是顺序一致性只关注单个进程在全局顺序中的顺序,也就是只要A1->A2 & C1->C2即可,得到的全局历史可以是A1->A2->C1->C2, 也可以是A1->C1->A2->C2等等。

不符合顺序一致性的例子

在这里插入图片描述

对于进程C:

在C1操作要想读到x=2,需要B1->C1 ;

在C2操作要想读到x=1,需要A1->C2 ;

(看作要想保证C进程顺序正确必须B1->A1)

对于进程D:

在D1操作要想读到x=1,需要A1->D1;

在D2操作要想读到x=2,需要B1->D2;

(看作要想保证D进程顺序正确必须A1->B1, 与C进程的顺序互斥)

无法找到一个既能保证C1->C2 & D1->D2 & 符合上述条件的一个全局事件,所以不符合顺序一致性。也就是说进程A/B对共享变量x的修改,不会被其他进程(除A以外的进程、除B以外的进程)立刻感知同步,但是对于C和D进程来说看到的写入顺序必须是一直的(A1->B1或B1->A1)

优点:

实现相对线性一致性简单,性能比线性一致性好

缺点:

可能存在一定的延迟

轮子:

ZAB算法(zk:写是线性一致性、读写是顺序一致性)

线性一致性与顺序一致性对比

相同点:

都是强一致性模型,拥有强一致模型的优点和缺点。

不同点:

线性一致性强调不同进程之间的实时性(全局时钟),不同进程在全局事件上在全局时钟上的顺序。修改是实时性的,一个进程修改共享变量之后会被其他进程立刻持续感知,直到下一个进程的写操作;

顺序一致性,取消了全局时钟的限制,只关注当前进程在全局事件上的顺序。修改是顺序性的,一个进程修改共享变量之后不会被其他进程立刻感知,会存在一定的延迟。

顺序一致性和最终一致性对比

相同点: 都不关注实时性,存在一定程度的延迟

不同点: 顺序一致性关注每个进程(CPU)的顺序,而最终一致性只关注最终结果,可以理解为顺序一致性会禁止每个进程的每个操作的指令重排序,最终一致性允许重排

例如:
在这里插入图片描述
那么对于顺序一致性只能是B1->C1->C2,对于最终一致性可以是B1->C2->C1

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
线性一致性顺序一致性分布式系统中常见的两种一致性模型,它们都是为了解决数据一致性问题而设计的。以下是关于这两个概念的更详细的解释。 线性一致性 线性一致性是指,如果在分布式系统中进行一系列操作,那么对于任何一个观察者来说,这些操作的结果都应该是按照一定的顺序进行的。也就是说,任何一个观察者都应该看到所有的操作都是按照一定的顺序执行的,而不会出现操作之间的交错或者重叠。这种一致性模型可以确保数据在所有节点上都是完全一致的。 例如,假设有一个分布式系统,其中包含两个节点A和B,它们都存储着同一个数据对象X。现在有两个客户端同时向节点A和B发送写入请求,这些请求会修改数据对象X。根据线性一致性的定义,这些写入请求必须按照某种顺序进行,以便所有的客户端都能够看到它们的结果,并且这些结果应该是一致的。因此,节点A和B必须按照某种顺序处理这些请求,以便所有的客户端都能够看到它们的结果,并且这些结果应该是一致的。 线性一致性是最强的一致性模型,它可以确保数据在所有节点上都是完全一致的。但是,由于需要保证操作的顺序,因此会对系统的性能和可扩展性产生一定的影响。 顺序一致性 顺序一致性是指,如果在分布式系统中进行一系列操作,那么对于任何一个观察者来说,这些操作的结果都应该是按照某种顺序执行的。也就是说,任何一个观察者都应该看到所有的操作都是按照某种顺序执行的,但是不要求所有的观察者都能够看到相同的顺序。这种一致性模型可以确保数据在不同节点上是弱一致的。 例如,假设有一个分布式系统,其中包含两个节点A和B,它们都存储着同一个数据对象X。现在有两个客户端同时向节点A和B发送写入请求,这些请求会修改数据对象X。根据顺序一致性的定义,这些写入请求必须按照某种顺序进行,以便所有的客户端都能够看到它们的结果,并且这些结果应该是弱一致的。也就是说,不同的客户端可能看到不同的操作顺序,但是最终的结果是一致的。 顺序一致性是一种比较常见的一致性模型,它可以在保证一定一致性的同时,提高系统的性能和可扩展性。但是,由于不要求所有的观察者都能够看到相同的顺序,因此可能会出现数据在不同节点上的不一致。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值