(一)业务背景
为了保障HBASE集群数据不丢失的情况,需要对生产线集群的数据进行实时备份到备用集群上,为此调研了HBASE相关的数据热备的方案,
总体采用HBASE的【replication 】机制。
(二)Hbase双集群基于(master-slave)模式操作步骤
【特别说明】
主从HBASE集群采用不同的ZK集群保存HBASE信息;当然也可以使用相同集群但是需要区别(zookeeper.znode.parent)
【操作步骤】
1. 【Master集群】上修改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>
2. 【Slave集群】上修改hbase-site.xml配置文件添加如下配置项
<property>
<name>hbase.replication</name>
<value>true</value>
</property>
3. 【进入Master集群】登录Shell环境执行如下命令
add_peer 'ID' ,CLUSTER_KEY => "zk-server:2181:/hbase" , STATE => "ENABLED"
例如:
add_peer '1', CLUSTER_KEY => "server1.cie.com:2181:/hbase", STATE => "ENABLED"
其中ID为自己定义的数字
其中CLUSTER_KEY的定义为格式为 【"zk1,zk2,zk3:2182:/hbase-prod"】
4. 【进入Master集群】(创建/修改)需要热备的数据表【比如: test表】
4.1 创建1张表(test),1个列族(cf)
create 'test',{NAME => 'family_name', REPLICATION_SCOPE => '1'}
4.2 修改表(test),1个列族(cf)
disable 'test'
alter 'test', {NAME => 'cf', REPLICATION_SCOPE => '1'}
enable 'test'
5. 【进入Slave集群】(创建/修改)与Master集群一样的数据表(包括NameSpace都一样)【比如: test表】参考上述第4点
(三)特别提示点
1. Hbase的replication是基于WAL日志构建的,如果Hbase集群没有开启WAL日志那么【replication】就不会生效。
2. Hbase的replication开启时间如果晚于Hbase表的创建时间,那么已有的数据是不会复制到Slave集群上原因参考上述第1点。
2.1 【Master】集群数据表需要首先迁移到Slave集群上,可以参考Hbase表的快照方式(snapshot)
2.2 在开启【Master】,【Slave】集群表的(replication)功能
3. 其中Hbase的replication机制是异步操作,因此可能存在数据不及时更新的情况。
4. 由于Hbase的replication机制是基于WAL的,那么主集群在传递WAL日志到从集群的时候由于是异步操作,
有可能会导致【master,slave】两个集群的数据不一致的情况。此时需要参考【Serial Replication】但是此模式是对Hbase
版本有要求的需要(2.1)版本及以上。
5. 当两个Hbase集群配置了【master-slave】模式之后,当从集群宕机后,直到恢复后,如果【Master集群】的WAL日志
还在则会同步到【Slave】集群的从表中,直到数据会追平。
6. 对于【Master集群】群宕机的情况,如果从集群高可用的角度出发,那么此时希望从集群能够对生产线提供服务,就需要应用层做相关
的【Master,Slave】切换功能,当【Master】集群功能上线后,需要做相关的从【Slave】集群同步数据到【Master】集群数据同步有2
种方式分别如下:
6.1 Hbase官网提供了一个补丁,此补丁是针对Hbase3.0版本的【https://issues.apache.org/jira/browse/HBASE-19064】
6.2 生产环境停机一段时间使用Hbase的【snapshot】功能从【Slave】集群同步数据到【Master】集群。