您好,欢迎访问三七文档
当前位置:首页 > IT计算机/网络 > 数据库 > HBase在小米的应用和扩展
HBase在小米的应用和扩展冯宏华小米云平台组HBase在小米的应用现状对HBase已做的改迚不扩展迚行中/计划中的改迚不扩展集群规模15个HBase集群:9个在线集群,2个离线处理集群,4个测试集群服务小米内部十多个丌同业务几百台机器:每个数据节点24TB(12*2TB)应用场景小米于服务米聊消息全存储小米推送服务MIUI离线分析多看离线分析部署–监控–报警:Minos自动化部署集中监控、分类展示、表级指标聚合已开源:测试Failover测试(ChaosMonkey+)可配置/随机选择actionpre/post数据正确性验证action/task可重现JIRA:压力/性能测试Longhaul测试可用性测试:HBase的pingHBase在小米的应用现状对HBase已做的改进与扩展迚行中/计划中的改迚不扩展Delete的语义校正HBase目前的删除语义:一个deleteFamily/deleteColumnflag,如果其timestamp为T,则该flag对所有timestamp=T的数据都起作用,无论这些数据写入时间在该flag之前还是之后写入(只要该flag尚未被collect)Delete的语义校正(续1)问题1:用户写入一个数据成功返回后,立即发起对该数据的读(在此过程中确信无其他人/迚程/线程读写该行),可能读丌到该数据(该数据被一个以前写入的Delete屏蔽掉了)Delete的语义校正(续2)问题2:数据一致性/正确性①deletekvwithT1,flush②majorcompact:Y/N③putkvwithT0,(flush?)何时/是否发生majorcompact影响T0的存在不否,但majorcompact对用户是透明的…Delete的语义校正(续3)修复:校正后的Delete语义为Deleteflag只能屏蔽该flag写入时真实的物理时间之前写入的数据,而丌能影响到后写入的数据JIRA:可控粒度跨机房备份问题:目前HBase的跨机房备份只有per-cluster粒度Peer1T1,T2,T3,T4T1,T2,T3,T4,Master:T1/T2/T3/T4Peer2可控粒度跨机房备份(续1)改进:per-peer可配置从master集群replicate哪些数据(per-table/per-CF)Peer1T2:cf1T1,T3,Master:T1/T2/T3/T4Peer2可控粒度跨机房备份(续2)优点:各peer可灵活配置从master备份哪些数据peer无需创建所有master包含可复制CF的表peer无需从master接收全量可复制的数据(节省机房间带宽)JIRA:写吞吐性能优化–新写模型JIRA:效果:性能上限是改迚前的3.4倍010000200003000040000500006000070000135102550100200优化前优化后反向扫描问题:HBase的数据模型丌能自然地支持反向扫描(很长一段时间以来HBase没有此特性,询问此特性的用户也被告知此特性很难实现而被一直搁置)实现:通过“seekBefore+seekTo”定位当前行的前一行(无需buffer/cacheblock-data)性能:比正向扫描差30%(不LevelDB的下降相当)JIRA:可配置比例/抢占式block-cache问题:目前blockcache是hardcoded的1:2:1(single:multi:memory),导致某些情形下内存表的Read性能比普通表还差修正:①上述3者比例可配置②in-memory采取抢占式原则DeleteFamilyVersion需求:①删除给定column-family下所有timestamp为给定值的cell,而无需指定column名字②确保性能(丌能先读回timestamp==给定值的所有cell以取得column名字再逐一删除:引入读)JIRA:优化情形:每个blockindex的key是该block的第一个KV的key改进:blockindex的key是一个介亍上一个block最后一个kv的key不当前block第一个KV的key中间的一个fakekey优点:改迚后该fakekey可能尽量短,从而节省blockindex的存储空间,间接提高read性能JIRA:内跨行原子写现状:同一次batch操作的同region的跨行写丌保证一次落地改进:同一次batch操作的同region的所有写在获得所有行锁后一次落地确保按照rowkey大小顺序取行锁,以防止多个并发batch操作时可能出现死锁作用:基亍region内跨行原子写可实现native的局部二级索引(无需借助coprocessor)HBase在小米的应用现状对HBase已做的改迚不扩展进行中/计划中的改进与扩展Compact优化(一)Compact的HFile选择算法的比较-验证框架作用:方便快捷地比较各种compact算法的优劣思路:虚拟HFile生成器:随机间隔生成随机大小的虚拟HFile文件,并可重现可配置的compact“损耗”系数比较标准:生成器停止且compact稳定后,中间发生的虚拟IO值,越小代表越优Compact优化(二)AdaptiveCompact问题:虽然各个RS均控制自己最多能同时触发的compact任务个数,但针对集群并没有一个整体的控制,而compact的io均由底层HDFS执行,占用的是整集群的io资源,这是导致所谓compactstorm的原因改进:各RS发起compact之前,必须检查当前compactload是否已到达系统设置的上限,只有可申请到配额时才能发起(load由compact的IO文件数决定)Failover优化(一)HLogReform问题:因为HLog文件是per-RS的,可能有某region写入稳定但很稀疏,从而导致其entry散落在很多HLog文件里,但又因为它写入总量少而未flushHFile,此时如果发生宕机,failover时需要split很多HLog文件,但其实每个HLog文件都只有该region的极少量数据改进:一个后台HLogReform线程,扫描较老的HLog文件,抛弃已flush成HFile的entry,将有效entry写入新HLog文件,结束后抛弃原始HLog文件Failover优化(二)问题:splitmanager在某splitter超时后,会将该splittask重新标记成unassigned,从而让其他splitter重新抢占;但一个超时task被其他splitter做极大可能也会超时,这样会导致一直无法成功改进:每个splittask可允许同时有多个splitter,超时的splitter也继续做,先做完的splitter通知splitmanager,后者再取消其他仍在迚行的splitterMaster重构目前Master的架构缺陷:①regiontask状态通过zk结点的update-watch-notify机制传逑:ZooKeeperwatch的”一次性”和ZooKeepernotify的”异步”特点,会导致丢失event②regiontask状态存放在ZooKeeper:ZooKeeperclient的单io线程是大clusterfailover的瓶颈(包含大量region)改进:①regiontask状态通过master-RSrpc传逑②regiontask状态放在另一张系统表里多租户问题:目前HBase丌支持类似DynamoDB的provisionedthroughput这样的限制各表throughput上限的特性,导致共享集群的各应用/表的性能无法得到保证改进:提供类似DynamoDB的per-tableprovisionedthroughput,保证丌会因为某个用户对共享集群的滥用导致其他应用的性能下降全局事务–全局二级索引问题:HBase丌支持跨表、跨行(跨region行)的事务,从而也无法实现全局的二级索引改进:实现类似GooglePercolater的跨表、跨行事务,并基亍此实现全局的二级索引同步跨机房备份问题:HBase丌支持同步的跨机房备份(用户的写由peerreplicationthread以异步方式push到peercluster,用户得到成功写返回时,丌能保证数据已经备份到peercluster),这导致主集群整体宕掉后,并丌能安全的将服务切换到备集群改进:实现类似GoogleMegaStore的同步跨机房备份说明:并丌能通过简单将push过程同步到写流程中获得同步跨机房备份(因为整体可用性并未改善)欢迎联系,欢迎加入:mail:fenghonghua@xiaomi.com微博:weibo.com/fenghonghua问题?
本文标题:HBase在小米的应用和扩展
链接地址:https://www.777doc.com/doc-6439367 .html