博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
CAP定理
阅读量:4299 次
发布时间:2019-05-27

本文共 1690 字,大约阅读时间需要 5 分钟。

我们想要拥有一切,但不幸的是我们做不到。

当使用微服务架构构建的分布式系统()时,一 个数学证明甚至就能证明我们做不到。

在分布式系统中有三方面需要彼 此权衡:一致性(consistency)、可用性(availability)和分区容忍性(partition tolerance)。具体地说,这个定理告诉我们最多只能保证三个中的两个。

首先解释下这三个的意思:

  • 一致性(consistency)

    一致性是当访问多个节点时能得到同样的值

  • 可用性(availability)

    可用性意味着每个请求都能获得响应

  • 分区容忍性(partition tolerance)

    分区容忍性是指集群中的某些节点在无法联系后,集群整体还能继续进行服务的能力

假设我们的库存服务部署在两个独立的数据中心。我们 在每个数据中心的服务实例都有一个数据库支持,并且这两个数据库通过彼此通信进行数据同步。读和写操作都通过本地数据库节点,然后使用副本对不同节点之间的数据进行同步。如图:

这里写图片描述
- 1.1 牺牲一致性 (用户将看到失效(不一致)数据的可能性) CP

  • 假设我们完全不停用库存服务。如果现在我更改了 DC1 上的数据,DC2 的数据库将看不 到它。这意味着,任何访问我们在 DC2 上库存节点的请求,看到的可能是已经失效的数 据。

    换句话说,我们的系统仍然可用,两个节点在系统分区之后仍然能够服务请求,但失 去了一致性。这通常被称为一个 AP 系统。

  • 在这种分区情况下,如果我们继续接受写操作,那就需要接受这样的一个事实,在将来的 某个时候它们不得不重新同步。分区持续的时间越长,这个重新同步就会越困难。现实情况是,即使我们没有数据库节点之间的网络故障,数据复制也不是立即发生的。

  • 正如前面提到的,系统放弃一致性以保证分区容忍性和可用性的这种做法,被称为最终一致 性;也就是说,我们希望在将来的某个时候,所有节点都能看到更新后的数据,但它不会 马上发生,所以我们必须清楚用户将看到失效数据的可能性。

-1.2 牺牲可用性(拒绝响应请求) AP

  • 如果我们需要保证一致性,相反想要放弃其他方面,会发生什么呢?好吧,为了保证一致 性,

    每个数据库节点需要知道,它所拥有的数据副本和其他数据库节点中的数据完全相同。
    现在在分区情况下,如果数据库节点不能彼此通信,则它们无法协调以保证一致性。
    由于无法保证一致性,所以我们唯一的选择就是拒绝响应请求。换句话说,我们牺牲了可 用性。

  • 如果我们需要保证一致性,相反想要放弃其他方面,会发生什么呢?好吧,为了保证一致 性,

    每个数据库节点需要知道,它所拥有的数据副本和其他数据库节点中的数据完全相同。
    现在在分区情况下,如果数据库节点不能彼此通信,则它们无法协调以保证一致性。
    由于无法保证一致性,所以我们唯一的选择就是拒绝响应请求。换句话说,我们牺牲了可 用性。

  • 系统是一致的和分区容忍的,即 CP。在这种模式下,我们的服务必须考虑如何做 功能降级,

    直到分区恢复以及数据库节点之间可以重新同步。

-1.3 牺牲分区容忍性 (在分布式系统中不存在)

  • 如果系统没有分区容忍性,就不能跨网络运行,也就是说,你只能在本地运行
    一个单独的进程,所以不存在CA系统。

-1.4 AP还是CP

  • 哪个是正确的,AP 还是 CP ?好吧,现实中要视情况而定。因为我们知道,在人们构建系 统的过程中需要权衡。
  • 我们知道 AP 系统扩展更容易,而且构建更简单,而 CP 系统由于 要支持分布式一致性会遇到更多的挑战,需要更多的工作。
  • 但我们可能不了解这种权衡对 业务的影响。对于库存系统,如果一个记录过时了 5 分钟,这可接受吗?如果答案是肯定 的,那么解决方案可以是一个 AP 系统。但对于银行客户的余额来说呢?能使用过时的数 据吗?如果不了解操作的上下文,我们无法知道正确的做法是什么。我们的系统作为一个整体,不需要全部是 AP 或 CP 的。目录服务可能是 AP 的,因为我们 不太介意过时的记录。但库存服务可能需要是 CP 的,因为我们不想卖给客户一些没有的 东西,然后不得不道歉。
你可能感兴趣的文章
浅析 Laravel 官方文档推荐的 Nginx 配置
查看>>
Swagger在Laravel项目中的使用
查看>>
Laravel 的生命周期
查看>>
CentOS Docker 安装
查看>>
Nginx
查看>>
Navicat远程连接云主机数据库
查看>>
Nginx配置文件nginx.conf中文详解(总结)
查看>>
Mysql出现Table 'performance_schema.session_status' doesn't exist
查看>>
MySQL innert join、left join、right join等理解
查看>>
vivado模块封装ip/edf
查看>>
sdc时序约束
查看>>
Xilinx Jtag Access/svf文件/BSCANE2
查看>>
NoC片上网络
查看>>
开源SoC整理
查看>>
【2020-3-21】Mac安装Homebrew慢,解决办法
查看>>
influxdb 命令行输出时间为 yyyy-MM-dd HH:mm:ss(年月日时分秒)的方法
查看>>
已知子网掩码,确定ip地址范围
查看>>
判断时间或者数字是否连续
查看>>
docker-daemon.json各配置详解
查看>>
Mac 下docker路径 /var/lib/docker不存在问题
查看>>