日常工作中会经常使用到opentsdb数据库的迁移,所以这次针对迁移的内容做下介绍,默认情况下opentsdb数据库是包含四张表,分别为tsdb、tsdb-meta、tsdb-tree、tsdb-uid,只有tsdb-uid和tsdb这两张表存数据,其它两张表则不存放数据,所以下面的备份与还原介绍主要是针对这两张表。
1.备份方式说明
Hbase数据库的备份目前主要是分为以下两种:
1) 基于Hbase提供的类对hbase中某张表进行备份
2) 基于Hbase snapshot数据快速备份方法
2.基于hbase提供的类对hbase中某张表进行备份
本文使用hbase提供的类把hbase中某张表的数据导出hdfs,之后再导出到测试hbase表中。
首先介绍一下相关参数选项:
(1) 从hbase表导出(# 默认不写file://的时候就是导出到hdfs上了 )
HBase数据导出到HDFS或者本地文件
hbase org.apache.hadoop.hbase.mapreduce.Export tsdb file:///home/bak/tsdb
HBase数据导出到本地文件
hbase org.apache.hadoop.hbase.mapreduce.Export tsdb /hbase/tsdb_bak
(2) 导入hbase表(# 默认不写file://的时候就是导出到hdfs上了 )
将hdfs上的数据导入到备份目标表中
hbase org.apache.hadoop.hbase.mapreduce.Driver import tsdb /hbase/tsdb_bak/*
将本地文件上的数据导入到备份目标表中
hbase org.apache.hadoop.hbase.mapreduce.Driver import tsdb file:///home/bak/tsdb/*
(3) 导出时可以限制scanner.batch的大小
如果在hbase中的一个row出现大量的数据,那么导出时会报出ScannerTimeoutException的错误。这时候需要设置hbase.export.scaaner.batch 这个参数。这样导出时的错误就可以避免了。
hbase org.apache.hadoop.hbase.mapreduce.Export -Dhbase.export.scanner.batch=2000 tsdb file:///home/bak/tsdb
(4)为了节省空间可以使用compress选项
hbase的数据导出的时候,如果不适用compress的选项,数据量的大小可能相差5倍。因此使用compress的选项,备份数据的时候是可以节省不少空间的。
并且本人测试了compress选项的导出速度,和无此选项时差别不大(几乎无差别):
hbase org.apache.hadoop.hbase.mapreduce.Export -Dhbase.export.scanner.batch=2000 -D mapred.output.compress=true tsdb file:///home/bak/tsdb/
通过添加compress选项,最终导出文件的大小由335字节变成了325字节,
File Output Format Counters File Output Format Counters
Bytes Written=335 Bytes Written=323
(5)导出指定行键范围和列族
在公司准备要更换数据中心,需要将hbase数据库中的数据进行迁移。虽然进行hbase数据库数据迁移时,使用其自带的工具import和export是很方便的。
只不过,在迁移大量数据时,可能需要运行很长的时间,甚至可能出错。
这时,是可以通过指定行键范围和列族,来减少单次export工具的运行时间。
可以看出,支持的选项有好几个。假如,我们想导出表test的数据,且只要列族Info,行键范围在000到001之间,可以这样写:
这样就可以了,且数据将会保存在hdfs中。
通过指定列族和行键范围,可以只导出部分数据,避免export启动的mapreduce任务运行时间过长。也就是可以分多次导出数据。
hbase org.apache.hadoop.hbase.mapreduce.Export -D hbase.mapreduce.scan.column.family=Info -D hbase.mapreduce.scan.row.start=000 -D hbase.mapreduce.scan.row.stop=001 tsdb /hbase/tsdb_bak
(6)含义介绍及增量备份
HBase自带的export/import机制可以实现Backup Restore功能。而且可以实现增量备份。原理都是用了MapReduce来实现的。
1、Export是以表为单位导出数据的,若想完成整库的备份需要执行n遍。
2、Export在shell中的调用方式类似如下格式:
./hbase org.apache.hadoop.hbase.mapreduce.Export 表名 备份路径 (版本号) (起始时间戳) (结束时间戳)括号内为可选项,例如
Usage: Export [-D <property=value>]* <tablename> <outputdir> [<versions> [<starttime> [<endtime>]] [^[regex pattern] or [Prefix] to filter]]
hbase org.apache.hadoop.hbase.mapreduce.Export tsdb /hbase/tsdb_bak 1 123456789
备份 emp 这张表到 /hbase/tsdb_bak 目录下(最后一级目录必须由Export自己创建),版本号为1,备份记录从123456789这个时间戳开始到当前时间内所有的执行过put操作的记录。
注意:为什么是所有put操作记录?因为在备份时是扫描所有表中所有时间戳大于等于123456789这个值的记录并导出。如果是delete操作,则表中这条记录已经删除,扫描时也无法获取这条记录信息。
当不指定时间戳时,备份的就是当前完整表中的数据。
(7)备份脚本示例,仅需在其中一个节点执行即可。
全量备份:
cat <<EOF > /usr/bin/hbase_fullbk.sh
#!/bash/bin
source /root/.bashrc
starttime=`date +%s%m%w`
echo $starttime >> /home/backup/fullbak_endtime.txt
tablename01='tsdb-uid'
tablename02='tsdb'
backup_date=`date +%Y-%m-%d-%k-%M-%S`
#开始全备tablename01数据
hbase org.apache.hadoop.hbase.mapreduce.Export -D hbase.export.scanner.batch=2000 -D mapreduce.output.fileoutputformat.compress=true -D mapreduce.output.fileoutputformat.compress.codec=org.apache.hadoop.io.compress.BZip2Codec -D mapreduce.output.fileoutputformat.compress.type=BLOCK $tablename01 file:///home/backup/$backup_date$tablename01'_fullbk' 1
#开始全备tablename02数据
hbase org.apache.hadoop.hbase.mapreduce.Export -D hbase.export.scanner.batch=2000 -D mapreduce.output.fileoutputformat.compress=true -D mapreduce.output.fileoutputformat.compress.codec=org.apache.hadoop.io.compress.BZip2Codec -D mapreduce.output.fileoutputformat.compress.type=BLOCK $tablename02 file:///home/backup/$backup_date$tablename02'_fullbk' 1
#hdfs dfs -get /home/backup/$backup_date$tablename'_fullbk' /home/backup/
#hdfs dfs -rmr /home/backup/$backup_date$tablename'_fullbk'
EOF
增量备份:
cat <<EOF > /usr/bin/hbase_increbk.sh
#!/bash/bin
source /root/.bashrc
start_time=`tail -n 1 /home/backup/fullbak_endtime.txt`
end_time=`date +%s%m%w`
echo $end_time >> /home/backup/incbak_endtime.txt
tablename01='tsdb-uid'
tablename02='tsdb'
backup_date=`date +%Y-%m-%d-%k-%M-%S`
#开始增备tablename01数据
hbase org.apache.hadoop.hbase.mapreduce.Export -D hbase.export.scanner.batch=2000 -D mapreduce.output.fileoutputformat.compress=true -D mapreduce.output.fileoutputformat.compress.codec=org.apache.hadoop.io.compress.BZip2Codec -D mapreduce.output.fileoutputformat.compress.type=BLOCK $tablename01 file:///home/backup/$backup_date$tablename01'_increbk' 1 $start_time $end_time
#开始增备tablename02数据
hbase org.apache.hadoop.hbase.mapreduce.Export -D hbase.export.scanner.batch=2000 -D mapreduce.output.fileoutputformat.compress=true -D mapreduce.output.fileoutputformat.compress.codec=org.apache.hadoop.io.compress.BZip2Codec -D mapreduce.output.fileoutputformat.compress.type=BLOCK $tablename02 file:///home/backup/$backup_date$tablename02'_increbk' 1 $start_time $end_time
#hdfs dfs -get /home/backup/$backup_date$tablename'_increbk' /home/backup/
#hdfs dfs -rmr /home/backup/$backup_date$tablename'_increbk'
EOF
新建计划任务:
0 0 * * * /bin/bash /usr/bin/hbase_fullbk.sh &
30 */1 * * * /bin/bash /usr/bin/hbase_increbk.sh &
每天零点零分做tsdb和tsdb-uid的全量备份,整点30分做基于全量备份的增量备份。
备份文件说明:
备份的文件仅保留在各个数据节点上,非数据节点不存在备份数据,此备份默认启用压缩备份。做数据迁移需要保留所有节点的数据,汇总还原至新的服务器即可。新的服务器上面仅仅需要在数据存储节点放需要还原的数据。
(8) 还原脚本示例(—D 后的参数可以根据实际需要选择是否添加即可)
hbase org.apache.hadoop.hbase.mapreduce.Import tsdb-uid file:///home/backup/tsdb-uid-bak0429 -D hbase.import.version=1.2.6.1
hbase org.apache.hadoop.hbase.mapreduce.Import tsdb file:///home/backup/tsdb-bak0429 -D hbase.import.version=1.2.6.1
如上方式比较适合数据量不大的情况下,针对离线数据备份和跨机房的迁移使用。(当然数据量较大的情况下,如何实现数据迁移或快速恢复,则主要是采用混合方式实现。)
3.基于Hbase snapshot数据快速备份方法
(1) Snapshot备份的优点是什么?
HBase以往数据的备份基于distcp或者copyTable等工具,这些备份机制或多或少对当前的online数据读写存在一定的影响,Snapshot提供了一种快速的数据备份方式,无需进行数据copy。
(2) HBase数据的备份的方式有几种?Snapshot包括在线和离线的,他们之间有什么区别?
Snapshot包括在线和离线的
(1)离线方式是disable table,由HBase Master遍历HDFS中的table metadata和hfiles,建立对他们的引用。
(2)在线方式是enable table,由Master指示region server进行snapshot操作,在此过程中,master和regionserver之间类似两阶段commit的snapshot操作。
HFile是不可变的,只能append和delete, region的split和compact,都不会对snapshot引用的文件做删除(除非删除snapshot文件),这些文件会归档到archive目录下,进而需要重新调整snapshot文件中相关hfile的引用位置关系。
基于snapshot文件,可以做clone一个新表,restore,export到另外一个集群中操作;其中clone生成的新表只是增加元数据,相关的数据文件还是复用snapshot指定的数据文件。
(3) snashot的shell的命令都由哪些?如何删除、查看快照?如何导出到另外一个集群?
snashot相关的操作命令如下:
#创建快照:
snapshot 'tsdb-uid', 'snapshot_tsdb-uid'
snapshot 'tsdb', 'snapshot_tsdb'
#查看创建的快照:
list_snapshots
#删除快照命令:
delete_snapshot 'snapshot_tsdb'
#基于快照,clone一个新表:
clone_snapshot 'snapshot_tsdb-uid', 'news_tsdb-uid'
#基于快照恢复表:
disable 'tsdb-uid'
restore_snapshot 'snapshot_tsdb-uid'
#通过hdfs查看快照文件:
hadoop fs -ls /hbase/.hbase-snapshot/snapshot_tsdb
#查看快照文件大小:
hadoop fs -du -h /hbase/.hbase-snapshot/snapshot_tsdb
#将快照源集群copy至目标集群:
hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot -snapshot snapshot_tsdb-uid -copy-from hdfs://10.1.1.100:9000/hbase -copy-to hdfs://10.1.1.200:9000/mghdpha/hbase -mappers 20 -bandwidth 20
copy完成后即可通过快照恢复表,或者利用快照创建新表等均可。
4.注意事项或说明
由于数据导出导入均通过mapreduce的方式实现。
所以需要将hadoop中的mapred-site.xml新增如下配置项:
目的就是为了确保备份和还原时能够有足够的内存空间可供使用。
<property>
<name>mapreduce.map.memory.mb</name>
<value>2048</value>
</property>
<property>
<name>mapreduce.reduce.memory.mb</name>
<value>2048</value>
</property>
快照方式速度较快,且对系统的影响较小,主要用于在线数据备份和同机房的数据迁移使用。
评论区