日常工作中会经常使用到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的命令都由哪些?如何删除、查看快照?如何导出到另外一个集群?

nashot相关的操作命令如下:

#创建快照:
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>

快照方式速度较快,且对系统的影响较小,主要用于在线数据备份和同机房的数据迁移使用。