分布式基础之CAP

CAP原则又称CAP定理 , 指的是在一个分布式系统中 , 一致性(Consistency)、可用性(Availability)、分区容忍性(Partition tolerance) 。CAP 原则指的是 , 这三个要素最多只能同时实现两点 , 不可能三者兼顾 。

分布式基础之CAP

文章插图
 
  • C表示一致性(Consistency) , 分布式中所有节点访问数据时 , 要求数据始终都是最新的 。
  • A表示可用性(Availability) , 分布式中任意节点出现故障时 , 要求系统可正常使用 。
  • P表示分区容忍性(Partition tolerance) , 分区相当于对通信的时限要求 。系统如果不能在时限内达成数据一致性 , 就意味着发生了分区的情况 , 必须就当前操作在C和A之间做出选择 。(分区状态可以理解为部分机器不连通了 , 比如机器挂了 , 繁忙失去响应 , 单机房故障等)
Consistency数据一致性 , 及系统只读到最新写入的数据 , 如:单点串行化的方式 , 就能达到一致性效果 。
【分布式基础之CAP】单机架构保持一致性:
分布式基础之CAP

文章插图
 
分布式架构数据同步失败 , 无法保持数据一致性:
分布式基础之CAP

文章插图
 
举个栗子:你去租房的时候都会去找地产中介(某链) , 你找到了A小区的门店发现没有需要的房源 , 然后去B小区的门店发现有个房源很适合你 , 这就可以理解为两个门店信息不一致 , 及不满足一致性要求 , 但实际上你会遇到这种情况 , 你去A小区门店询问的时候 , 有你需要的房源 , 然后他们会去B小区的门店拿钥匙 , 这是因为房东把房源交给了B小区门店 , 然后A小区的门店同样同步的B门店的房源 , 这样就满足一致性的要求 。
Availability如果每运行100个时间单位 , 有1个时间单位不可用 , 则说系统的可用性是99% 。
分布式基础之CAP

文章插图
 
如上图服务A可能由于网络原因导致不可用 , 但是B、C还是可以继续服务的 , 但是在反向代理那个位置发生了故障那系统都不可用了 , 它不是高可用的 。
举个栗子:还是以租房为例 , 你去租房的时候发现A小区的门店今天关门了 , 然后直接去了B小区的门店发现他们正常工作的 , 这就满足了可用性的要求 , 如果去B小区或其他门店都没有正常工作 , 那这家地产商可能倒闭了 , 没法对客户提供可用性的服务了 。
Partition tolerance分布式系统 , 大多都是很大个节点 , 第个节点节点之前都不是完全独立的 , 需要相互通信 , 当发生节点无法连通时 , 系统如何进行容错处理 , 是需要考虑的 。
举个栗子:C小区新增加了一个门店 , 装修啥的都弄好了 , 就是没拉网线 , 没有连通性 , 等于就是个孤立的门店 , 店员只能大眼瞪小眼 , 没得事做 。那你去A门店找房源 , 那里的人可能都不知道有C小区这个门店 , 所以A直接带你去了C小区看房子了 。
总结一致性 , 可用性 , 分区容忍性三者只能取其二 , 常见的最佳工程架构实践是什么呢? 最常见的实践是这样的:
  • 连通性异常的处理必须保证 , 满足P
  • 一致性C与可用性A一般二选一
  • 选择一致性C , 举例:传统单库水平切分 , 就是这类选型的典型
  • 选择可用性A , 举例:双主库同步高可用 , 就是这类选型的典型




    推荐阅读