不同情境下的一致性语义所表示的不同含义

基础

1 线性一致性:什么是线性一致性?
2 如何理解数据库事务中的一致性的概念?
3 微信一面:什么是一致性哈希?适用什么场景?
4 分布式一致性之两阶段提交协议、三阶提交协议
5 分布式事务?No, 最终一致性

其次,说道一致性,很遗憾,这个词在不同的环境下有着不同的含义,被极大的滥用了,导致很难理解:

这些一致性概念在不同的上下文中有不同的含义:

  1. 多副本的一致性:这是分布式系统中的一个概念,主要关注的是如何保持数据副本之间的一致性。在有多个副本的分布式系统中,当某个数据项在一个副本上发生更改时,这个更改需要被复制到所有其他副本上,以保证所有副本的一致性。实现多副本一致性的策略有很多,包括强一致性(所有副本在同一时间点上始终一致)、弱一致性(副本之间允许有一定的不一致,但最终会达到一致)、最终一致性(允许短暂的不一致,但保证在没有新的更新操作后,最终所有的副本会达到一致)等。

  2. 一致性哈希:这并不是一种数据一致性的概念,而是一种哈希算法。一致性哈希被设计出来解决分布式系统中的数据分布问题。它能够在节点数量改变时,尽量减少需要重新分配的数据数量。这使得系统可以在节点增加或减少时保持较好的性能和平衡性。

  3. CAP理论的一致性(也被称为线性一致性)CAP理论的一致性是指分布式系统在接收到一个新的写入请求后,随后的读请求必须能够读到这个新的值。在CAP理论中,一致性是和可用性、分区容忍性这两个属性相对立的。在分布式系统中,你只能在一致性、可用性和分区容忍性中选择两个。

  4. ACID里的一致性:在ACID模型中,一致性指的是数据库在执行事务后必须保持其一致性约束(这里的一致性约束的一部分由业务规定和提供)。也就是说,一个事务应该将数据库从一种一致状态转移到另一种一致状态。如果这个事务不能完成,那么它应该被完全回滚,好像它从未执行过一样。

  5. 分布式事务里的一致性:在分布式事务中,一致性主要关注的是如何在分布式环境下保持全局的数据一致性。在分布式事务中,一个操作可能会涉及到多个节点上的数据,这就需要有一种机制来保证这些操作要么全部成功,要么全部失败,以此来保持全局的一致性。实现分布式事务一致性的协议有很多,包括二阶段提交(2PC)、三阶段提交(3PC)、Paxos、Raft等。

这些一致性的概念在它们各自的上下文中有着明确的含义和用途,虽然它们都是在尽力解决数据一致性这个问题,但是实现方式和关注点各有不同。

现实中作为分布式数据库的mysql能保证线性一致性吗

MySQL作为分布式数据库的线性一致性:MySQL作为一个分布式数据库,其默认的一致性模型并不是线性一致性。MySQL提供了多种复制策略,包括同步复制和异步复制。在同步复制中,主节点在提交事务前,会等待所有从节点也都写入了这个事务,这样就可以实现严格的一致性,但性能开销较大。在异步复制中,主节点提交事务后,就会把事务事件发送给从节点,而不等待从节点的响应,这样可以获得更好的性能,但可能会出现一致性问题。一般来说,我们可以通过调整复制策略、使用分布式事务协议,或者使用一致性协议(如Paxos、Raft等)来尽量接近线性一致性,但往往需要在一致性和性能之间做出权衡。

MySQL在网络分区或节点故障的情况下的处理:

当MySQL的某个节点出现故障,或者网络出现分区时,MySQL的行为会取决于其配置和复制策略。在主从复制模式中,如果主节点出现故障,可以通过手动或自动的故障转移机制,将一个从节点提升为新的主节点。然后,其他从节点需要重新连接到新的主节点,以继续复制。但在故障转移期间,可能会出现服务不可用或者数据丢失的问题。在网络分区的情况下,如果一个从节点与主节点断开连接,那么这个从节点将无法接收到新的更新,数据可能会陈旧。但是,如果主节点可以与足够多的从节点保持联系,那么服务仍然可以继续,只是一部分从节点的数据可能会落后。这也是CAP理论的一个体现:在网络分区的情况下,需要在一致性和可用性之间做出选择。

多副本的一致性可以采用不同的一致性策略,包括线性一致性对吗?

是的,多副本一致性(Replica Consistency)可以采取不同的一致性策略,包括但不限于线性一致性(Linearizability)。多副本一致性主要关注的是一个系统中的各个副本之间如何保持一致,其可以按照多种一致性模型来设计和实现。

线性一致性是一种强一致性模型,要求所有的操作都必须在全局的一个唯一的顺序下执行,并且一旦一个操作完成,所有的后续操作都必须看到这个操作的结果。线性一致性可以保证在任何时刻,所有的副本都是一致的,但这种一致性级别的要求往往会带来较大的性能开销。

除了线性一致性之外,还有其他的一致性模型可以应用于多副本一致性,比如:

  1. 事件一致性(Eventual Consistency):这是一种较弱的一致性模型,允许在短时间内副本之间存在不一致,但保证在没有新的更新操作之后,所有的副本最终会达到一致状态。

  2. 因果一致性(Causal Consistency):在这个模型中,如果两个操作之间存在因果关系,那么系统会保证这两个操作在所有副本上按照因果顺序执行。不相关的操作则可能被并行执行。

  3. 顺序一致性(Sequential Consistency):在这个模型中,系统会保证所有的操作在所有副本上按照某一个一致的顺序执行,但不保证这个顺序与实际的时间顺序相同。

  4. 读写一致性(Read-Your-Writes Consistency):在这个模型中,系统会保证一个客户端读取到的数据总是包含了这个客户端之前的写入。

各种一致性模型在设计和实现时,都需要在一致性、性能和可用性之间做出不同的权衡。

它这些一致性模型按照一致性的强度可以划分为强一致性、弱一致性和最终一致性。

线性一致性的语义

从 client 端角度来看,线性一致性的系统需要如下约束:

(1)单个 client Op 都是顺序的:如上图 9-2 [1] 每个 client 的每个 Op 都是在上一个 Op 返回之后,在执行下一个 Op,也就是同一个 client 的 Op 都是顺序的,没有并发
(2)不同 client 的 Op 如果并发,则可能会返回旧值或新值:如上图 9-2,client B 的第一个 read 和 client C 的第1 个 write 是并发,那么 client B 有可能读到 read 0 或者 1 都是合法,因为它们是并发的,考虑到网络延迟,可能 read 先被执行,也可能 write 先被执行,或者相反(但是这条约束不足以完全描述线性一致性:如果与写入同时发生的读取可以返回旧值或新值,那么读者可能会在写入期间看到数值在旧值和新值之间来回翻转,如果 client B 的第1个 read 返回 0,第 2 个 read 返回 1,那么就出现新旧值的翻转了)
(3)任何一个读取返回新值后,所有后续读取(在相同或其他客户端上)也必须返回新值:如下图 9-3 [1] 所示,client A 第 2 个 read、 client B 的第 1、2 个 read 和 client C 的第 1 个 write 是并发的,但是一旦 client A 的第 2 个 read 看到了这个最新值,那么 client B 的第 2 个 read 也必须看到这个最新的值

猜你喜欢

转载自blog.csdn.net/yxg520s/article/details/132063773