当前位置: 移动技术网 > IT编程>数据库>其他数据库 > hbase snapshot 表备份/恢复

hbase snapshot 表备份/恢复

2019年04月03日  | 移动技术网IT编程  | 我要评论
snapshot其实就是一组metadata信息的集合,它可以让管理员将表恢复到以前的一个状态。snapshot并不是一份拷贝,它只是一个文件名的列表,并不拷贝数据。一个全的snapshot恢复以为着你可以回滚到原来的表schema和创建snapshot之前的数据。 应用场景: 1获取:该操作尝试从 ...

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

应用场景

    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)中:

注意上图绿色的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'

 

如您对本文有疑问或者有任何想说的,请 点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网