CodeWalk

HBase MemStore与WAL工作机制

作者:Yahuda · 2026-05-30 12:55

请解释HBase中MemStore和WAL(Write-Ahead Log)的作用和工作流程,以及它们如何保证数据一致性。

回答

Yahuda

写入流程总览:

写入请求 → WAL(持久化) → MemStore(内存) → 达到阈值 → Flush → HFile(磁盘)

WAL(Write-Ahead Log / HLog):

作用: 保证数据写入的持久性和容错性,类似数据库的Redo Log。

工作流程:

  1. 每次写入(Put/Delete)先写入WAL文件(顺序写,高性能)
  2. WAL写入成功后,再写入MemStore
  3. 如果RegionServer宕机,Master通过回放WAL恢复数据

WAL配置:

  • hbase.wal.provider:filesystem(默认)/ multiwal(多WAL并行)
  • hbase.regionserver.hlog.blocksize:WAL文件大小(默认HDFS block size)
  • hbase.regionserver.optionallogflushinterval:WAL刷盘间隔(默认1秒)
  • hbase.regionserver.logroll.period:WAL滚动周期(默认1小时)

WAL的ASync/Sync模式:

  • hbase.client.write.wal
    • SKIP_WAL:不写WAL(性能最高,但有数据丢失风险)
    • ASYNC_WAL:异步刷盘(性能中等)
    • SYNC_WAL(默认):同步刷盘(数据安全)

MemStore:

作用: 内存中的数据缓冲区,将随机写转换为顺序写。

工作流程:

  1. 数据写入MemStore(Sorted Map结构,按RowKey排序)
  2. 达到阈值(hbase.hregion.memstore.flush.size,默认128MB)触发Flush
  3. Flush时,MemStore数据写入HFile(HDFS)
  4. Flush完成后,对应的WAL可以被清理

MemStore类型:

  • DefaultMemStore(HBase 2.x): 使用ConcurrentSkipListMap + CellChunkMap
  • CompactingMemStore: Flush前先对数据做Compaction,减少HFile数量

数据一致性保证:

  • 写入:WAL写成功后才返回客户端ACK → 宕机时WAL可恢复
  • 读取:先读MemStore(最新数据),再读HFile
  • Flush失败:回滚,下次重试