HBase复制,hbase复制表


HBase复制是一种在不同HBase部署中复制数据的方法。它可以作为一种故障恢复的方法,并提供HBase层次的高可用性。在实际应用中,例如,可以将数据从一个面向页面的集群复制到一个MapReduce集群,后者可以同时处理新数据和历史数据。然后再自动将数据传回面向页面请求的集群。

HBase复制中最基本的架构模式是“主推送”(master-push),因为每个region server都有自己的WAL(或HLog),所以很容易保存现在正在复制的位置。正如众所周知的解决方案-Mysql的主/从复制,只使用二进制文件来跟踪修改。一个主集群可以将数据复制到任意数目的从集群,每个region server都会参与复制自己的修改。更多的关于主/从复制或其他类型的复制,可以参考文章《How Google Serves Data From Multiple Datacenters》。

复制是异步进行的,意味着集群可以是地理上彼此远离的,它们之间的连接可以在某个时刻断开,在主集群上的修改不能马上在从集群上进行同步(最终一致性)。

这里使用的复制格式从概念上和《MySQL’s statement-based replication》类似。和SQL语句不同,所有的WALEdits(包括来自客户端的Put和Delete产生的多单元格操作)都会被复制以保证原子性。

来自每个region server的HLog是HBase复制的基础,并且只要它们需要将数据复制到从集群,它们就必须被保存到HDFS上。每个region server从它需要的最老的日志开始复制,同时在zookeeper中保存当前恢复的位置来简化错误恢复。每个从集群恢复的位置可能不同,但它们处理的HLog队列内容是相同的。

参与复制的集群的规模可以不对等。主集群会通过随机分配尽量均衡从集群的负载。

从0.92版本起,HBase还支持另外的两种模式的复制:主<->主和循环复制。

下图展示了复制的工作流程和架构。


集群复制架构图

HBase复制部署

1)编辑集群中所有机器的${HBASE_HOME}/conf/hbase-site.xml文件,增加如下配置:

<property>
  <name>hbase.replication</name>
  <value>true</value>
</property>
修改完成后,重启HBase集群,使配置生效。

2)在HBase shell中运行如下命令:

hbase(main):003:0> add_peer 'ID' 'CLUSTER_KEY'
hbase(main):004:0> start_replication

第一条命令是为从集群设置zookeeper集群信息,这样可以使得修改被同步到从集群上。第二条命令真正将修改过的记录发布到从集群上。为了保证工作能按照预期进行,用户必须保证已经在从集群上建立了一个相同的表的副本,表可以为空,但必须有相同的模式和表名。

注意:hbase-0.96和hbase-0.98已经没有了start_replication命令和stop_replication命令。hbase-0.98相较hbase-0.96,新增了set_peer_tableCFs、show_peer_tableCFs命令。在设定复制时,hbase-0.98需要使用set_peer_tableCFs设置。具体的有对应的帮助命令可供参考。

ID必须是一个短整数,CLUSTER_KEY的内容请参考以下模板:

hbase.zookeeper.quorum:hbase.zookeeper.property.clientPort:zookeeper.znode.parent
比如,zk.server.com:2181:/hbase

注意:如果两个集群使用相同的zookeeper集群,你不得不使用不同的 zookeeper.znode.parent,因为它们不能写入相同的文件夹中。

3)一旦你有一个对等(从)集群,你需要在你的列簇上使复制可用,要想达到这样的效果,可以在HBase shell中执行如下命令:

hbase(main):005:0> disable 'your_table'
hbase(main):006:0> alter 'your_table', {NAME => 'family_name', REPLICATION_SCOPE => '1'}
hbase(main):007:0> enable 'your_table'
scope值为0(默认值)意味着它不会被复制,而scope值为1意味着它将被复制。

4)运行如下命令可以列出所有配置的对等(从)集群:

hbase(main):008:0> list_peers
5)运行如下命令将使对等(从)集群不可用:

hbase(main):009:0> disable_peer 'ID'
运行完命令后,HBase将停止将向对等(从)集群发送修改,但是它将一直跟踪所有新的WALs文件,以便当从集群可用时继续复制。

6)可以运行如下命令将使之前设置为不可用的对等(从)集群可用:

hbase(main):010:0> enable_peer 'ID'
7)运行下面的命令,可以移除一个从集群:

hbase(main):011:0> stop_replication
hbase(main):012:0> remove_peer 'ID'
需要注意的是,停止复制仍会完成所有已在队列里的修改的复制,但是之后所有的处理都被停止了。为了确认你的配置都正常工作,你可以查看任何一个region server的日志文件,看是否有类似下面几行的内容:

Considering 1 rs, with ratio 0.1
Getting 1 rs from peer cluster # 0
Choosing peer 10.10.1.49:62020
这个例子表示有一个region server被选择做复制。



hbase的Hmaster启动失败

这种问题不是一句两就能帮你定位的,你仔细点,看一下。首先,你看一下源码,在newInstance的过程中它做了什么,抛错的地方在处理什么逻辑,然后基本上也就定位了。另外,
出现这种问题主要原因是hbase中的hadoop-core的jar和hadoop的不兼容,导致连不上hdfs。
故用hadoop的hadoop-core.jar文件替换hbase的hadoop-core.jar文件。
 

使用Ganglia监控hbase与hadoop,这里hadoop为020X,ganglia317配置文件hadoop-metricsproperties

你现在的ganglia已经部署好了么?
 

相关内容