面试题答案
一键面试1. MemStore 简介
MemStore 是 HBase 中 RegionServer 上的一个内存数据结构,用于临时存储写入的数据。当 MemStore 达到一定阈值(如hbase.hregion.memstore.flush.size
默认 128MB)时,会将数据 flush 到磁盘形成 HFile。
2. 故障前 MemStore 状态
- 数据结构:MemStore 本质上是一个按 key 排序的
NavigableMap
(如ConcurrentSkipListMap
),以KeyValue
形式存储数据。每个KeyValue
包含行键(RowKey)、列族(Column Family)、列限定符(Column Qualifier)、时间戳(Timestamp)和值(Value)等信息。 - 写入过程:客户端写入的数据首先进入 MemStore,按 key 有序插入。这个插入操作是线程安全的,利用了
ConcurrentSkipListMap
的特性。
3. 故障中 MemStore 状态
- 数据丢失风险:由于 MemStore 数据在内存中,一旦 RegionServer 故障,内存中的 MemStore 数据会丢失。为防止这种情况,HBase 引入了预写日志(Write-Ahead Log,WAL)。每次写入 MemStore 之前,数据会先写入 WAL。
- 一致性问题:在故障瞬间,可能存在部分数据已写入 WAL 但未完全同步到 MemStore 的情况,这可能导致数据不一致。
4. 故障恢复后 MemStore 状态
- 重放 WAL:故障恢复时,RegionServer 会重放 WAL 日志。从 WAL 中读取未完成的写入操作,并重新应用到 MemStore 中。这个过程确保了故障前已写入 WAL 的数据能够恢复到 MemStore 中。
- 数据一致性保障:通过重放 WAL,保证了 MemStore 在故障恢复后的数据与故障前尽可能一致。一旦 MemStore 恢复到故障前的状态,后续的数据 flush 等操作可以继续正常进行,维持数据从 MemStore 到 HFile 的一致性流转。
5. 总结
- HBase 通过 WAL 机制,在故障前记录写入操作,故障恢复时重放 WAL 日志,使得 MemStore 数据在故障恢复后能够达到与故障前尽可能一致的状态,保障了数据一致性。MemStore 内部按 key 有序存储的
NavigableMap
结构,配合 WAL 的持久化和重放机制,共同维持了 HBase 数据在故障恢复过程中的一致性。