特性与模型
CAP 特性定义
Consistency | 一致性
一致性又称为原子性或者事务性,对某个指定的客户端来说,读操作保证能够返回最新的写操作结果。一致性表示一个事务的操作是不可分割的,要不然这个事务完成,要不然这个事务不完成,不会出现这个事务完成了一半这样的情况,也就不会读取到脏数据。传统的
而在分布式系统中,经常出现的一个数据不具有一致性的情况是读写数据时缺乏一致性。比如两个节点数据冗余,第一个节点有一个写操作,数据更新以后没有有效的使得第二个节点更新数据,在读取第二个节点的时候就会出现不一致的问题出现。这里并不是强调同一时刻拥有相同的数据,对于系统执行事务来说,在事务执行过程中,系统其实处于一个不一致的状态,不同的节点的数据并不完全一致。
一致性强调客户端读操作能够获取最新的写操作结果,是因为事务在执行过程中,客户端是无法读取到未提交的数据的。只有等到事务提交后,客户端才能读取到事务写入的数据,而如果事务失败则会进行回滚,客户端也不会读取到事务中间写入的数据。
Availability | 可用性
可用性主要是指系统能够很好的为用户服务,不出现用户操作失败或者访问超时等用户体验不好的情况;所谓非故障的节点在合理的时间内返回合理的响应,而不是错误和超时的响应。这里强调的是合理的响应,不能超时,不能出错。注意并没有说正确的结果,例如,应该返回
可用性通常情况下可用性和分布式数据冗余,负载均衡等有着很大的关联。
Partition Tolerance | 分区容忍性
分区容忍性即指当出现网络分区后,系统能够继续履行职责。这里网络分区是指:一个分布式系统里面,节点组成的网络本来应该是连通的。然而可能因为一些故障,譬如节点间网络连接断开、节点宕机等,使得有些节点之间不连通了,整个网络就分成了几块区域,数据就散布在了这些不连通的区域中。好的分区容忍性要求能够使应用虽然是一个分布式系统,而看上去却好像是在一个可以运转正常的整体。比如现在的分布式系统中有某一个或者几个机器宕掉了,其他剩下的机器还能够正常运转满足系统需求,这样就具有好的分区容忍性。
分区容忍性的典型场景,譬如数据库有两个拷贝在两个不同的数据中心,当数据被写到一个数据中心的时候,他也一定要被写到另一个数据中心。那么现在假设网络中断了,这就是我们所说的网络分区的意思:

我们可以有如下的两种策略:
-
应用还是被允许写到数据库,所以两边的数据库还是完全可用的。但是一旦两个数据库之间的网络中断了,任何一个数据中心的写操作就不会在另一个数据中心出现,这就违反了一致性。
-
如果你不想失去一致性,你就必须保证你的读写操作都在同一个数据中心,即
Leader 或者Master 节点。另一个数据中心,因为网络故障不能被更新,就必须停止接收读写操作,直到网络恢复,两边数据库又同步了之后。所以虽然非Leader 的数据库在正常运行着,但是他却不能处理请求,这就违反了可用性定义。
CAP 模型实践
实际应用中的可用性和
互联网行业模型。不同的业务类型要求不同的
CA 模型
当发生分区现象时,为了保证一致性,系统需要禁止写入。当有写入请求时,系统返回
CP 模型
AP 模型
值得一提的是,这里
譬如在