总有一些看不见的手在控制着软件的世界,就像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最终一致,最终数据是一致。