hbase数据备份或者容灾方案

标签: hbase 数据 备份 | 发表时间:2014-11-11 18:38 | 作者:无尘道长
出处:http://www.iteye.com

    HBase的数据备份或者容灾方案有这几种:Distcp,CopyTable,Export/Import,Snapshot,Replication,以下分别介绍(以下描述的内容均是基于0.94.20版本)。

 

一、Distcp

   在使用distcp命令copy hdfs文件的方式实现备份时,需要禁用备份表确保copy时该表没有数据写入,对于在线服务的hbase集群,该方式不可用,而且在一些文章中可以看到通过distcp文件恢复hbase表时需使用:

bin/hbase org.jruby.Main bin/add_table.rb /hbase/testtable命令把从hdfs目录中恢复表的元数据,然后重启hbase,但是0.94之后的版本的bin目录下均没有找到add_table.rb文件,似乎hbase已经废弃该功能。

 

二、CopyTable

  执行命令前,需先创建表

 

  支持时间区间、row区间,改变表名称,改变列簇名称,指定是否copy删除数据等功能,例如:

 

 hbase org.apache.hadoop.hbase.mapreduce.CopyTable --starttime=1265875194289 --endtime=1265878794289 --peer.adr= dstClusterZK:2181:/hbase --families=myOldCf:myNewCf,cf2,cf3 TestTable

 

    1、同一个集群不同表名称

 

      hbase org.apache.hadoop.hbase.mapreduce.CopyTable --new.name=tableCopy  srcTable

 

    2、跨集群copy表

 

      hbase org.apache.hadoop.hbase.mapreduce.CopyTable --peer.adr=dstClusterZK:2181:/hbase srcTable

 

   该方式,原表、目标表的名称相同

   全部使用方式如下:

   

   MR的map数量与表的region数相同,与HFile文件个数无关。

 

   CopyTable工具采用scan查询,写入新表时采用put和delete API,全是基于hbase的client api进行读写,无法使用Import工具的bulk导入。

 

  三、Export/Import

  通过Export导出数据到目标集群的hdfs,再在目标集群执行import导入数据,Export支持指定开始时间和结束时间,因此可以做增量备份,Export工具参数如下:  


    可见,在导出时可以指定version,starttime,endtime等参数,并且可以通过-D指定是否压缩,指定caching等属性,比如:

 

hbase org.apache.hadoop.hbase.mapreduce.Export test4 hdfs://t2-namenode:9000/test4_90 1 1415693812520 1415694912520

 

Export导出工具与CopyTable一样是依赖hbase的scan读取数据,并且采用的InportFormat与CopyTable一样是TableInputFormat类,从该类的getSplits()方法可以看出MR的map数与hbase表的region数相同。

 

Import工具参数如下:   


   在import时可以指定使用bulk的方式,bulk是生成hfile格式的文件,直接导入到Region,无需经历hbase的写数据过程,从而无需消耗memstore,无需Flush等,更加高效,如果不指定bulk文件路径(hdfs的路径)则会采用hbase 的put和delete API进行写入。

 

To import 0.94 exported files in a 0.96 cluster or onwards, you need to set system property "hbase.import.version" when running the import command as below:

 

$ bin/hbase -Dhbase.import.version=0.94 org.apache.hadoop.hbase.mapreduce.Import <tablename> <inputdir>

使用Import工具前必须先创建表,关于hbase.import.version属性是0.96的功能。

 

  四、Snapshot

  开启快照功能,在hbase-site.xml文件中添加如下配置项:

       <property>

 

        <name>hbase.snapshot.enabled</name>

 

        <value>true</value>

 

    </property>

 

在hbase shell中使用clone_snapshot, delete_snapshot, list_snapshots, restore_snapshot, snapshot命令可是是想创建快照,查看快照,通过快照恢复表,通过快照创建一个新的表等功能,需要注意的是:如果该表开启了replication功能实现主从同步则在使用restore_snapshot功能对主表进行恢复时,必须先停止replication功能并且redo the bootstrap,因为replication是基于WAL日志实现的,而snapshot是直接在hdfs层面不是基于hbase的put、delete等API进行的,不会写WAL日志。

在创建snapshot后,可以通过ExportSnapshot工具把快照导出到另外一个集群,实现数据备份或者数据迁移,ExportSnapshot工具的用法如下:

 例如:

 

hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot -snapshot test4_snapshot_201411111422 -copy-to hdfs://t2-namenode:9000/hbase -mappers 2

 

执行该命令后,在t2-namenode:9000的hdfs中会把test4_snapshot_201411111422文件夹copy到/hbase/.hbase-snapshot文件下,进入t2-namenode这个hbase集群,执行list_snapshots会看到有一个快照:test4_snapshot_201411111422,通过命令clone_snapshot可以把该快照copy成一个新的表,不用提前创建表,新表的region个数等信息完全与快照保持一致。

 

在使用snapshot把一个集群的数据copy到新集群后,应用程序开启双写,然后可以使用Export工具把快照与双写之间的数据导入到新集群,从而实现数据迁移,为保障数据不丢失,Export导出时指定的时间范围可以适当放宽。

 

五、Replication

可以通过replication机制实现hbase集群的主从模式,具体步骤如下:

    1、  zookeeper不能被hbase托管,如果主从hbase集群共用一个zk集群,则zookeeper.znode.parent不能都是默认的hbase,可以配置为hbase-master和hbase-slave

    2、 在主hbase集群的hbase-site.xml中添加配置项:

<property>

    <name>hbase.replication</name>

    <value>true</value>

     </property>

<property>

    <name>replication.source.nb.capacity</name>

    <value>25000</value>

<description>主集群每次向从集群发送的entry最大的个数,默认值25000,可根据集群规模做出适当调整</description>

     </property>

<property>

<name>replication.source.size.capacity</name>

<value>67108864</value>

<description>主集群每次向从集群发送的entry的包的最大值大小,默认为64M</description>

</property>

<property>

<name>replication.source.ratio</name>

<value>1</value>

<description>主集群使用的从集群的RS的数据百分比,默认为0.1,需调整为1,充分利用从集群的RS</description>

</property>

<property>

<name>replication.sleep.before.failover</name>

<value>2000</value>

<description>主集群在RS宕机多长时间后进行failover,默认为2秒,具体的sleep时间是: sleepBeforeFailover + (long) (new Random().nextFloat() * sleepBeforeFailover) </description>

</property>

<property>

<name>replication.executor.workers</name>

<value>1</value>

<description>从事replication的线程数,默认为1,如果写入量大,可以适当调大</description>

</property>

 

   3、在从hbase集群的hbase-site.xml中添加:

<property>

    <name>hbase.replication</name>

    <value>true</value>

     </property>

 

   4、 进入主集群的shell,执行:

add_peer 'ID' 'CLUSTER_KEY'

The ID must be a short integer. To compose the CLUSTER_KEY, use the following template:

hbase.zookeeper.quorum:hbase.zookeeper.property.clientPort:zookeeper.znode.parent

This will show you the help to setup the replication stream between both clusters. If both clusters use the same Zookeeper cluster, you have to use a different zookeeper.znode.parent since they can't write in the same folder.

   5、  在从集群中创建一个与master集群相同的表

   6、 修改表定义,开启复制功能

disable 'your_table'

alter 'your_table', {NAME => 'family_name', REPLICATION_SCOPE => '1'}

    enable 'your_table

此处的REPLICATION_SCOPE => '1'中的1,与第3步中设置到“ID”相同

 

 

可以通过工具VerifyReplication对复制的数据一致性进行校验,需在主集群执行,例如:

hbase org.apache.hadoop.hbase.mapreduce.replication.VerifyReplication --starttime=1265875194289 --stoptime=2265878794289 1 test4

 

用法如下:

 提示:

 

   1、 hbase的replication,如果是在建立主表和从表的关系前,主表已经有数据则该部分数据不会被同步到从表中,因为replication是依赖WAL日志进行的同步,可以通过如下步骤实现:

 

      a)   通过snapshot把历史数据导入到从集群;

 

      b)   开启replication;

 

      c)   通过Export工具把快照和开启replication之间的数据导入到从表;

 

      d)   通过VerifyReplication工具校验数据的一致性。

 

   2、  如果客户端在写入数据时设置不写WAL日志,则会导致从集群不会同步数据;

 

   3、  主从同步是异步的,因此数据不一定会立即同步到从表;

 

   4、  创建主、从表后,在向主表写入数据时,停止从集群,写完后再开启从集群,这时如果主集群的WAL日志还在则会同步到从表中;

由于不写WAL日志的数据不会被同步到从集群,因此对于重要的数据建议再通过snapshot进行定期的备份。

 

 



