Distributed_事务__共识(一致性)

事务__共识(一致性)

  1. 共识: 就是让所有的节点对一项提议达成一致

  2. 脑裂:在单主主从复制的数据库中,同时选举出两个主节点(即部分节点认为A节点为主节点,部分节点认为B节点为主节点)

定义:强一致性、弱一致性、最终一致性

在实际应用过程中,强一致性是不存在的,所以一般要求最终一致性保证。

1. 一致性模型:

一致性模型:当一个数据写入一个多副本的系统后,一致性模型决定了在什么时候可以看到这个写入值。

研究对象:多副本的分布式系统

一致性模型的类型:线性一致性(linearizability)、顺序一致性(Sequential Consistency)因果一致性(Causal consistency)、最终一致性(Eventual consistency)

  1. 线性一致性是CAP中的C,让一个系统看起来好像只有一个数据副本,且所有的操作都是原子的。

  2. 顺序一致性:

  3. 因果一致性是因果关系的依赖链条定义了系统中事件的因果关系,如果系统中所有节点服从因果关系所规定的顺序。

  4. 最终一致性: 不一致现象是暂时的,最终会达成一致(假设网络故障最终会被修复)。换言之,最终一致性意味着“收敛”,即预期所有的副本(但是不知道需要多长时间才能收敛)最终会收敛到相同的值。

  5. 一致性强弱:

    从强到弱:线性一致性(linearizability)、顺序一致性(Sequential Consistency)、因果一致性(Causal consistency)、最终一致性(Eventual consistency)

    从事件的顺序角度看:线性一致性、顺序一致性是全序,而因果一致性是偏序

2. 线性一致性

