IT技术博客大学习 共学习 共进步

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

孙豪杰的博客 2020-02-01 15:07:16 浏览 1,884 次

   总有一些看不见的手在控制着软件的世界,就像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. 分布式缓存系统 Memcached 入门 (阅读 16,042)
  2. Zookeeper工作原理 (阅读 11,942)
  3. GFS, HDFS, Blob File System架构对比 (阅读 10,342)
  4. Zookeeper研究和应用 (阅读 9,341)
  5. 一致性哈希算法及其在分布式系统中的应用 (阅读 9,043)
  6. 分布式日志系统scribe使用手记 (阅读 8,842)
  7. 分布式哈希和一致性哈希 (阅读 8,665)
  8. HBase技术介绍 (阅读 7,942)
  9. 分布式系统的事务处理 (阅读 7,244)
  10. Memcache分布式部署方案 (阅读 6,666)