HBase MemStore与WAL工作机制
请解释HBase中MemStore和WAL(Write-Ahead Log)的作用和工作流程,以及它们如何保证数据一致性。
回答
Yahuda
写入流程总览:
写入请求 → WAL(持久化) → MemStore(内存) → 达到阈值 → Flush → HFile(磁盘)
WAL(Write-Ahead Log / HLog):
作用: 保证数据写入的持久性和容错性,类似数据库的Redo Log。
工作流程:
- 每次写入(Put/Delete)先写入WAL文件(顺序写,高性能)
- WAL写入成功后,再写入MemStore
- 如果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:
作用: 内存中的数据缓冲区,将随机写转换为顺序写。
工作流程:
- 数据写入MemStore(Sorted Map结构,按RowKey排序)
- 达到阈值(
hbase.hregion.memstore.flush.size,默认128MB)触发Flush - Flush时,MemStore数据写入HFile(HDFS)
- Flush完成后,对应的WAL可以被清理
MemStore类型:
- DefaultMemStore(HBase 2.x): 使用ConcurrentSkipListMap + CellChunkMap
- CompactingMemStore: Flush前先对数据做Compaction,减少HFile数量
数据一致性保证:
- 写入:WAL写成功后才返回客户端ACK → 宕机时WAL可恢复
- 读取:先读MemStore(最新数据),再读HFile
- Flush失败:回滚,下次重试