淘宝在2011年之前所有的后端持久化存储基本上与我们所认知的意义,  大量存于 mysql 。少量 oracle mongdb 等,使用mysql 的原因相信各位也很熟悉了。  开源、社区庞大、解决方案多种、分库分表做超过超过 500W 数据的扩容、再到读写分离、再到专用图片服务器、再到专业后端缓存系统、二级缓存等等。 但是由于业务的发展。产生了如下变化:

1 数据量越来越大,用户的激增从千万级别到亿级别,每日调用从亿级到百亿级。历史数据的海量存储问题。 TB PB 的数据时代来临。(HBase)

2 数据增长快。  数据量仍然在每天成阶梯式上涨。 查询性能及水平扩展有强烈的需求。(一次写入多次读取)

3 简单的 KV 存储、系统的并发能力以及吞吐量和最终强一致性。(KV 存储,ZK 强一致)

4 系统写入频繁,尤其是大量系统依赖于实时的日志分析。(HDFS 'LSM tree'、 HBase、Strom,kafka)

5 且查询刚刚录入的数据频繁(HBase MemStore)

6 数据分析,如双十一预测,优化运营手段 (漏斗模型)

7 良好的定义接口,灵活组件( java)

结合以上需求,HBase 成为首要选择(淘宝正在做 TBFS  原始打算用 Hadoop 临时顶替一下,结果用起来挺好用的。 希望 阿里 搞出国人的牛X 生态圈。= =! 事实上我也想去 阿里的大数据医疗 !)hdfs天然地做了数据冗余(高可用),以及海量扩容 HBase 单次写入 1~3ms 内。  且性能不会随着数据的增大而下降 (如传统B+、B* 树)。

灵活的 region = 数据库的分表。 而且可以达到毫秒级切分、移动。 定时的合并存储, hbase 内置的 负载均衡。 HBase 的数据模型利用 rowkey 排序,因此合理的设计可以一次IO 就得到 几十上百条用户所要的数据。而且源码 是JAVA 的。 JAVA 猿好多好多。无论是成本还是技术角度,更适合。

另外 HBase 的社区做的也很好,很多问题都有解决、有 taobao、facebook、yahoo 的大神研究发表技术改进等等。

  
HBase 不适合的场景 
1 大量无序的随机访问
2 事物要求高
3 经常多表查询(基本上可以靠设计解决,除非变态多关联)

----------------------------------------------------------------------------------------------------------------------

快照是什么?

快照就是一份元信息的合集,允许管理员恢复到表的先前状态。快照不是表的复制而是一个文件名称列表,因而不会复制数据。完全快照恢复是指恢复到之前的“表结构”以及当时的数据,快照之后发生的数据不会恢复。

HBase 快照介绍

在 HBase 0.90(大概是)之前,唯一能够备份或克隆表的方法就是使用复制/导出表或者在关闭表之后拷贝HDFS中所有的hfile。复制/导出是通过一系列工具调用 MapReduce 来扫描并复制表,这样会对域服务器的效率有直接的影响。关闭表会停止所有的读写操作,实际环境中往往无法接受。

相比之下HBase快照允许管理员不拷贝数据直接克隆一张表,这对域服务器产生的影响最小。将快照导出至其他集群不会直接影响到任何域服务器;导出只是带有一些额外逻辑的群间数据同步。

HBase Snapshots允许你对一个表进行快照(即可用副本),它不会对Region Servers产生很大的影响,它进行复制和 恢复操作的时候不包括数据拷贝。导出快照到另外的集群也不会对Region Servers产生影响。 下面告诉你如何使用Snapshots功能

1.开启快照支持功能,在0.95+之后的版本都是默认开启的,在0.94.6+是默认关闭

<property><name>hbase.snapshot.enabled</name><value>true</value></property>

2.给表建立快照,不管表是启用或者禁用状态,这个操作不会进行数据拷贝

$ ./bin/hbase shell 
hbase> snapshot 'myTable', 'myTableSnapshot-122112'

3.列出已经存在的快照

$ ./bin/hbase shell
hbase> list_snapshots

4.删除快照

$ ./bin/hbase shell
hbase> delete_snapshot 'myTableSnapshot-122112'

5.从快照复制生成一个新表

$ ./bin/hbase shell
hbase> clone_snapshot 'myTableSnapshot-122112', 'myNewTestTable'

6.用快照恢复数据,它需要先禁用表,再进行恢复

$ ./bin/hbase shell
hbase> disable 'myTable'
hbase> restore_snapshot 'myTableSnapshot-122112'

提示:因为备份(replication)是系统日志级别的,而快照是文件系统级别的,当使用快照恢复之后,副本会和master出于不同的状态,如果你需要使用恢复的话,你要停止备份,并且重置bootstrap。

如果是因为不正确的客户端行为导致数据丢失,全表恢复又需要表被禁用,可以采用快照生成一个新表,然后从新表中把需要的数据用map-reduce拷贝到主表当中。

7.复制到别的集群当中

该操作要用hbase的账户执行,并且在hdfs当中要有hbase的账户建立的临时目录(hbase.tmp.dir参数控制)

采用16个mappers来把一个名为MySnapshot的快照复制到一个名为srv2的集群当中

$ bin/hbase class org.apache.hadoop.hbase.snapshot.tool.ExportSnapshot -snapshot MySnapshot -copy-to hdfs://srv2:8020/hbase -mappers 16
05-23 17:27