snapshot其实就是一组metadata信息的集合,它可以让管理员将表恢复到以前的一个状态。snapshot并不是一份拷贝,它只是一个文件名的列表,并不拷贝数据。一个全的snapshot恢复以为着你可以回滚到原来的表schema和创建snapshot之前的数据。

应用场景

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

    1获取:该操作尝试从指定的表中获取一个snapshot。该操作在regionsbalancingsplit或者merge等迁移工作的时候可能会失败。
    2拷贝:该操作用指定snapshotschema和数据来创建一个新表。该操作会不会对 原表或者该snapshot造成任何影响。
    3恢复: 该操作将一个表的schemadata回滚到创建该snapshot时的状态。
    4删除:该操作将一个snapshot从系统中移除,释放磁盘空间,不会对其他拷贝或者snapshot造成任何影响。
    5导出:该操作拷贝这个snapshotdatametadata到另一个集群。该操作仅影响HDFS,并不会和hbaseMaster或者Region Server通信(这些操作可能会导致集群挂掉)。

 首先我们要理解,HBase的底层存储文件HFile是什么,以及是怎么被生成的、怎么被删除的(或者叫生命周期)。其次就不难理解Snapshot为什么不需要复制业务数据了。
1. HFile是什么
HBase是一个Key-Value数据库,其基本数据操作(如PutDelete等)最后都化归为Key-Value对,存储在HDFS的一个个文件(HFile)中:
 hbase snapshot 表备份/恢复 Hadoop

注意上图绿色的Key字段中,最后有个1 Byte的Key Type域,即是用来区分Put和Delete的。

另外更需注意的一点是,HBase的Delete操作并不是立即定位到目标数据将其删除或者做个删除标记,因为HDFS不支持这种随机写。Delete操作也跟Put一样存储,只是Key Type域不一样,以及Value域为空而已。HBase在读取时,会将拥有Delete操作的数据过滤掉。而具体何时删除目标数据,则是在对HFile做Compaction时。

2. HFile的两种生成方式
HFile有两种生成方式,分别是MemStore Flush和Compaction
    MemStore Flush
    写操作(Put、Delete等)在WAL(Write-Ahead Log)提交成功后,马上会写入对应Region Server的内存缓冲区(MemStore)中。在MemStore里这些操作是按key排好序的。当MemStore写满时,就会将这些数据写入到HDFS中成为一个HFile。
    Compaction
    HFile内部的数据是按key排好序的,但HFile之间的数据并不能保证key的顺序,也就是说,对于新生成的HFile,其里面的key值并不都比老的HFile的大。因此每次检索时,都需要在所有HFile中检索一次,再将结果合并。虽然HBase针对这个设计了各种加速机制(如Bloom Filter),但HFile文件数目一多还是会比较吃力,因此就需要对HFile做合并操作(Compaction)。Compaction分为minor和major两种级别,本质上都是从几个HFile生成合并后的HFile(类似于合并几个有序数组),然后,老的HFile被删除,起用合并后的HFile。

3. HFile何时会被删除
上面提到过的,在完成Compaction后,老的HFile就会被删除,起用合并后的HFile。

4. Snapshot操作的实现
细心的你是否发现了一个事实,HFile是不会被追加或者修改的!HFile一旦生成,就不会再被改变,只有被拿去合并后,生成了新的HFile,完成自己的使命时才会被删除。

那如果不删除呢?
比如说,我今天建了个表开始跑业务,这个表总共生成了10个HFile,第二天又生成一些HFile,并因此触发了合并操作,现在启用的HFile里有一些是老的没被合并的,有一些是新的由合并产生的。如果昨天那10个HFile还在,那我只要让这个表启用原来的这10个HFile,不就回滚到昨天的状态了嘛。依靠的是什么?就是这10个HFile自从诞生之后就不会被改动,连追加都不会。他们像琥珀一样,记录了这个表昨天的所有数据。

因此,建立Snapshot其实就是把当前所有启用的HFile文件名记录下来,并提醒系统在Compaction时不要删除它们。恢复Snapshot就是重新启用当时的那些HFile。当然这两句话说得不严谨,还有一些细节要处理,比如建Snapshot时要把内存里的东西也存下来先。具体是这样的:
    建立Snapshot
    1,Master与RegionServer同步,让他们同时进行MemStore flush
    2,记录MetaData,即当前表有哪些region,每个region使用的HFile是哪些
    3,“标记”HFile以防被删除
    *建立Snapshot的过程不需要让表下线。

    恢复Snapshot
    根据Snapshot对应的MetaData恢复各个region,该表需要先下线

5.HBase Shell: Snapshot 操作
想使用snapshot功能,请确认你的hbase-site.xml中的hbase.snapshot.enabled 配置项为true
<property>
  <name>hbase.snapshot.enabled</name>
  <value>true</value>
</property>

5.1表上创建snapshot
hbase(main):003:0> snapshot 'abc','spabc'
(abc为表名字,spabc为快照名字)

5.2查看快照
hbase(main):004:0> list_snapshots

5.3恢复快照
hbase(main):012:0> deleteall 'abc','admin'
(删除rowkey为admin 的整行)
hbase(main):013:0> scan 'abc'
hbase(main):016:0> disable 'abc'

hbase(main):017:0> restore_snapshot 'spabc'
(spabc为快照名字)
hbase(main):018:0> enable 'abc'

hbase(main):019:0> scan 'abc'
删除的数据又回来了

5.4删除快照
hbase(main):001:0> delete_snapshot 'spabc'

 

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