你好,我是吴计可师,一个工作十多年的后端开发,曾就职京东、阿里等多家互联网头部企业。
文章可能会比较长,主要解析的非常详解,或涉及一些底层知识,供面试高阶难度用。可以根据自己实际理解情况合理取舍阅读
CAP 定理(Consistency, Availability, Partition Tolerance)是分布式系统中的一个重要理论,它指出在一个分布式系统中,不可能同时满足一致性、可用性和分区容错性三个特性,只能在其中选择两个进行权衡。
一致性(Consistency)
所有节点在同一时间具有相同的数据视图。
当一个数据更新操作成功完成后,后续所有对该数据的访问都能获得最新值。
类似于数据库中的强一致性。
可用性(Availability)
每个请求都能在有限的时间内得到非错误的响应(不保证是最新数据)。
系统总是可以对请求作出响应,确保高可用性。
分区容错性(Partition Tolerance)
系统能够容忍网络分区(即分布式系统中某些节点之间的网络通信中断)。
即使发生了网络分区,系统仍然能够继续提供服务。
CP 系统:优先保证一致性和分区容错性,牺牲可用性。
AP 系统:优先保证可用性和分区容错性,牺牲一致性。
CA 系统:几乎不可能实现,因为分布式系统必须面对网络分区问题。
CP 系统(一致性 + 分区容错性)
牺牲可用性,当网络分区发生时,系统会拒绝部分请求以确保数据一致性。
典型例子:Zookeeper。
AP 系统(可用性 + 分区容错性)
牺牲强一致性,允许数据在短时间内不同步(最终一致性)。
典型例子:DynamoDB、Cassandra。
CA 系统(一致性 + 可用性)
几乎不可能实现,因为在分布式环境中,网络分区是不可避免的。
分布式数据库:
选择 CP 的场景:对数据一致性要求高,如金融系统。
选择 AP 的场景:对可用性要求高,如社交媒体、缓存系统。
架构设计:
偏向 一致性:暂停部分服务,确保数据正确。
偏向 可用性:允许数据在短时间内不一致,但保持服务可用。
在网络分区发生的情况下,系统需要在一致性和可用性之间做出权衡:
偏向一致性,可能无法响应所有请求,牺牲部分可用性(如 CP 系统)。
偏向可用性,允许数据短暂不一致,牺牲强一致性(如 AP 系统)。
网络分区是分布式系统中不可避免的问题(P 必选)。
为了解决分区容错性(P),必须在 一致性(C) 和 可用性(A) 中进行权衡:
CP 系统:金融、银行等对数据一致性要求高的场景。
AP 系统:电商、缓存等对高可用性要求高的场景。
根据业务需求权衡:
CP 系统:Zookeeper、HBase(分区容错 + 一致性)。
AP 系统:Cassandra、DynamoDB(分区容错 + 可用性)。
CA 系统:理论上不可能完全实现 CA,因网络分区不可避免。
最终一致性是 CAP 中对一致性的弱化版本,是 AP 系统的典型特征。
在最终一致性中,数据可以在短时间内不同步,但最终会达到一致。
分布式系统不可避免会发生网络分区(例如节点通信失败)。
网络分区发生时,必须在一致性和可用性之间取舍。
因此,CA 系统在分布式场景下无法实现。
CAP 定理中的 AP 系统通常采用 BASE 理论。
BASE 理论通过牺牲强一致性,追求最终一致性,以提高系统的可用性和分区容错性。
对于数据一致性要求高(如支付系统):选择 CP。
对于高可用性需求大(如搜索引擎):选择 AP。
根据业务需求选择优先级:
确保在网络分区情况下,核心功能仍能保持运作。
分布式系统中的网络分区指节点间的通信中断,可能是因网络故障或节点分布在不同地理位置导致的。
网络分区是 CAP 定理中不可避免的限制条件。
Zookeeper 是 CP 系统:
保证强一致性:多个节点对外呈现一致的视图。
容忍网络分区:牺牲可用性,部分节点可能不可用。
DynamoDB 是 AP 系统:
保证高可用性:系统始终能响应请求。
容忍分区:数据允许短时间不一致(最终一致性)。
今天的内容就分享到这儿,喜欢的朋友可以关注,点赞。有什么不足的地方欢迎留言指出,您的关注是我前进的动力!