CAP理论总结
一.简介
CAP 理论是一个很好的思考框架,它对分布式系统的特性做了高度抽象,比如抽象成了一致性、可用性和分区容错性,并对特性间的冲突(也就是 CAP 不可能三角)做了总结。一旦掌握它,你就像拥有了引路人,自然而然就能根据业务场景的特点进行权衡,设计出适合的分区容错一致性模型。
二.CAP指标
CAP理论对分布式系统特性做了高度抽象,形成三个指标:
- 一致性(Consistency)
- 可用性(Availability)
- 分区容错性(Partition Tolerance)
2.1 一致性
一致性说的是客户端的每次读操作,不管访问哪个节点,要么读到的都是同一份最新写入的数据,要么读取失败。
示例
2 个节点的 KV 存储,原始的 KV 记录为“X = 1”。
紧接着,客户端向节点1发送写请求“SET X=2”。
如果节点 1 收到写请求后,只将节点 1 的 X 值更新为 2,然后返回成功给客户端。
那么,此时如果客户端访问节点 2 执行读操作,就无法读到最新写入的 X 值,这就不满足一致性了。
如果节点 1 收到写请求后,通过节点间的通讯,同时将节点 1 和节点 2 的 X 值都更新为 2,然后返回成功给客户端。
那么在完成写请求后,不管客户端访问哪个节点,读取到的都是同一份最新写入的数据,这就叫一致性。
一致性这个指标,描述的是分布式系统非常重要的一个特性,强调的是数据正确。也就是说,对客户端而言,每次读都能读取到最新写入的数据。
2.2 可用性
可用性说的是任何来自客户端的请求,不管访问哪个非故障节点,都能得到响应数据,但不保证是同一份最新数据。你也可以把可用性看作是分布式系统对访问本系统的客户端的另外一种承诺:我尽力给你返回数据,不会不响应你,但是我不保证每个节点给你的数据都是最新的。这个指标强调的是服务可用,但不保证数据正确。
2.3 分区容错
不过集群毕竟不是单机,当发生分区故障的时候,有时不能仅仅因为节点间出现了通讯问题,无法响应最新写入的数据,之后在客户端查询数据时,就一直返回给客户端出错信息。
示例
业务集群中的一些关键系统,比如名字路由系统(基于 Raft 算法的强一致性系统),如果仅仅因为发生了分区故障,无法响应最新数据(比如不满足“大多数”,没有了领导者),为了不破坏一致性,那么客户端查询相关路由信息时,系统就一直返回给客户端出错信息,此时相关的业务都将因为获取不到指定路由信息而不可用、瘫痪,这可以说是灾难性的故障了。
三.CAP不可能三角
CAP 不可能三角说的是对于一个分布式系统而言,一致性(Consistency)、可用性(Availability)、分区容错性(Partition Tolerance)3 个指标不可兼得,只能在 3 个指标中选择 2 个。
CAP 不能三角最初是埃里克·布鲁尔(Eric Brewer)基于自己的工程实践,提出的一个猜想,后被赛斯·吉尔伯特(Seth Gilbert)和南希·林奇(Nancy Lynch)证明,证明过程可以参考论文《Brewer’s conjecture and the feasibility of consistent, available, partition-tolerant web services》,你记住结论就好了。不过,为了帮你阅读论文,我补充一点:
- 基于证明严谨性的考虑,赛斯·吉尔伯特(Seth Gilbert)和南希·林奇(Nancy Lynch)对指标的含义做了预设和限制,比如,将一致性限制为原子一致性。
四.CAP理论实例
开源版的 InfluxDB,缺乏集群能力和可用性,而且,InfluxDB 是由 META 节点和 DATA 节点 2 个逻辑单元组成,这 2 个节点的功能和数据特点不同,需要我们分别为它们设计分区容错一致性模型。
设计
- 作为分布式系统,分区容错性是必须要实现的,不能因为节点间出现了分区故障,而出现整个系统不工作的情况。
- 考虑到 META 节点保存的是系统运行的关键元信息,比如数据库名、表名、保留策略信息等,所以必须实现一致性。也就是说,每次读,都要能读取到最新数据,这样才能避免因为查询不到指定的元信息,时序数据记录写入失败或者系统没办法正常运行。比如,创建了数据库 telegraf 之后,如果系统不能立刻读取到这条新的元信息,那么相关的时序数据记录,就会因为找不到指定数据库信息而写入失败,所以,我选择 CAP 理论中的 C 和 P,采用 CP 架构。
- DATA 节点保存的是具体的时序数据记录,比如一条记录 CPU 负载的时序数据,“cpu_usage,host=server01,location=cn-sz user=23.0,system=57.0”。虽然这些数据不是系统运行相关的元信息,但服务会被访问频繁,水平扩展、性能、可用性等是关键,所以,我选择了 CAP 理论中的 A 和 P,采用 AP 架构。
五.小结
- CA 模型,在分布式系统中不存在。因为舍弃 P,意味着舍弃分布式系统,就比如单机版关系型数据库 MySQL,如果 MySQL 要考虑主备或集群部署时,它必须考虑 P。
- CP 模型,采用 CP 模型的分布式系统,舍弃了可用性,一定会读到最新数据,不会读到旧数据。一旦因为消息丢失、延迟过高发生了网络分区,就影响用户的体验和业务的可用性(比如基于 Raft 的强一致性系统,此时可能无法执行读操作和写操作)。典型的应用是 Etcd,Consul 和 Hbase。
- AP 模型,采用 AP 模型的分布式系统,舍弃了一致性,实现了服务的高可用。用户访问系统的时候,都能得到响应数据,不会出现响应错误,但会读到旧数据。典型应用就比如 Cassandra 和 DynamoDB。
参考
《分布式协议与算法实战》