CAP理论透析( 二 )


CAP理论透析

文章插图
随着互联网应用的飞速发展,数据量与日俱增,传统的ACID数据库已经不能满足如此大的海量数据存储了 。这个时候需要设计出好的分布式数据存储方式 。而这些分布式数据存储方式受到CAP理论的约束,不可能达到高一致性,高可用性,高分区容错性的完美设计 。所以我们在设计的时候要懂得取舍,重点关注对应用需求来说比较重要的,而放弃不重要的,在CAP这三者之间进行取舍,设计出贴合应用的存储方案 。
目前众多的分布式数据系统通过降低一致性来换取可用性 。下面是一个简单的例子:
两个节点数据冗余,第一个节点先有一个写操作,第二个节点后有一个读操作 。下面的图中a是整个过程,要具有一致性的话需要等待a1进行write,然后同步到a2,然后a2再进行write,只有整个事务完成以后,a2才能够进行read 。但是这样的话使得整个系统的可用性下降,a2一直阻塞在那里等待a1同步到a2 。这个时候如果对一致性要求不高的话,a2可以不等待a1数据对于a2的写同步,直接读取,这样虽然此时的读写不具有一致性,但是在后面可以通过异步的方式使得a1和a2的数据最终一致,达到最终一致性 。
BASE理论是CAP理论结合实际的产物 。BASE(,Soft-state,)英文中有碱的意思,这个正好和ACID的酸的意义相对,很有意思 。BASE恰好和ACID是相对的,BASE要求牺牲高一致性,获得可用性或可靠性 。
满足一致性,可用性的系统,通常在可扩展性上不太强大:
·like ,MySQL, etc ()
· (-)
·Aster Data ()
· ()
满足一致性,分区容忍必的系统,通常性能不是特别高:
·(-/)
·(-/)
·HBase(-/)
·(-)
·(-)
·Redis(key-value)
·(key-value)
·(key-value)
· DB(key-value)
满足可用性,分区容忍性的系统,通常可能对一致性要求低一些:
CAP理论透析

文章插图
·(key-value)
·(key-value)
·Tokyo (key-value)
·KAI(key-value)
·(-/)
·(-)
·(-)
·Riak(-)
Guy 写了一篇文章“A CAP(Wrong)”来反对CAP理论 。他提出了一个同时满足CAP的解决方案来反对的三者只能取其二的说法 。
他设计的系统如下:
(1)程序如果能够读取数据库的话读取数据库,如果不能的话可以使用缓存代替 。
(2)所有的读取操作使用版本号或者其他可以使用乐观锁的机制 。
(3)客户端的所有更新操作全部放在队列中顺序处理 。更新操作中要包括该更新的读取操作时的版本信息 。
(4)当分区数量足够少的时候,可以处理队列中的更新操作 。比较简单的方式是建立一个跨越所有分布式副本的事务,对每个副本进行更新操作(其他方式比如等等也可以) 。如果该更新的读取操作时的版本信息不是当前数据库中数据的版本信息,则将失败返回给客户端,否则返回成功 。
(5)数据库操作结果(确认或者取消)通过异步的方式发送到客户端,可以通过邮件,消息队列或者其他异步方式 。
该系统符合CAP如下:
符合C(高一致性):读取的数据都是基于快照的,而且错误的更新操作不会执行 。
符合A(高可用性):读取和更新都会返回数据 。
符合P(高分区容错性):允许网络或者节点出错 。
【CAP理论透析】该设计是符合BASE理论的 。