HBase备份恢复实战篇

模拟线上需求:数据不断有写入,需要搭建一个该表的slave供离线分析。

1
2
create 'testtable', {NAME => 'c1'}
for i in '1'..'10000' do for j in '1'..'10000' do for k in '0'..'9' do put 'testtable',"row#{i}","c1:#{j}{k}","#{j}#{k}" end end end

数据量 10000* 10000,保证执行的时间足够长。

步骤:

  1. 使用snapshotExport将线上的数据全量导入新集群 记录时间点T1.

  2. 设置replication,来同步之后的数据。 记录时间点T2.

  3. 使用copyTable将 <T1,T2>之间的数据同步。 (startTime可以记录为T1之前的值)

演练:

事先配置yarn并hbase-site.xml 开启复制参数和快照,滚动重启RS生效配置。

1
2
3
4
5
6
7
8
<property>
<name>hbase.security.authorization</name>
<value>true</value>
</property>
<property>
<name>hbase.snapshot.enabled</name>
<value>true</value>
</property>

步骤1 ExportSnapshot
源集群:

创建snapshot

1
2
3
hbase(main):003:0> snapshot 'testtable','testtable_snapshot'
0 row(s) in 0.6990 seconds
hbase(main):004:0> exit

执行ExportSnapshot

1
2
[hadoop@hostname /home/q/hbase/q_hbase/bin]$ ./hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot 
-snapshot 'testtable_snapshot' -copy-to hdfs://hostname:8020/hbase/haas_test -mappers 16 -bandwidth 200

执行list_snapshots查看时间,记录为T1
date -d ‘2017-03-17 17:24:04’ +%s 方式转化为时间戳。

1
[hadoop@hostname /home/q/hbase/q_hbase/bin]$ date -d '2017-03-21 15:00:58' +%s

1490079658
目的端hostname 进行表恢复。

1
2
hbase(main):001:0> restore_snapshot  'testtable_snapshot'
0 row(s) in 1.8920 seconds

hbase(main):002:0> list_snapshots
步骤2 Replication
源端创建复制通道并开启复制.

1
2
3
4
5
6
7
8
9
10
 hbase(main):026:0> disable 'testtable'


hbase(main):028:0* alter 'testtable', {NAME => 'c1',REPLICATION_SCOPE => '1'}

hbase(main):029:0> enable 'testtable'
hbase(main):032:0>add_peer '2',"hostname:2181:/hbase/haas_test"
0 row(s) in 0.0120 seconds
hbase(main):033:0> set_peer_tableCFs '2','testtable' 开启复制
0 row(s) in 0.0060 seconds

开启复制后,记录时间为T2.

1
2
3
4
[hadoop@hostname /home/q/hbase/q_hbase/bin]$ date
Tue Mar 21 15:07:42 CST 2017
[hadoop@hostname /home/q/hbase/q_hbase/bin]$ date -d '2017-03-21 15:07:42' +%s
1490080062

步骤3 CopyTable,拷贝<T1,T2>时间段内的变量数据。

1
2
3
[hadoop@hostname /home/q/hbase/q_hbase/bin]$ ./hbase org.apache.hadoop.hbase.mapreduce.CopyTable 
--peer.adr=hostname:2181:/hbase/haas_test
--starttime=1489718120 --endtime=1489718187 --new.name=testtable testtable

完成配置,等待脚本执行完成验证源端和目的端数据是否一致。
两边执行count ,行数一致。

1
2
3
hbase(main):006:0> count 'testtable'
23 row(s) in 0.0360 seconds
=> 23

问题

问题1:复制不会同步ddl,开发新建表如果需要复制则该表都得重新搭建复制。
源端执行truncate

1
2
3
4
5
6
7
8
9
10
hbase(main):003:0> truncate_preserve 'testtable'
Truncating 'testtable' table (it may take a while):
- Disabling table...
- Dropping table...
- Creating table with region boundaries...
0 row(s) in 2.4070 seconds

hbase(main):004:0> scan 'testtable'
ROW COLUMN+CELL
0 row(s) in 0.0590 seconds

目的端scan数据依旧存在

1
2
 row1                                         column=c1:9999{k}, timestamp=1490081458186, value=99999
1001 row(s) in 6.2230 seconds