zoukankan      html  css  js  c++  java
  • hbase snapshot 表备份/恢复

    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'

  • 相关阅读:
    AJAX 弹出窗消息类
    正则表达式验证总结
    Coolite 三列布局演示
    Coolite: Button、TextField、DataField、ComBox
    页面返回
    Coolite GridPanel 操作之一:获取gridpanel 选中行的记录信息
    页面上Enter 键禁用
    new、abstract、virtual、override,sealed关键字区别和使用代码示例
    Coolite TreePanel 操作之一:TreePanel 刷新
    调用WCF出现 The remote server returned an error: (401) Unauthorized. 错误
  • 原文地址:https://www.cnblogs.com/xiguage119/p/10643767.html
Copyright © 2011-2022 走看看