转载请注明出处: jiq•钦's technical Blog - 季义钦
一、开篇
淘宝之前使用的存储层架构一直是MySQL数据库,配合以MongDB,Tair等存储。
MySQL由于开源,并且生态系统良好,本身拥有分库分表等多种解决方案,因此很长一段时间内都满足淘宝大量业务的需求。但是由于业务的多样化发展,有越来越多的业务系统的需求开始发生了变化。一般来说有以下几类变化:
(1) 数据量变得越来越多,事实上现在淘宝几乎任何一个与用户相关的在线业务的数据量都在亿级别,每日系统调用次数从亿到百亿都有,且历史数据不能轻易删除。这需要有一个海量分布式文件系统,能对TB级甚至PB级别的数据提供在线服务。
(2) 数据量的增长很快且不一定能准确预计,大多数应用系统从上线起在一段时间内数据量都呈很快的上升趋势,因此从成本的角度考虑对系统水平扩展能力有比较强烈的需求,且不希望存在单点制约。
(3) 只需要简单的kv读取,没有复杂的join等需求。
(4) 对系统的并发能力以及吞吐量、响应延时有非常高的需求,并希望系统能保持强一致性。
(5) 通常系统的写入非常频繁,尤其是大量系统依赖于实时的日志分析。
(6) 希望能够快速读取批量数据(HBase基于行健存储的优势)。
(7) schema灵活多变,可能经常更新列属性或新增列。
(8) 希望能够方便使用,有良好且语义清晰的java接口。
以上需求综合在一起,我们认为hbase是一种比较适合的选择。
1、首先它的数据由hdfs天然地做了数据冗余,云梯三年的稳定运行,数据100%可靠己经证明了hdfs集群的安全性,以及服务于海量数据的能力。
2、其次hbase本身的数据读写服务没有单点的限制,服务能力可以随服务器的增长而线性增长,达到几十上百台的规模。
3、LSM-Tree模式的设计让hbase的写入性能非常良好,单次写入通常在1-3ms内即可响应完成,且性能不随数据量的增长而下降。
4、region(相当于数据库的分表)可以ms级动态的切分和移动,保证了负载均衡性。
5、由于hbase上的数据模型是按rowkey排序存储的,而读取时会一次读取连续的整块数据做为cache,因此良好的rowkey设计可以让批量读取变得十分容易,甚至只需要1次IO就能获取几十上百条用户想要的数据。
6、最后,淘宝大部分工程师是java背景的同学,因此hbase的api对于他们来说非常容易上手,培训成本相对较低。
这个问题足以说明,Hbase相对于MongDB拥有上面讲到的那几点优势。
另外FaceBook是Hbase目前的最大的用户,其抛弃了自创的最终一致性数据库Cassandra而选择了Hbase。http://wiki.apache.org/hadoop/Hbase/PoweredBy页面也罗列出了很多当前正在使用HBase的大用户。
二、NoSQL数据库特点
1、 MongDB特点:
(1) MongDB是文档存储,文档按组又分成集合。集合类似于关系数据库中的表,不过不同
的是其不对Schema进行严格约束,即一个集合可以包含任何文档。
文档以BSON格式存在,这是一种JSON类文档的二进制编码格式,结构类似于嵌套的键值对,每个文档都有一个唯一的标识。
(2) MongDB选择用内存映射文件存储,所以可以通过提供更大的RAM或者分配更大的虚拟内存可以提升MongDB的性能,可以看出高性能是贯穿MongDB设计的一个重要理念。
(3) 限制:因为采用内存映射文件存储,所以32位系统上数据库的最大值不能超过2G。此外单个文档不能超过16M,说明不适合存储大对象。还有一个MongDB数据库最多只能存储8000个集合。这些约束都限制了MongDB数据库的无限增长。
(4) 原子性:MongDB并不注重原子性,也没有定义并发操作中事物完整性和隔离级别,因此在更新同一个集合时,两个进程可能相互冲突。只有一类成为Modifier Operation的操作(主要有累加字段、设定字段值、删除字段等操作)才提供原子性。而Hbase和Hypertable等列式数据库提供行级的原子更新和一致性状态。
(5) 水平拓展:选用MongDB一个常见的原因是弱Schema集合,还有