基于本文回答

播面 播面

文图音视,全方位拆解八股文
0
评论

HBase数据在被删除(Delete)或过期(TTL)后,是在什么时候、通过什么机制被真正物理删除的?

知识点图片

在 HBase 中,无论是通过显式删除(Delete)还是由于数据过期(TTL),数据都不会被立即物理删除。HBase 采用的是基于 LSM-Tree(Log-Structured Merge-Tree)的架构,物理删除是一个异步的过程。

简单来说,真正物理删除的核心机制是 Compaction(合并),而最终从磁盘(HDFS)上抹去数据的机制是 HFileCleaner(后台清理线程)

以下是具体的机制和时间线详解:

第一阶段:逻辑删除 / 标记(立即发生)

  1. 显式删除(Delete)
    • 当你执行 Delete 操作时,HBase 不会去修改底层的 HFile(因为 HFile 是不可变的)。
    • 相反,它会在 MemStore 中写入一条特殊的标记数据,称为 Tombstone(墓碑标记)
    • 当客户端读取数据时,HBase 会将正常数据和 Tombstone 进行合并,如果发现有 Tombstone 覆盖了正常数据,就不把该数据返回给客户端。
  2. 数据过期(TTL)
    • TTL 过期连 Tombstone 都不会产生。
    • 客户端读取数据时,HBase 会实时检查数据的 Timestamp(时间戳)。如果 当前时间 - 时间戳 > TTL,HBase 就会在内存中过滤掉这条数据,表现得就像它不存在一样。

第二阶段:数据真正从 HFile 中被剔除(Compaction 机制)

数据真正在底层文件中被剔除,发生在 Compaction(文件合并) 阶段。Compaction 分为两种:

  1. Minor Compaction(小合并)

    • 机制:将几个小的 HFile 合并成一个较大的 HFile。
    • TTL数据:在 Minor Compaction 过程中,如果 HBase 发现某些数据已经超过了 TTL,它直接将这些过期数据丢弃,不写入新的 HFile 中。
    • Delete数据(Tombstone):Minor Compaction 通常不会丢弃 Tombstone 标记和被标记删除的数据。为什么?因为被删除的历史数据可能存在于没有参与本次合并的更老的 HFile 中。如果现在就把 Tombstone 删了,老 HFile 中的数据就会在下次查询时“死灰复燃”。
  2. Major Compaction(大合并)—— 物理清理的关键时刻

    • 机制:将一个 Region 下某一个 Column Family 的所有 HFile 合并成一个单独的、巨大的 HFile。
    • 此时发生了什么:因为所有的 HFile 都在一起合并,HBase 掌握了全局信息。它确信没有遗漏的历史数据了。
    • 执行剔除:在写入新的大 HFile 时,HBase 会彻底丢弃所有超过 TTL 的数据、所有的 Tombstone 标记,以及被 Tombstone 标记掩盖的旧数据。
    • 何时触发:Major Compaction 通常是系统自动周期性触发(默认配置通常为 7 天,但生产环境一般为了避免 IO 风暴会关闭自动触发,改为在业务低谷期定时手动触发)。

第三阶段:真正的物理磁盘空间释放(HDFS 级别)

你可能会问:Major Compaction 生成了没有过期数据和删除数据的新 HFile,那么旧的 HFile 怎么办?这就涉及到了 HDFS 层面的物理删除。

  1. 移入 Archive 目录
    Major Compaction 完成后,旧的 HFile(包含了被删除和过期数据的旧文件)不会立刻被 rm 掉。HBase 会将它们移动到 HDFS 上的一个归档目录(/hbase/archive/)。
  2. HMaster 的 HFileCleaner(垃圾回收)
    • HBase Master 节点上运行着一个后台守护线程,叫做 HFileCleaner(默认每 10000 毫秒/10秒 运行一次)。
    • 它会定期去检查 archive 目录下的文件。
    • 它会判断这些旧的 HFile 是否还在被其他机制使用(例如:是否有正在使用的 Snapshot(快照) 依赖这些文件?是否有其他的引用?)。
    • 如果没有任何组件依赖这些旧 HFile,HFileCleaner 就会向 HDFS 发起真正的 delete 指令。
  3. 彻底释放空间
    HDFS 接收到删除指令后,执行 HDFS 级别的块清理,此时,磁盘空间才真正意义上被释放

特殊情况(可能导致不被物理删除的配置)

在某些特定配置下,即使经过了 Major Compaction,过期或被删除的数据也不会被物理删除:

  1. MIN_VERSIONS > 0
    如果你设置了列族的 MIN_VERSIONS=1(最小保留版本数为1),那么即使数据超过了 TTL,只要它是该 RowKey 的唯一一个版本,HBase 也会强制保留它,不会在 Compaction 时将其物理删除。
  2. KEEP_DELETED_CELLS=true
    如果列族开启了这个属性,即使数据被打了 Tombstone 标记,在 Major Compaction 时,底层的旧数据也会被保留(通常用于特定的时间旅行/回溯查询场景)。

总结

  • 什么时候? 数据过期或被执行 Delete 后,要等到下一次 Major Compaction(大合并) 执行,并且旧文件被 HFileCleaner 清理后,才会真正物理删除。这个周期可能是几天,甚至更长(取决于集群的 Compaction 策略)。
  • 什么机制? 依赖于 LSM-Tree 的 Compaction 机制(在合并重写文件时丢弃无效数据)和 HMaster 的 HFileCleaner 线程(在 HDFS 层面物理删除废弃的老 HFile)。
00:00
00:00