IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

一文读懂分布式系统CAP定理

孙豪杰的博客 2020-02-01 15:07:16 累计浏览 1,993 次
本机暂存

   总有一些看不见的手在控制着软件的世界,就像CAP定理,第一次听到这个词竟然是在面试场合,真的是汗颜,回来之后数次尝试去理解这个定理。英文原文理解不透,中文介绍更是百花齐放百家争鸣,总是感觉一知半解。痛定思痛,决定好好研究一番,并用更加通俗的言语进行解释。

名词

CAP定理,又称布鲁尔定理,它指出对于一个分布式计算系统来说,不可能同时满足以下三点:一致性(Consistency):所有客户端同时查询或者更新为相同的最新数据可用性(Availability):不管是否成功,确保每一个请求合理的时间内接收到响应分区容错(Partition tolerance): 当系统因为网络问题被分割为多个区域时,系统仍然能提供正常服务的能力。

原理

分布式系统:应用部署在多个计算节点,Node之间通过网络进行交互。分区:网络的不可靠性,Node之间的隔离是不可避免的存在。当网络不可达时,系统因为网络被分离为多个可联通区域,所以分布式系统的分区是不可避免的。
  • 优先满足CA

基于主键的mysql分库分表实现:数据库分为N个实例,每个实例M个表,主键 % N 余数为实例的index主键 % M 余数为表的index每个数据只存在于一个实例的一个表中,因此满足一致性。当因为网络原因mysql集群导致分区时,客户端访问可联通区域的数据时,可用性和分区容错性得到保证;但是客户端访问数据不在可连接的分区,系统返回数据库访问错误,满足可用性,不满足分区容错。因此该访问满足CA,但是不容忍任何分区
  • 优先满足CP

使用主从结构的mysql集群,做读写分离,写master,读slave;为保证数据一致性,master更新后,必须slave完全复制成功,才作为更新成功返回。因此满足数据一致性(C)的要求。系统分区导致,部分slave不能交互,数据不能从master向slave复制,导致写不可用,但是读不影响的结果。因此满足C(一致性)P(分区容错读可用),不满足A(写功能不可用)
  • 优先满足AP

仍然使用主从结构的mysql集群,做读写分离,写master,读slave;为保证可用性,数据master更新成功,既认为数据更新成功,当部分slave不用的情况下,仍然可保证读写的可用性,以及分区容错。但是数据存在不一致的情形,部分客户端与不能和master进行数据复制的slave位于同一个分区,可能导致读取历史数据。因此满足A(可用性)P(分区容错读写均可用),不满足C(读不复制slave的历史数据)

BASE思想

越来越多大数据量,高并发系统在CAP定理的制约下采用优先满足AP,保证可用性,允许临时中间态,数据最终保证一致。即为BASE思想:BA:Basically Available基本可用S:Soft state软状态 状态可以有一段时间数据处于中间态,数据不一致。E:Eventually consistent最终一致,最终数据是一致。

同分类推荐文章

  1. 等了十年的 Go 链式管道,终于来了:seq 让你像写 Scala 一样写 Go (2026-06-25 18:38:18)
  2. Go 实验特性详解 (2026-06-21 10:05:27)
  3. amd64 微架构级别对 Go 程序性能提升多少? (2026-06-21 09:38:49)

查看更多 后端 文章 →

建议继续学习

  1. Zookeeper工作原理 (累计阅读 12,202)
  2. 一致性哈希算法及其在分布式系统中的应用 (累计阅读 9,198)
  3. Storm:最火的流式处理框架 (累计阅读 7,467)
  4. 消息分发的同步均衡策略 (累计阅读 6,218)
  5. 各消息队列软件产品大比拼 (累计阅读 6,207)
  6. 如果用户在5分钟内重复上线,就给他发警告,问如何设计? (累计阅读 6,029)
  7. 解析Google集群资源管理系统Omega (累计阅读 5,998)
  8. 阿里巴巴国际站P4P引擎系统简介 (累计阅读 5,343)
  9. 分布式系统hash策略 (累计阅读 5,300)
  10. 趣图三幅:负载均衡算法需要改进 (累计阅读 5,029)