在Hbase使用过程中,使用的Hbase集群经常会因为某些原因需要数据迁移。大多数情况下,可以跟用户协商用离线的方式进行迁移,迁移离线数据的方式就比较容易了,将整个Hbase的data存储目录进行搬迁就行,但是当集群数据量比较多的时候,文件拷贝的时间很长,对客户的业务影响时间也比较长,往往在客户给的时间窗口无法完成,本文给出一种迁移思路,可以利用Hbase自身的功能,对集群进行迁移,减少集群业务中断时间。
简介大家都知道Hbase有snapshot快照的功能,利用快照可以记录某个时间点表的数据将其保存快照,在需要的时候可以将表数据恢复到打快照时间时的样子。我们利用Hbase的snapshot可以导出某个时间点的全量数据。
因为用户的业务还在不停的写入表中,除了迁移快照时间点之前的全量数据,我们还需要将快照时间点后源源不断的增量数据也迁移走,这里如果能采用双写的方式,将数据写入两个集群就好了,但是用户的业务不会这样做,如果这样做还得保证双写的事务一致性。于是可以利用Hbase的replication功能,replication功能本身就是保留了源集群的WAL日志记录,去回放写入到目的集群,这样一来用户业务端->原始集群->目的集群便是个串形的数据流,且由Hbase来保证数据的正确性。
所以这个迁移的方法就是利用snapshot迁移全量数据,利用replication迁移增量数据。
迁移步骤上图给出了迁移的整个时间线流程,主要有这么5个时间点。
T0: 配置好老集群A集群到新集群B的Replication关系,Replication的数据由A集群同步到集群B,将表设置成同步,从此刻开始新写入A集群表的数据会保留在WAL日志中;
T1: 生成该时间点的全量数据,通过创建快照,以及导出快照数据的方式将该时间点的数据导出到新集群B;
T2: 新集群B将T1时刻的快照数据导入,此时新集群B中会由快照创建出表,此时老集群A集群上设置的Replication的关系会自动开始将T0时刻保留的WAL日志回放至新集群B的表中,开始增量数据同步。
T3: 由于从T0-T3之间的操作会花费一段时间,此时会积累很多WAL日志文件,需要一定的时间来同步至新集群,这里需要去监控一下数据同步情况,等老集群WAL被逐渐消费完,此时可以将老集群的写业务停止一下并准备将读写业务全部切到新集群B。
T4: T3-T4之间应该是个很短的时间,整个迁移也只有这个时间点会有一定中断,此时是让用户将业务完全切到新集群B,至此迁移完成。
操作涉及的命令1.设置集群A和集群B的peer关系
在源集群Hbase shell中, 设定peer
add_peer 'peer_name','ClusterB:2181:/Hbase'
2.在集群A的表中设置replication属性
假设目标表名为Student,先获取Family=f
进入Hbase shell中,
alter 'Student',{NAME => 'f',REPLICATION_SCOPE => '1'}
3.给集群A的表创建快照
在Hbase shell中
snapshot 'Student','Student_table_snapshot'
4.在A集群中导出快照
Hbase org.apache.hadoop.Hbase.snapshot.ExportSnapshot -snapshot Student_table_snapshot -copy-to /snapshot-backup/Student
5.将快照数据放置到集群B的对应的目录下
上面命令会导出2个目录,一个是快照元数据,一个是原始数据
将元数据放到/Hbase/.Hbase-snapshot中,将原始数据放到/Hbase/archive目录中
由于Hbase的archive目录会有个定时清理,这里可以提前将集群B的master的Hbase.master.cleaner.interval值设置大点,避免拷贝过程中发生碰巧发生了数据清理。
如果集群B中没有对应的目录,可以提前创建
hdfs dfs -mkdir -p /Hbase/.Hbase-snapshot
hdfs dfs -mkdir -p /Hbase/archive/data/default/
移动导出的snapshot文件到snapshot目录
hdfs dfs -mv /snapshot-backup/Student/.Hbase-snapshot/Student_table_snapshot /Hbase/.Hbase-snapshot/
hdfs dfs -mv /snapshot-backup/Student/archive/data/default/Student /Hbase/archive/data/default/
6.在新集群B中恢复表的快照
进入Hbase shell
restore_snapshot 'Student_table_snapshot'
恢复完成后,记得将集群B的hmaster中Hbase.master.cleaner.interval的值调整回来。
参考文档:
https://blog.csdn.net/qq475781638/article/details/95253603
https://support.huaweicloud.com/usermanual-mrs/mrs_01_0501.html