HBase是模仿google bigtable的开源产品又是hadoop的衍生品hadoop作为离线计算系统已经得到业界的普遍认可并经过N多公司大规模使用的验证自然地认为Hbase也将随之获得成功。《HBase: The Definitive Guide》第8章讲述hbase的架构从架构上看其架构很完美LSM - 解决磁盘随机写问题(顺序写才是王道)HFile - 解决数据索引问题(只有索引才能高效读)WAL - 解决数据持久化(面对故障的持久化解决方案)zooKeeper - 解决核心数据的一致性和集群恢复Replication - 引入类似MySQL的数据复制方案解决可用性此外还有自动分拆Split、自动压缩(compaction,LSM的伴生技术)、自动负载均衡、自动region迁移。看上去如此美好完全无需人工干预貌似只要将Hbase搭建好一切问题Hbase都将应对自如。面对如此完美的系统不动心很难。但是如此完美的系统或许也意味着背后的复杂性是不容忽略的。hbase的代码量也不是一星半点的。假如系统工作不正常谁来解决这是至关重要的。性能与测试Hbase系统自身提供了性能测试工具./bin/hbase org.apache.hadoop.hbase.PerformanceEvaluation该工具提供了随机读写、多客户端读写等性能测试功能。根据工具测试的结果看hbase的性能不算差。对于hbase这样的系统长期稳定运行比什么都重要。然而这或许就不那么完美。测试版本hbase 0.94.1、 hadoop 1.0.2、 jdk-6u32-linux-x64.bin、snappy-1.0.5.tar.gz测试hbase搭建14台存储机器2台master、DataNode和regionserver放在一起。hbase env配置View Codehbase-size.xml关键配置(根据《HBase: The Definitive Guide》第11章优化)View Code测试一高并发读(4w/s) 少量写(允许分拆、负载均衡)症状1-2天后hbase挂掉(系统性能极差不到正常的10%)。其实并非全部挂掉而是某些regionserver挂了并在几个小时内引发其他regionserver挂掉。系统无法恢复单独启regionserver无法恢复正常。重启后正常。测试二高并发读(4w/s)症状1-2天后hbase挂掉(系统性能极差不到正常的10%)。后发现是由于zookeeper.session.timeout设置不正确导致(参见regionserver部分http://hbase.apache.org/book.html#trouble)。重启后正常。测试三高并发读(4w/s)症状1-2天后hbase挂掉(系统性能极差不到正常的10%)。从log未看出问题但regionserver宕机且datanode也宕机。重启后正常。测试四高并发读(4w/s)禁止分拆、禁止majorcompaction、禁止负载均衡(balance_switch命令)症状1-2天后hbase挂掉(系统性能极差不到正常的10%)。从log未看出问题但regionserver宕机且datanode也宕机。重启后正常。测试期间还发现过无法获取.MATE.表的内容(想知道regionserver的分布情况)、hbase无法正确停止、hbase无法正确启动(日志恢复失败文件错误最终手动删除日志重启)。其他缺陷HBase使用JAVA开发看上去很美的GC使用中代价可不小。Hbase为了保证数据强一致性每个key只能由一个regionserver提供服务。在下列情况下Hbase服务质量都将受损1) GC CMS -- CMS回收内存极其耗时当hbase运行1-2天后CMS可能耗时10分钟这期间该regionserver无法服务。CMS经常被触发这意味着hbase的服务经常会因为GC操作而部分暂停2) regionserver宕机 - 为了强一致性每个key只由一个regionserver提供服务故当regionserver宕机后相应的region即无法服务3) major compaction、split不可控 - 大量磁盘操作将极大影响服务。(levelDB也需要major compaction只是使用更加可控的方式做压缩比如一次只有一个压缩任务。是否影响服务待测试)4) 数据恢复 - 数据恢复期间设置WAL log的相关操作在数据恢复期间regionserver无法服务结论或许通过研究hbase的源码可让hbase稳定运行但从上述测试结果看1hbase还无法稳定长期运行2hbase系统很脆弱故障恢复能力差。基于此判断hbase还无法满足大规模线上系统的运维标准只能放弃。考虑到hbase重启基本可恢复正常故hbase还是可作为离线存储系统使用。