介绍两种HBase的数据备份或者容灾方案:Snapshot,Replication;

一、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日志。

二、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”相同

 

提示:

 

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

 

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

 

      b)   开启replication;

 

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

 

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

 

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

 

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

 

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

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