[外链图片转存失败,源站可能有防盗链机制,建议将图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传下来(img-qXQlVGrFSs9-1654825176126)(Distributed_事308务__共识()(Distributed_事务__共识(一致性)].assets/image-20220604114959911-16543146010491.png)

线性一致性包括:线性化写入(即多副本的系统中每个副本都是相同的但不强调何时相同)以及包括线性化读 取(即所有客户端都会读取到最新的值)
而顺序一致性模型则只是线性化写入不包括线性化读取。

2.1如何理解线性一致性?

在一个可线性化的系统中,一旦某个客户端成功提交写请求,所有客户端的读请求一定能够看到最近写入的值。

最近写入强调的是基于实际时间的先后顺序;所有客户端强调的是对任务客户端的表现是一致的。

假设:把分布式系统看成一个整体,满足线性一致性,每次操作都是原子的的事件流程

系统整体性:所有的操作都是依次执行的。

线性一致性:所有客户端都会看到最近的一次写入值。

操作原子性:可以把所有操作看成是一个独立的点,所有的操作都是原子的立即执行的。

如果不把请求看作是原子的,那么请求就有3个关键时间点:发起请求、处理请求、响应请求

2.2如何检验线性一致性?

如果分布式系统中的一组操作中一旦某个读操作返回了新值,之后所有的读(包括相同或不同的客户端)都返回新值,则该分布式系统满足线性一致性。

可串行化(Serializability)是事务的隔离属性,它用来确保事务执行的结果与串行执行(即每次执行一个事务)的结果完全相同,即使串行执行的顺序可能与事务实际执行顺序不同。

2.3什么情况下应该使用线性化呢?

对于有些场景,线性化对于保证系统正确工作至关重要。

  1. 主节点选举+加锁

    在单主复制的系统需要确保有且只有一个主节点,否则会产生脑裂。因此要求当某个节点认为A节点为主节点后,之后的所有节点都必须认为A是主节点即线性化的特性。(可线性化:所有节点都必须同意哪个节点持有锁,否则就会出现问题。

    选举新的主节点常见的方法是使用锁:即每个启动的节点都试图获取锁,其中只有一个节点可以获取锁对其他节点进行写操作即主节点。

  2. 唯一性约束

    唯一性约束,比如用户名和电子邮件地址必须唯一标识一个用户,文件存储服务中两个文件不能具有相同的路径和文件名。即写入这些数据时必须要强制执行这些约束,则也需要线性化(不能同时创建相同用户名和电子邮件地址等)

2.4如何实现可线性化的系统呢?

可线性化的本质意味着“多副本的分布式系统中表现得好像只有一个数据副本,且其上的所有操作都是原子的”。

  1. 最简单的方案自然是只用一个数据副本=>但是不具有容错性。

  2. 共识算法(可线性化):共识协议与主从复制相似,但是内置一些措施来放置脑裂和过期的副本。

3. 因果一致性

3.1 什么是因果一致性?

因果关系对所发生的事件施加了某种排序:1. 发送消息先于收到消息;2.问题出现在答案之前等;3.一件事情会导致另一个事情;4.一个节点根据读取的数据做出决定,然后写入结果,另一个节点读取写入结果之后再写入新的内容。如果系统中所有副本服从因果关系所规定的顺序,我们称之为因果一致性模型。

理解1:因果顺序并非全序

​ 全序的含义是任何两个元素之间进行比较,总能可以指出哪个更大,哪个更小.而因果顺序中可能有第三种可能即两个元素之间并发

两个事件的因果关系:

A发生在B之前(A依赖B);B发生在A之前(B依赖A);A和B并发(A和B之间没有依赖关系)

​ 线性化一致性模型中由于可以认为只有一个数据副本,那么是存在全序操作关系,即任意两个操作之间比较,只有两种结果即A发生在B之前、B发生在A之前。

在可线性数据存储中不存在并发操作,一定有一个时间线将所有操作都全序排序执行。

​ 因果一致性模型中操作关系不可以认为是全序关系而是偏序关系,因为任意两个操作之间可能存在因果关系也可以存在并发关系。

并发就意味着时间线会出现分支和合并,而不同分支上的操作无法直接比较。

理解2:可线性化强于因果一致性

可线性化一定意味着因果关系:任何可线性化的系统都将正确地保证因果关系。

​ 可线性化可以保证因果关系一致性,但是线性化会显著降低性能和可用性,尤其是在严重网络延迟的情况下。

​ 而因果一致性可以认为是:不会由于网络延迟而显著影响性能,又能对网络故障提供容错的最强的一致性模型。

3.2如何捕获因果依赖关系?

因果关系的具体含义:

​ 两个事件之间的因果关系,是偏序关系,对于非并发的事件,则由一个明确的先后发生顺序,对于并发事件,则按照任意任意顺序执行。但如果一个操作发生在另一个操作之前,那么每个副本都应该按照相同的顺序处理。因此当某个副本正在处理一个请求时,必须确保所有因果在前的请求都已经处理完毕,否则,后面的请求必须等候直到前序操作处理完毕。

因果一致性则要更进一步,它需要跟踪整个数据库请求的因果关系,而不仅仅是针对某个主键。

方法:

​ 为了确定因果关系,数据库需要知道应用程序读取的是哪个版本的数据。因此在先前读操作的版本号在提交时要传回到数据库中。

3.3 序列号排序

方法:

  1. 因果序列发生器:可以使用序列号或时间戳来排序事件。可以按照与因果关系一致的顺序来创建序列号:保证如果操作A发生在B之前,那么A一定在全序中出现在B之前(即A的序列号更小)。并行操作的序列可能是任意的。(此时存在一个主节点来对事件进行排序)

  2. 非因果序列发生器:如果不存在一个这样唯一的主节点如何产生序列号呢?

3.4 全序关系广播(顺序一致性的要求)

  1. 全序关系广播的定义:

​ 主从复制首先确定某一个节点作为主节点,然后主节点上顺序执行操作(主节点对操作进行排序)。=>如何扩展系统的吞吐量使之突破单一主节点的限制,以及如何处理主节点失效时的故障切换,这些问题称为全序关系广播或者原子广播

如果在分区系统中,全序关系不考虑跨分区的一致性保证,只考虑分区内的顺序。

  1. 全序关系广播要求满足两个安全属性:

​ 1.可靠发送:(没有消息丢失,如果消息发送到了某一个节点,则它一定要发送到所有节点。如果网络中断不可能发送成功时,但算法要不断尝试,直到最终网络修复);2.严格有序:(消息总是以相同的顺序发送给所有节点,且要求顺序是发生消息时已经确定了)。

状态机复制:

如果每条消息代表数据库写请求,并且每个副本都按照相同的顺序处理这些写请求,那么所有副本都保持一致。

以上的描述则认为全序关系广播可以保证各个副本之间的状态是一致的。

  1. 全序关系广播和线性化存储的关系

    线性化存储是全序关系广播更强的约束,如果有了全序关系广播,就可以在其上构建线性化的存储系统。

    全序关系广播:保证了消息是按照固定的顺序可靠的传输,但是不保证消息何时成功

    线性化存储:强调了就近性,要求读取时总是读取到最新的值。

本文是根据阅读《数据密集型应用系统设计》和查阅相关论文等而写成。

猜你喜欢

转载自blog.csdn.net/Blockchain210/article/details/125215732