CAP理论和分布式系统设计

转自 : http://www.spnguru.com/2010/07/cap%E7%90%86%E8%AE%BA%E5%92%8C%E5%88%86%E5%B8%83%E5%BC%8F%E7%B3%BB%E7%BB%9F%E8%AE%BE%E8%AE%A1/

有人说,CAP理论对于分布式系统来说,相当于物理学之于飞机,可见其重要性。每一个数据库的系统都必须遵循它。

那么什么是CAP理论呢?10年前,Eric Brewer教授指出了著名的CAP理论。CAP理论告诉我们,一个分布式系统不可能满足一致性,可用性和分区容错性这三个需求,最多只能同时满足两个。

下面让我们了解每一项的含义。

一致性 Consistency

Consistency指的是系统在任何时候看起来是一致的。对分布式系统来说,一般指的是一次写操作后,所有之后的读都能看到这个变化。

一个分布式系统可以是强一致性或者是某种形式的弱一致性。

关系型数据库一般都实现了强一致性,ACID(Atomicity Consistency Isolation Durability)。而另外一种BASE设计思想(Basically Available,Soft-state,Eventual Consistency)则是基于弱一致性。

这里要提一下,最终一致性(Eventual Consistency)是弱一致性的一种特例。假如A首先write了一个值到存储系统,存储系统保证如果在A,B,C后续读取之前没有其它写操作更新同样的值的话,最终所有的读取操作都会读取到最A写入的最新值。此种情况下,如果没有失败发生的话,“不一致性窗口”的大小依赖于以下的几个因素:交互延迟,系统的负载,以及复制技术中replica的个数(这个可以理解为master/salve模式中,salve的个数),最终一致性方面最出名的系统可以说是DNS系统,当更新一个域名的IP以后,根据配置策略以及缓存控制策略的不同,最终所有的客户都会看到最新的值。

可用性Availability

可用性指的是一个系统始终能保持可用的状态,也就是说,任何时候不会拒绝合法的读和写请求。

可用性要求系统能容忍单个节点的失败,即使在软件和硬件升级,系统仍然需要保持可用。

分区容错性Partition Tolerance

分区容错性指的是系统在出现网络Partition的时候仍然可以操作。什么是网络Partition?比如有cluster中存在与两个rack上面,如果这两个rack之间的连接断了,就是网络Partition。如果在这种情况下,分别连到两个rack的client仍然允许继续读写操作,这就是分区容错性。

下面就举例说明CAP和分布式系统的关系。

比如我们设计一个数据库,它要处理A-Z的用户。

第一种方案:

只使用一个node,显然这种方案满足了强一致性。但是可用性不好,一但这个节点出现故障,系统就完全不可用了。

第二种方案:

这种方案使用两个节点,并且把A-Z分成A-M和N-Z。因为一个用户数据只存在其中的一个节点,可以保证一致性。但是这种系统在其中的一个节点出现故障的时候可用性只有50%.

第三种方案

这种方案也使用两个节点,并且两个node的数据是冗余的。在这种情况下,如果要实现CA,那么就不能接受Partition Tolerance,否则两个节点的数据就会不一致。如果要实现CP,那么可用性就得不到保障。如果接受AP,那么就会出现数据不一致的情形。

熊掌与鱼不可兼得也。关注的是一致性,那么您就需要处理因为系统不可用而导致的写操作失败的情况,而如果您关注的是可用性,那么您应该知道系统的read操作可能不能精确的读取到write操作写入的最新值。因此系统的关注点不同,相应的采用的策略也是不一样的,只有真正的理解了系统的需求,才有可能利用好CAP理论。

猜你喜欢

转载自jackyhongvip.iteye.com/blog/1401225