淘宝在hbase中的应用和优化

我们从2011年3月开始研究hbase如何用于在线服务 。尽管之前在一淘搜索中己经有了几十节点的离线服务 。这是因为hbase早期版本的目标就是一个海量数据中的离线服务 。2009年9月发布的0.20.0版本是一个里程碑,应用正式成为了hbase的目标,为此hbase引入了来做为以及的管理 。2011年1月0.90.0版本是另一个里程碑,基本上我们今天看到的各大网站,如/ebay/yahoo内所使用于生产的hbase都是基于这一个版本(fb所采用的0.89版本结构与0.90.x相近) 。等诸多属性加入了进来,性能也有极大提升 。基于此,淘宝也选用了0.90.x分支作为线上版本的基础 。
第一个上线的应用是数据魔方中的prom 。prom原先是基于redis构建的,因为数据量持续增大以及需求的变化,因此我们用hbase重构了它的存储层 。准确的说prom更适合0.92版本的hbase,因为它不仅需要高速的在线读写,更需要count/group by等复杂应用 。但由于当时0.92版本尚未成熟,因此我们自己单独实现了 。prom的数据导入是来源于云梯,因此我们每天晚上花半个小时将数据从云梯上写入hbase所在的hdfs,然后在web层做了一个转发 。经过一个月的数据比对,确认了速度比之redis并未有明显下降,以及数据的准确性,因此得以顺利上线 。
第二个上线的应用是,是一个高效的、可靠的、可扩展的实时数据传输平台,广泛应用于实时日志收集、数据实时监控、广告效果实时反馈、数据库实时同步等领域 。它与prom相比的特点是增加了在线写 。动态的数据增加使hbase上//split/等诸多特性受到了极大的挑战 。TT的写入量大约一天20TB,读的量约为此的1.5倍,我们为此准备了20台的集群,当然底层的hdfs是公用的,数量更为庞大(下文会提到) 。每天TT会为不同的业务在hbase上建不同的表,然后往该表上写入数据,即使我们将的大小上限设为1GB,最大的几个业务也会达到数千个这样的规模,可以说每一分钟都会有数次split 。在TT的上线过程中,我们修复了hbase很多关于split方面的bug,有好几个到了hbase社区,同时也将社区一些最新的patch打在了我们的版本上 。split相关的bug应该说是hbase中会导致数据丢失最大的风险之一,这一点对于每个想使用hbase的开发者来说必须牢记 。hbase由于采用了LSM-Tree模型,从架构原理上来说数据几乎没有丢失的可能,但是在实际使用中不小心谨慎就有丢失风险 。原因后面会单独强调 。TT在预发过程中我们分别因为Meta表损坏以及split方面的bug曾经丢失过数据,因此也单独写了meta表恢复工具,确保今后不发生类似问题(hbase-0.90.5以后的版本都增加了类似工具) 。另外,由于我们存放TT的机房并不稳定,发生过很多次宕机事故,甚至发生过假死现象 。因此我们也着手修改了一些patch,以提高宕机恢复时间,以及增强了监控的强度 。
CTU以及会员中心项目是两个对在线要求比较高的项目,在这两个项目中我们特别对hbase的慢响应问题进行了研究 。hbase的慢响应现在一般归纳为四类原因:网络原因、gc问题、命中率以及的反序列化问题 。我们现在对它们做了一些解决方案(后面会有介绍),以更好地对慢响应有控制力 。

淘宝在hbase中的应用和优化

文章插图
和类似,我们也使用了hbase做为实时计算类项目的存储层 。目前对内部己经上线了部分实时项目,比如实时页面点击系统,实时交易推荐以及直播间等内部项目,用户则是散布到公司内各部门的运营小二们 。与的puma不同的是淘宝使用了多种方式做实时计算层,比如是使用类似affa的actor模式处理交易数据,同时关联商品表等维度表计算排行(TopN),而实时页面点击系统则是基于开源的storm进行开发,后台通过TT获取实时的日志数据,计算流将中间结果以及动态维表持久化到hbase上,比如我们将设计为url+,并读出实时的数据,从而实现实时计算各个维度上的uv 。