本节书摘来自华章计算机《深入理解Hadoop(原书第2版)》一书中的第1章,第1.4节,作者 [美]萨米尔·瓦德卡(Sameer Wadkar),马杜·西德林埃(Madhu Siddalingaiah),杰森·文纳(Jason Venner),译 于博,冯傲风,更多章节内容可以访问云栖社区“华章计算机”公众号查看。
1.4大数据和事务性系统
以大数据作为参照来理解事务概念的发展变化是非常重要的。这个问题的讨论会涉及相应的NoSQL数据库。Hadoop系统使用HBase来作为自己的NoSQL数据存储。你也可以使用Cassandra或者云计算提供商(如Amazon Dynamo)的NoSQL系统来替代。
大多数的RDBMS使用者都要求数据库必须要遵守ACID准则,但是遵守这些准则是有系统代价的。当数据库后台需要处理峰值为每秒数百万次的事务操作的时候,要求苛刻地遵守ACID准则对数据库来说是个巨大的挑战。
ACID是atomicity(原子性)、consistency(一致性)、isolation(隔离性)和durability(持久性)的首字母简写。进一步详细讲解见:http://en.wikipedia.org/wiki/ACID。
对苛刻的ACID准则做出妥协是必要的。做出妥协的理论依据就是著名的CAP理论(又称Brewer理论)。CAP理论是下面三点的首字母缩写:
- Consistency(一致性):在分布式系统中的所有数据备份,在同一时刻有同样的值。
- Availability(可用性):在合理且明确的时间内,保证每个请求都能获得成功或者失败的结果的响应。
- Partition tolerance(分区容忍性): 在集群中一部分节点故障后,集群整体仍可使用。
- 这个理论用来证明,任何分布式系统只能同时满足其中的两个特性,而无法三者兼顾。现在,让我们仔细地思考对比下面列出的各种系统:
- 一致性和可用性:遵守ACID准则的单机RDBMS是兼顾一致性和可用性的系统的一个例子。但是不满足分区容忍性。如果这个RDBMS当机了,用户将无法访问数据。
- 一致性和分区容忍性:一个RDBMS集群就是这样的系统。分布式事务保证了所有用户在同一时刻获取到相同的数据(一致性);数据的分布式存储天然地保证在集群部分节点故障的情况下,集群系统仍然可用。可是,分布式事务在满足系统一致性的同时,也有副作用,导致系统无法做到可用性,在两阶段提交事务执行期间,系统是不可用的。一致性限制了系统可以支持的同时执行的事务数量,反过来也影响到了系统的可用性。
- 可用性和分区容忍性:本类别中这样的系统常常被归类为“最终一致性”系统。考虑一下流行的电子商务网站,比如亚马逊。假如你正在浏览商品目录,发现你需要的商品正好有货。在购买流程中很自然就可以想到,在你发现所需的商品有货并发起了购买请求这段时间内,其他人更早地进入并抢购了商品。所以有必要及时显示最新库存变化。库存变化将会广播到为用户提供服务的集群中的其他所有节点。为了给用户提供库存变化后的最新值,当商品库存变化后的数据在各个节点的传递还没有完成的时候,如果系统阻止了用户的访问,就会使网站丧失可用性,从而影响交易量。为了系统可用性和分区容忍性而牺牲系统一致性,我们选择这个折中来使多个节点为用户显示相同的数据(在一个小的时间窗内,用户看到的数据可能是不同的,这个时间窗的大小取决为用户提供服务的那个节点)。
如何做出折中选择,在大数据系统设计的时候是非常关键的。本书的主题MapReduce只是大数据生态环境中的一个组件。它常常与其他类似HBase这样的产品搭配使用,在选择不同产品配合使用的时候,在本章讲解的这些权衡中做出选择,是解决方案是否可行的关键。