分布式理论基础
今天我们来聊一下分布式相关基础理论基础,上一篇文章中,我描述了一下分布式系统的纲,但是想要入手学习分布式系统设计,其实需要先从基本理论开始。而知名的ACID、BASE、CAP、FLP都是相关的理论基础。
ACID
ACID对于了解关系型数据库的开发者来说应该是不陌生的。具体如下
- 原子性(Atomicity):整个事务操作过程中,要么是整体成功的,要么是整体失败的,不可能出现一半成功一半失败。如果出现异常的话,那么需要进行回滚到最原始的状态。举一个例子来说,比如我们在一个大事物中同时操作了订单和支付的表,那么当出现异常的情况,比如说三方异常或者是内部系统错误,事务会进行回滚到原始的状态。
- 一致性(Consistency): 在事务执行的前后,数据的完整性约束没有破坏。
- 隔离性(Isolation): 两个事务之间不会互相干扰,即一个事务A不会看到另一个事务B的中间数据。
- 持久性(Durability): 当事务完成之后,数据会被持久化到磁盘中,并且出现机器宕机等可以进行数据的恢复。
ACID的目的其实是为了保证数据的一致性,但是这种一致性是强一致性,在单机系统下可以很好的实现,但是放在分布式系统中,我们很难去权衡系统之间可用和数据的强一致性。而分布式事务需要通过二阶段提交协议和TCC(Try-Confirm-Cancel)实现。
CAP
- 一致性 (Consistency)
- 可用性 (Availability)
- 分区容错性 (Partition Tolerance)
CAP的三大限定条件
- 分布式:分布式可能发生网络分区
- 数据存储:通过数据复制来实现数据存储的系统,比如Redis、ZK、Kafka等
- 同时满足:CAP
一致性
一致性强调的是不管任何时刻,在任何节点上查看的数据都是一样的。强调的是各节点间的数据一致
比如有两个节点1和2,分别设置x=1
接着客户端将节点1 设置 x=2
节点1在接受到请求后,将x设置为2,然后返回success
如果节点1在将x设置为2的时候,通过同步或者异步的方式 也将节点2 x设置为2,那么当返回给客户端成功的时候,客户端不管查询节点1还是节点2的值都是2,那么就是数据一致性,否则就是数据不一致。
可用性
上面说了一致性,但是在分布式中,可能出现各种不可控因素,硬件层面、软件层面、人为层面、地理级别的故障等。那么是无法保证数据之间的一致性,这个时候就需要从另一个层面进行评估即可用性。
可用性描述的是不管出现任何问题,可以保证客户端的访问 可以返回结果,但是数据的一致性没有办法保证,即上述中可能出现节点2没有返回x的最新值,但是系统是可用的。
分区容错性
因为在分布式系统中,网络通讯是不可靠的,可能出现消息丢失或者系统故障等,都会对外提供服务,强调的是集群对分区故障的容错能力。
总结一下 CAP 关注的粒度是数据,而不是整个系统。大多数人认为CAP关注的是系统级别,其实并不是。
CAP不可能三角
在分布式环境下,网络是不可靠的,因此P 分区容错性是必须考虑的,如果我们选择CA,即当出现分区情况时,我们为了保证C那么就需要禁止写入数据,这与A相冲突,因为A要返回 no timeout和no error。所以只能选择CP和AP。
CP
为了保证数据一致性,当网络N1到N2的复制通道中断,N1将数据更新到了Y而N2没有将数据更新到Y而停留在X,所以当客户端访问N2的时候,为了保证数据的一致性,N2会返回系统错误。
AP
而与上述相反的时,N2的值是X的时候 访问N2阶段,AP下,会将X返回,并不会提示系统错误。
BASE
而在CAP中,因为没有办法满足三者,所以有一个变种,那就是BASE
- Basic Availability:基本可用。这意味着,系统可以出现暂时不可用的状态,而后面会快速恢复。
- Soft-state:软状态。它是我们前面的“有状态”和“无状态”的服务的一种中间状态。也就是说,为了提高性能,我们可以让服务暂时保存一些状态或数据,这些状态和数据不是强一致性的。
- Eventual Consistency:最终一致性,系统在一个短暂的时间段内是不一致的,但最终整个系统看到的数据是一致的。
我们知道在分布式系统中不同的业务其实并不需要完全的数据一致性,大对数场景中,我们必须保证的是核心链路的稳定性、可用性,所以BASE其实就是CAP的一个变种。倾向于设计出一个更富有弹性能力的系统。
在分布式系统中故障是不可避免的,当出现分区或者故障的时候,我们应该在设计层面多去考虑可能出现的问题,把故障处理当成功能写入代码中,即Design for Failure。新手与老手的差别就是新手可能会完整基本功能就可以了,但是老手会考虑很多边界问题,不和合法性以及可能出现的各种异常问题。
举一个例子:比如买书,ACID的玩法是将库存锁住,不可能同时多个用户购买,而BASE的玩法是异步处理,可以支持用户抢购。
ACID是酸、BASE是碱,从本质上来说ACID的C强调的是一致性(CAP中C),而BASE强调的是可用性(CAP中A)
关注点也不一样:ACID关注的是数据的完整性,而CAP的C关注的是分布式节点的数据一致性。
如何选择
FLP
很多人知道CAP、ACID、BASE 但是却不了解FLP,这里为了文章的完整性,介绍一下
FLP是分布式领域中非常著名的定理,在异步通讯场景中,即使只有一个进程失败,也没有任何算法能保证非失败进程达到一致性。
限定条件
- 确定性协议:给定一个输入,一定会产生相同的输出。
- 异步网络通讯:同步通信:同时在线,允许超时,异步通信,没有统一时钟,不能时间同步,不能使用超时,消息可任意延时,乱序。
- 所有存活节点:所有存活的节点必须最终到达一致性。
小结
本篇 介绍了ACID、CAP、BASE、FLP,ACID 是数据库事务完整性的理论,CAP 是分布式系统设计理论,BASE 是 CAP 理论中 AP 方案的延伸,所以,在软件工程中没有银弹,需要我们结合自身业务去考虑。以下列了相关的系统比如
CA:MySQL
CP:ZK、Redis、HBase
AP:Eureka等
推荐阅读
分布式系统的冰与火
架构演进方案