HFile和HLog的回收机制

简介:

正常回收流程
HBase数据主要存储在分布式文件系统上HFile和HLog文件中。HBase数据基于LSM模型,写操作写到内存(MemStore)和Write Ahead Log(HLog, 放在.logs下regionserver目录下)就返回。
当内存不足或者MemStore超过一定大小的时候,HBase会将MemStore的数据顺序写到分布式文件系统上,形成一个HFile。
当RegionServer进程down机时候,regionserver的log目录会被HMaster重命名(添加-splitting后缀),目录下所有hlog会被logSpliter分割成为各个region的recover.edits. 当log split完成之后,HMaster会将log移动到.oldlog目录下。
当小的HFile过多的时候,会将多个小的HFile压缩形成一个大的HFile。压缩完成之后这些小的HFile就被移动.archive目录下。
如果HLog里所有记录对应的数据都已经刷新到HFile上,HLog就被RegionServer移动到.oldlog目录下。
HMaster上的定时线程HFileCleaner/LogCleaner周期性扫描archive目录和.oldlog目录, 判断目录下的HFile或者HLog是否可以被删除,如果可以, 就直接删除文件.

recyling

TimeToLive
为了防止系统错误删除HFile/HLog, HFile/HLog都有一个全局的过期时间(TTL), 超过这个过期时间的HFile/HLog才被删除. 这个过期时间可以通过hbase.master.logcleaner.ttl和hbase.master.hfilecleaner.ttl配置(单位是ms)

Replication
HBase的Replication是通过将主集群的HLog推送到备集群,然后在备集群上重放Hlog实现的, 因此如果在oldlog目录下的HLog还在被Replication推送完成,这些文件不能删除。

HMaster上的ReplicationLogCleaner通过zk负责记录Replication正在使用那些HLog。

当Regionserver创建一个新的hlog时,Replication会在对应zk replication目录下建立相应的hlog节点,即将hlog加入replication队列。
ReplicationLogCleaner会收到zk上replication目录节点创建的通知,将此hlog标记为使用中。
当Replication推送完成hlog的数据后,replicaton会将zk上replication目录下hlog节点删除。
ReplicationLogCleaner会收到节点删除通知,将此hlog标记为可删除。
当然需要注意的是一个hlog可能同时被多个不同peer的replication使用,只有当所有不同peer的replication都推送完成这个hlog的数据之后,这个hlog才能被删除。

SnapShot
标的Snapshot在单独的snapshot目录下,创建了表结构和HFile的引用。HMaster上SnapshotFileCache会定期扫描分布式文件系统上的snapshot目录,标记那些HFile现在被某个Snapshot引用。HMaster上的HFileCleaner在尝试删除HFile时候会通过SnapshotHFileCleaner检查HFile是否被引用,如果被引用就不能删除。

Region Split
当Region大小超过一定阈值时,Region会自动分裂成两个子Region. Region Split执行时间是秒级别的.

Split前父Region会预flush一次,然后关闭Region的写,最后做一次flush, 保证Region所有的数据都写到HFile中。
Split时两个Region并不实际分割父Region的HFile,而是在子Region目录下生成父region所有HFile引用。 这些引用指向实际的HFile文件,子Region Compaction时候,会删除这些引用,生产真实的HFile。
HMaster上定时线程CatalogJanitor会周期性扫描出Meta表上的分裂后的父Region,通过父Region找到分裂后的两个子Region。通过扫描两个子Region的hdfs目录,确认两个子Region是否还有到父Region的引用(HFile 引用是有特殊的文件名)。确认子Region中所有引用HFile都被compaction回收之后,CatalogJanitor线程会将父Region的HFile,被移动到archive目录下,删除meta表上遗留的父region数据,已经父region的hdfs目录。

相关实践学习
lindorm多模间数据无缝流转
展现了Lindorm多模融合能力——用kafka API写入,无缝流转在各引擎内进行数据存储和计算的实验。
云数据库HBase版使用教程
  相关的阿里云产品:云数据库 HBase 版 面向大数据领域的一站式NoSQL服务,100%兼容开源HBase并深度扩展,支持海量数据下的实时存储、高并发吞吐、轻SQL分析、全文检索、时序时空查询等能力,是风控、推荐、广告、物联网、车联网、Feeds流、数据大屏等场景首选数据库,是为淘宝、支付宝、菜鸟等众多阿里核心业务提供关键支撑的数据库。 了解产品详情: https://cn.aliyun.com/product/hbase   ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
WAL文件回收
WAL文件回收
54 0
|
存储 关系型数据库 API
应用PMDK修改WAL操作使之适配持久化内存
应用PMDK修改WAL操作使之适配持久化内存
122 0
|
消息中间件 关系型数据库 Shell
记录贴:sentry磁盘占用过大如何清理?
记录贴:sentry磁盘占用过大如何清理?
1202 0
|
存储 缓存 分布式计算
Spark 缓存和检查点机制
Spark 缓存和检查点机制
131 0
|
缓存
GoogleGuava - 第 3 章 缓存——缓存回收
GoogleGuava - 第 3 章 缓存——缓存回收
103 0
GoogleGuava - 第 3 章 缓存——缓存回收
|
存储 索引
LotusDB 设计与实现—3 内存 memtable
顾名思义,memtable 是内存中维护的组件,在 LSM Tree 存储模型中,memtable 相当于一块内存 buffer,数据写入到 WAL 后,然后在 memtable 中更新。memtable 的数据积累到一定的阈值之后,批量 Flush 到磁盘,这样做的目的是延迟写磁盘,并且将随机的 IO 写入转换为批量的顺序 IO,这也是 LSM 存储模型的核心思路。
169 0
如何清理磁盘
我们的电脑在使用的过程当中会出现很多的垃圾占用内存,我们每天使用电脑之后清理一下比较好
如何清理磁盘
|
存储 算法 分布式数据库
HBase 加载Hfile时的读取过程
Hfile分为4部分,其中loadOnOpen section 和trailer这2部分是open file时就会加载到内存的,本文简述其读取步骤。
1909 0
HBase 加载Hfile时的读取过程