已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [hbase 数据 备份] 推荐:

hbase数据备份或者容灾方案

- - 数据库 - ITeye博客
    HBase的数据备份或者容灾方案有这几种:Distcp,CopyTable,Export/Import,Snapshot,Replication,以下分别介绍(以下描述的内容均是基于0.94.20版本).    在使用distcp命令copy hdfs文件的方式实现备份时,需要禁用备份表确保copy时该表没有数据写入,对于在线服务的hbase集群,该方式不可用,而且在一些文章中可以看到通过distcp文件恢复hbase表时需使用:.

HBASE数据架构

- - 数据库 - ITeye博客
关系数据库一般用B+树,HBASE用的是LSM树. MYSQL所用类B+树一般深度不超过3层,数据单独存放,在B+树的叶节点存储指向实际数据的指针,叶节点之间也相互关联,类似双向链表. 这种结构的特点是数据更新或写入导致数据页表分散,不利于顺序访问. LSM存储中,各个文件的结构类似于B+树,但是分多个存在内存或磁盘中,更新和写入变成了磁盘的顺序写,只在合并时去掉重复或过时的数据.

hbase写数据过程

- - 数据库 - ITeye博客
博文说明:1、研究版本hbase0.94.12;2、贴出的源代码可能会有删减,只保留关键的代码. 从client和server两个方面探讨hbase的写数据过程.     写数据主要是HTable的单条写和批量写两个API,源码如下:. hbase写数据的客户端核心方法是HConnectionManager的processBatchCallback方法,相关源码如下:.

HBase数据查询之Coprocessor

- - 开源软件 - ITeye博客
协处理器的概念、作用和类型不介绍,可以参看:http://www.cnblogs.com/ventlam/archive/2012/10/30/2747024.html,官方blog:https://blogs.apache.org/hbase/entry/coprocessor_introduction.

从hbase(hive)将数据导出到mysql

- - CSDN博客云计算推荐文章
在上一篇文章《 用sqoop进行mysql和hdfs系统间的数据互导》中,提到sqoop可以让RDBMS和HDFS之间互导数据,并且也支持从mysql中导入到HBase,但从HBase直接导入mysql则不是直接支持,而是间接支持. 要么将HBase导出到HDFS平面文件,要么将其导出到Hive中,再导出到mysql.

通过HBase Observer同步数据到ElasticSearch

- - SegmentFault 最新的文章
Observer希望解决的问题. HBase是一个分布式的存储体系,数据按照RowKey分成不同的Region,再分配给RegionServer管理. 但是RegionServer只承担了存储的功能,如果Region能拥有一部分的计算能力,从而实现一个HBase框架上的MapReduce,那HBase的操作性能将进一步提升.

HBase基本数据操作详解

- - 互联网 - ITeye博客
之前详细写了一篇HBase过滤器的文章,今天把基础的表和数据相关操作补上. 本文档 参考最新 (截止2014年7月16日)的 官方 Ref Guide、 Developer API编写. 所有代码均基于“hbase  0.96.2-hadoop2 ”版本编写,均实测通过. 对于建表,和RDBMS类似,HBase也有namespace的概念,可以指定表空间创建表,也可以直接创建表,进入default表空间.

Oracle数据库备份

- - Oracle - 数据库 - ITeye博客
(一)、导出/导入(EXPORT/IMPORT).   EXPORT/IMPORT是用来将ORACLE中数据移出/移入数据库.   1、EXPORT将数据库中数据备份成一个二进制系统文件称为“导出转储文件”(EXPORT. DUMP FILE),并将重新生成数据库写入文件中.   a.用户模式:导出用户所有对象以及对象中的数据;.

两次hbase丢失数据的故障及原因分析

- gengmao - 蓝色时分
    hbase的稳定性是近期社区的重要关注点,毕竟稳定的系统才能被推广开来,这里有几次稳定性故障和大家分享.     第一次生产故障的现象及原因. 1 hbase发现无法写入 2 通过hbck检测发现.META.表中出现空洞,具体log是:;Chain of regions in table.     修复方法:直接使用check_meta.rb重新生成.META.表并修补空洞,但是会引起数据丢失.

java实现hbase表创建、数据插入、删除表

- - 学着站在巨人的肩膀上
近日查看了相关资料后,梳理了一下用java实现hbase的表创建、数据插入、删除表,代码如下:. 类别: Hadoop  查看评论.