什么是分布式系统
分布式系统是相对于单机系统或者集中式系统的概念。单机系统比较好理解,即所有服务都在一台主机上;关于集中式系统,通常指由一台性能超强的大型计算机构成的中心节点,数据集中存储在中心节点上,并且整个系统的业务单元和业务逻辑也集中在中心节点上进行处理;
CAP理论
起初,CAP是一个学术界的概念,1985年,Lynch教授指出,如果在一个不稳定(要么消息错乱,要么消息丢失)的网络环境里,想始终保持数据一致性是不可能的。
为了解决这一问题,2000年,CAP理论被提出,CAP指出:在一个分布式系统中,一致性(Consistency)、可用性(Availability) 和 分区容错性(Partition Tolerance) 这三个目标无法同时满足,最多只能同时满足其中两个。
一致性(C)
CAP理论中的一致性也就是数据一致性,指的是在分布式系统中的所有节点,在同一时间点上拥有相同的数据副本。如果某个节点更新了数据,那么其他节点也必须同步更新,保证所有的读请求都能在任意一个节点读到最新的数据。
一致性理论的两个最重要的核心是:
- 数据什么时候会发生变更?
数据变更无非就是增删改的写操作,只有数据服务发生这些请求的时候才会导致数据发生变更;
- 数据一致性改变
当数据服务有多个节点的时候,当数据服务发生写请求,如何判定数据服务上的所有节点都一起发生了变更呢? 需要注意的是,数据一致性改变指的是所有节点的数据全部更新为最新数据以后,返回写成功,我们才认为这时发生了数据的一致性改变。如果根据分布式系统的不同策略配置,比如MySQL的主从集群配置为半同步时,只有部分从库更新完成了数据,也会返回数据写入成功,但是此时进行读取,有可能读取不到最新的数据。就不能称之为数据一致性改变。
可用性(A)
可用性指的是系统要处于100%的可用状态,对于每个请求,正常节点要在合理时间内给出正确的响应,即系统能够提供正常服务。 这里的正常服务必须满足两个条件:
- 必须在合理时间内给出响应。合理时间根据业务确定,业务说必须在100ms内返回,合理时间就是100ms,如果在1s才返回,那么系统不满足可用性;
- 节点正常,但是节点上数据有问题,比如不是最新数据。如果有请求打到这个节点上,依然不能拒绝请求,要正常返回数据;
分区容错性(P)
分区容错性指的是分布式系统在网络分区的情况下能够继续运行,对外提供服务。也就是系统能够在节点之间进行通信的的网络出现故障或者延迟的情况下,保证系统的正常运行。
网络分区:指的是在分布式系统中,多个节点之间的网络本来是连通的,但是由于某些故障导致节点之间网络不通了,形成不同的子集,子集中节点之间网络互通,但是子集与子集之间网络不通,整个网络就形成了几块区域,就是网络分区。
CAP为什么不能同时满足?
分布式系统中,分区容错性(Partition-tolerance)是不得不选择的。假设不考虑分区容错性,相当于把数据只存放在一个节点上,从而可能引发单点故障的问题,同时也与分布式概念相矛盾。
所以,在分布式系统中,分区容错性(P)是一定要满足的,剩下的一致性(C)和可用性(A)只能满足其中一个。因此,分布式架构不可能选择 CA 架构,只能选择 CP 或者 AP 架构。
证明: 可以使用反证法论证,首先构造一个单机系统,系统中存在一个值 X = 1,假设有如下调用关系:
client1发送x=2的写指令到server更新x值为2,单机系统下,不存在网络分区,通过事务机制可以保证client2读取到x的最新值2,不存在一致性的问题。
考虑增加一个服务节点server2,构成了分布式系统。client1在执行写入操作的时候,由于满足了分区容错性,允许其在写入server2的过程中出错。此时client2和client3就会读取到不一样的值。此时系统可用,保证了A,但是违背了C,属于AP架构。假如要保证x的一致性,server1和server2的写入操作必须同时成功,系统必须等待server2也写入成功,在失败的这段时间里系统是不可用状态,这样的话就保证了C,但是降低了系统的可用性,违背了A,属于CP架构。
综上所述,在分布式系统中,无法同时满足CAP定律中的一致性、可用性和分区容错性三者。
CAP该如何选择?
对于业务而言,CP和AP架构如何进行选择呢?需要根据不同的业务场景进行判断:
CP使用场景
比较典型的CP场景是分布式数据库,为了保证数据的一致性,放弃了系统的可用性。例如Redis、HBase这种分布式存储系统,以及ZooKeeper这种分布式协调系统。另一个常见场景就是金融领域,为了资金安全需要保证强一致性。
AP适用场景
AP则是适用于目前大多数对用户体验要求较高的互联网应用场景,比如社交媒体,内容分发业务等。像微博、Instagram。用户量大,主机众多,分布式部署。并且集群规模越来越大,节点故障、网络故障时有发生,要保障系统的可用性,保障AP放弃CP是常见的一种做法。
CAP的不足
CAP最大的不足就是一致性(Consistency)和可用性(Availability)的强取舍问题。
在实际应用中,一致性和可用性并不只是简单的二选一问题,而是取决于各自的优先级。当强调一致性时,并不意味着系统的可用性会完全丧失,例如在Zookeeper中,只有在主节点存在问题的时候,系统才有可能出现短暂的不可用状态,其他时间系统会通过各种方式保证其可用性。同样,在强调可用性时,通常也会采用技术手段保证数据的最终一致性。
简单来说,在设计分布式系统时,对于一致性和可用性希望有一些折中的手段,而不是选择了其中的一个特性就要完全舍弃另外一个特性。