侧边栏壁纸
博主头像
SRE实战博主等级

助力中小微企业运筹帷幄。

  • 累计撰写 21 篇文章
  • 累计创建 11 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

Hbase环境下如何备份opentsdb的数据库表

SRE实战
2022-07-13 / 0 评论 / 0 点赞 / 804 阅读 / 2,745 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2022-07-13,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

日常工作中会经常使用到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>

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

0

评论区