HBase Snapshot
Page content
之前将过BulkLoad可以离线的写入HBase,并且不会出发HBase的写流程,从而减轻HBase的压力、提高写入速度。在读取HBase的时候,也有一个机制,可以直接绕过HBase的读取流程,直接读取HFile,也就是Snapshot机制。
Snapshot原本是为了快速备份HBase设计的。但是我们使用这个功能来快速扫表,效果惊艳。
Snapshot技术基础原理
为什么Snapshot可以做到这么快呢?主要是因为HBase给表打Snapshot的时候,并没有真正的备份数据,生成了原始数据的一个指针。
能这样做得益与HBase落盘的数据都不会再修改,直到compact。
所以Snapshot的总体流程是这样的:
- Memstore flush生成新文件
- 对当前所有的Hfile建立引用指针。
Snapshot具体流程
Snapshot是由客户端发起的,但是真正执行这一动作的是RegionServer,RegionServer非常多,这会导致Snapshot的事务问题,HBase通过两阶段提交来解决这个问题:
我们都知道两阶段提交的过程包括:
- 协调者发起prepare,等待ack
- 执行者准备环境,发送ack
- 协调者收到所有的ack之后,发起commit
具体到Snapshot的实现中,两阶段提交主要是通过Zk为媒介进行的。
Snapshot具体实现
前面将了Snapshot的流程,其中重要概念就是这个引用文件。
引用文件主要包含了region的元数据,HFile文件名等。
Snapshot之后遇到Compaction
前面说到,snapshot文件只是真实HFile的引用文件,如果发生compaction之后,原文件不在了,snapshot如何保证不失效的呢?
HBase 的做法很简单,就是在compact之前,将原始数据转移到archive目录里面。