分布式环境下的各种问题

通信异常

网络不可用风险高,消息丢失、消息延迟非常普遍

网络分区(脑裂)

  网络发生异常情况,延迟增加,导致所有组成分布式系统的节点中,只有部分节点之间能够正常通信,而另一些节点则不能,我们将这一现象成为网络分区,即俗称的脑裂。这对分布式一致性提出了非常大的挑战。

三态

成功、失败、超时

超时

1、由于网络原因,请求没有被成功的发送到接收方,而是在发送过程中就发生了消息丢失。

2、请求成功被接收方接收、处理,但相应反馈给接收方过程中,发生了消息丢失现象。

节点故障

某个节点宕机

CAP定理

CAP理论告诉我们,一个分布式系统不可呢同时满足一致性(C:Consistency)、可用性(A:Availability)和分区容错性(P:Partition tolerance)这三个基本需求,最多只能满足其中的两项。

C (一致性):在分布式系统中的所有数据备份,在同一时刻是否同样的值(等同于所有节点访问同一份最新的数据副本)。在分布式系统中,如果能够做到针对一个数据项的更新操作执行成功后,所有用户都可以读取到其最新的值,那么这样的系统就被认为具有强一致性(或严格的一致性)。

A (可用性):可用性是指系统提供的服务必须一致处于可用的状态,对于用户的每一个操作请求总是能在有限的时间内返回结果。在集群中一部分节点故障后,集群整体是否还能响应客户端的读写请求。(对数据更新具备高可用性)

P(分区容错性):分布式系统在遇到任何网络故障的时候,仍然需要能够保证对外提供服务,除非是整个网络环境都发生了故障。(以实际效果而言,分区相当于对通信的时限要求。系统如果不能在时限内达成数据一致性,就意味着发生了分区的情况,必须就当前操作在 C 和 A 之间做出选择。)

个人理解

  在出现网络分区的情况下,A和C是矛盾的,无法全部满足(因为要保证P就需要多做备份节点,但多做备份节点的场景下想要保证C一致性就需要每次等着多个备份节点更新完这样就花时间多响应慢,这样就不满足A可用性,而想要保证A可用性就没时间更新多个备份节点,我感觉就是这个意思~),而分布式系统又一定会出现网络分区,所以只能权衡A和C。

分别拥有 CA、CP 和 AP 的情况

CA without P:如果不要求 P(不允许分区),则 C(强一致性)和A(可用性)是可以保证的。但其实分区不是你想不想的问题,而是始终会存在(除非把数据放到一个节点上,那不就不是分布式系统了,因此分区容错性是一个分布式系统最基本的需求),因此 CA 的系统更多的是允许分区后各子系统依然保持 CA 。

CP without A:如果不要求 A(可用),相当于每个请求都需要在 Server 之间强一致,而 P(分区)会导致同步时间无限延长,如此 CP 也是可以保证的。很多传统的数据库分布式事务都属于这种模式。

AP wihtout C:要高可用并允许分区,则需放弃一致性。一旦分区发生,节点之间可能会失去联系,为了高可用,每个节点只能用本地数据提供服务,而这样会导致全局数据的不一致性。现在众多的NoSQL都属于此类。

BASE 理论

BASE 理论核心思想是,即使无法做到强一致性,但每个应用都可以根据自身的业务特点,采用适当的方式来使系统达到最终一致性

BASE 是 Basically Available(基本可用)、Soft state(软状态)和 Eventually consistent (最终一致性) 三个短语的缩写。是对 CAP 中AP 的一个扩展

BASE 是 Basically Available(基本可用)、Soft state(软状态)和 Eventually consistent (最终一致性) 三个短语的缩写。是对 CAP 中AP 的一个扩展

BA 基本可用:分布式系统在出现故障时,允许损失部分可用功能,保证核心功能可用。

S 软状态允许系统中存在中间状态,这个状态不影响系统可用性,这里指的是 CAP 中的不一致,即允许系统在不同节点的数据副本之间进行数据同步的过程存在延时。

E 最终一致:最终一致是指经过一段时间后,所有节点数据最终能够达到一致的状态,而不需要实时保证系统数据的强一致性(可以通过最大化重试/主动查询达到)。

BASE 和 ACID 是相反的,它完全不同于 ACID 的强一致性模型,而是通过牺牲强一致性来获得可用性,并允许数据在一段时间内是不一致的,但最终达到一致状态。

市面上的分布式事务的解决方案,除了 XA 协议是强一致的,其他都是最终一致的。

05-25 13:57