分布式应用:从CAP理论到PACELC理论

在这里插入图片描述

1、CAP理论简介

CAP是分布式应用的基础理论,讨论的是分布式如何满足一致性、可用性、网络分区的问题。
C(Consistency):一致性,要求所有节点同一时刻保持数据一致。
A(Availability):可用性,要求应用在某些节点发生异常时,应用本身是可用的。
P(Partition Tolerance):网络分区容错,分布式应用会有多个节点,节点之间需要进行网络通信,有可能发生网络中断或超时。

2、CAP可以三选二?

CAP理论最大的误解就是三个因素是同等地位的,其实不然,分布式系统下,P(网络分区)是必然的,所以只能在AP之间权衡,所以,实际应用中,大多是支持CP或AP。CP追求一致性,牺牲了可用性,如zk。AP追求可用性,牺牲了一致性,比如主从复制。
为什么P是必选的?因为要保证高可用性必然会进行冗余,单机应用也谈不上A和P,冗余就会带来分区的问题,所以P是必然存在的,不能通过牺牲A或C换取P。

3、强一致性存在吗?

3.1节点通信需要时间

我们常说的CP是追求强一致性,可是强一致性真的存在吗?只要有P(网络分区)就会有节点之间的通信,假设节点之间通信正常,那么通信就需要时间。虽然计算机世界处理速度都是毫秒或微秒或纳秒级的,但处理再快这个时间也是个非0数字。

3.2唯一不变的是变化

信息世界一直在变化,即便此刻通信正常,下一刻就可能发生变化。比如消费者从CP注册中心获取到服务提供者可用列表,经过负载选出来一个地址发起调用。这时依然存在这个地址对应的节点已经挂掉的可能。所以,此刻看到的信息可能是下一刻过时的信息。

4、PACELC理论

根据上面的讨论,其实完全的强一致性是不存在的,也就是节点之间同步会存在延迟,所以有了PACELC理论。PAC还是上述的CAP,E是else,L是latency延迟,C还是Consistency。简单理解就是当发生网络分区异常时,需要在A和C之间做权衡,当没有出现网络分区异常时,需要在L和C之间做权衡。
在这里插入图片描述

5、典型案例

5.1 mysql主从复制

mysql主从复制带来了高可用,但即使在网络通信正常的情况下,主从同步还是存在延迟,所以此时就需要权衡是否可以接受延迟,如果不接受可以直接去读主库。当然,主从同步发生异常时,并不影响从库数据的读取,即从库是可用的。
5.2 zk分布式锁

使用zk的临时节点可以实现分布式锁,zk和客户端通过heartbeat保持live连接,如连接失效,则自动删除临时节点从而释放锁。但是这个连接保持就存在很多情况,如果因为网络超时或应用假死,那么就会存在两个进程获取到锁,导致分布式锁失效,redis分布式锁也存在类似的问题,所以使用分布式锁一定要小心。

小记:

在构建分布式应用时应该全局着眼,细节着手。通常在满足AP的条件下,根据实际情况做好C的把控,才能构建出鲁棒的应用。

猜你喜欢

转载自blog.csdn.net/weixin_43275277/article/details/127860052