@H_502_0@4.BASE理论 @H_502_0@BASE理论是CAP理论结合实际的产物。 BASE(BasicallyAvailable,Soft-state,Eventuallyconsistent)英文中有碱的意思,这个正好和ACID的酸的意义相对,很有意思。BASE恰好和ACID是相对的,BASE要求牺牲高一致性,获得可用性或可靠性。 @H_502_0@5.CAP之间的取舍 @H_502_0@满足一致性,可用性的系统,通常在可扩展性上不太强大:
·Traditional RDBMSs like Postgres,MysqL,etc (relational)
·Vertica (column-oriented)
·Aster Data (relational)
·Greenplum (relational)
@H_502_0@满足一致性,分区容忍必的系统,通常性能不是特别高:·BigTable(column-oriented/tabular)
·Hypertable(column-oriented/tabular)
·HBase(column-oriented/tabular)
·MongoDB(document-oriented)
·Terrastore(document-oriented)
·Redis(key-value)
·Scalaris(key-value)
·MemcacheDB(key-value)
·Berkeley DB(key-value)
@H_502_0@满足可用性,分区容忍性的系统,通常可能对一致性要求低一些:·Dynamo(key-value)
·Voldemort(key-value)
·Tokyo Cabinet(key-value)
·KAI(key-value)
·Cassandra(column-oriented/tabular)
·CouchDB(document-oriented)
·SimpleDB(document-oriented)
·Riak(document-oriented)
@H_502_0@6.CAP的反对声音 @H_502_0@Guy Pardon写了一篇文章“A CAP Solution (Proving Brewer Wrong)”来反对CAP理论。他提出了一个同时满足CAP的解决方案来反对Brewer的三者只能取其二的说法。 @H_502_0@他设计的系统如下: @H_502_0@(1)程序如果能够读取数据库的话读取数据库,如果不能的话可以使用缓存代替。(2)所有的读取操作使用版本号或者其他可以使用乐观锁的机制。
(3)客户端的所有更新操作全部放在队列中顺序处理。更新操作中要包括该更新的读取操作时的版本信息。
(4)当分区数量足够少的时候,可以处理队列中的更新操作。比较简单的方式是建立一个跨越所有分布式副本的事务,对每个副本进行更新操作(其他方式比如quorum等等也可以)。如果该更新的读取操作时的版本信息不是当前数据库中数据的版本信息,则将失败返回给客户端,否则返回成功。
(5)数据库操作结果(确认或者取消)通过异步的方式发送到客户端,可以通过邮件,消息队列或者其他异步方式。
@H_502_0@该系统符合CAP如下: @H_502_0@符合C(高一致性):读取的数据都是基于快照的,而且错误的更新操作不会执行。 @H_502_0@符合A(高可用性):读取和更新都会返回数据。 @H_502_0@符合P(高分区容错性):允许网络或者节点出错。 @H_502_0@该设计是符合BASE理论的。 @H_502_0@参考资料: @H_502_0@http://www.julianbrowne.com/article/viewer/brewers-cap-theorem @H_502_0@http://www.sigma.me/2011/06/13/NoSQL-CAP-Theorem.html @H_502_0@http://blog.nosqlfan.com/html/1112.html @H_502_0@http://guysblogspot.blogspot.com/2008/09/cap-solution-proving-brewer-wrong.html