目录
一、什么是快照
二、快照与其他备份方法对比分析
三、快照的原理
四、快照主要应用场景
五、快照的相关操作
5.1在Hbase的配置文件hbase-site.xml中配置快照
5.2在Hbase shell中进行备份表
5.3查看快照
5.4克隆表
5.5利用快照恢复表
一、什么是快照
Hbase的快照就是一分元数据的集合。SnapShot的实现不涉及到表的实际数据拷贝,仅仅拷贝一些元数据,如组成表的region信息,表的描述信息,表对应的HFile的文件引用等信息。快照可以在线完成也可以离线完成,可以利用快照完成表的备份。
二、快照与其他备份方法对比分析
备份方法 | 实现方法 | 优点 | 缺点 |
CopyTable | 以表级别进行迁移,其本质也是使用MapReduce的方式进行数据的同步,它是利用MapReduce去scan源表数据,然后把scan出来的数据写到目标集群,从而实现数据的迁移和备份。 | (1)在线备份(热备份) (2)本地及集群间备份 | 需要通过scan数据,对于很大的表,如果这个表本身又读写比较频繁的情况下,会对性能造成比较大的影响,并且效率比较低。 |
Export/Import | 调用mr复制备份表。将HBase表的数据转换成Sequence File并dump到hdfs,也涉及scan表数据。 | (1)在线备份(热备份) (2)适合本地备份 | 对RegionSever有直接影响,只能是同一集群之间的拷贝比较方便 |
Distinct | 使用MapReduce实现文件分发,把文件和目录的列表当做map任务的输入,每个任务完成部分文件的拷贝和传输工作。在目标集群再使用bulkload的方式导入就实现了数据的迁移。 执行完distcp命令后,需要执行hbase hbck -repairHoles修复HBase表元数据。 | (1)适合冷备份。适合备份历史数据表(数据不会被修改的情况) (2)适合集群间的拷贝 | 离线备份,需要关闭表,实际环境中无法接受 |
SnapShort | 不拷贝数据,直接克隆一张表,HDFS层面的操作,HMaster和域服务器的操作无关,无扫描过程,无缓存创建 | (1)对RegionSever产生影响小。 (2)不同集群之间也可以拷贝,不会对服务器产生直接影响。 (3)本地和集群间备份 | 比较推荐的方式 |
三、快照的原理
离线方式是disable table,由HBase Master遍历HDFS中的table metadata和hfiles,建立引用。
在线方式是enable table snapshot的过程类似于两阶段提交,prepare和commit阶段,HMaster收到snapshot命令后,作为coordinator,从meta region中取出表的region和对应的region server的信息,这些region server就作为第二阶段提交的participant,prepare阶段对region server本地表的region做快照存入HDFS的临时目录,commit阶段把HMaster把临时目录改成正确的目录。在此期间,HMaster和 region server 的数据共享通过ZK来完成。
四、快照主要应用场景
- 增量备份,通常情况下,对重要的业务数据,建议至少每天执行一次snapshot来保存数据的快照记录,并且定期清理过期快照,这样如果业务发生重要错误需要回滚的话是可以回滚到之前的一个快照点的。
- 从用户或者应用异常中还原;从一个已知的安全状态恢复/还原
- 查看之前的快照并有选择性的合并不同写入产品环境
- 如果要对集群做重大的升级的话,建议升级前对重要的表执行一次snapshot,一旦升级有任何异常可以快速回滚到升级前。
- 数据迁移,生成快照,导入到其他集群进行操作。因为导出的快照是HDFS级别,所以不会像复制表那样降低HBase主集群的效率。机房在线迁移,通常情况是数据在A机房,因为A机房机位不够或者机架不够需要将整个集群迁移到另一个容量更大的B集群,而且在迁移过程中不能停服。基本迁移思路是先使用snapshot在B集群恢复出一个全量数据,再使用replication技术增量复制A集群的更新数据,等待两个集群数据一致之后将客户端请求重定向到B机房。
- 应用测试,构建测试环境:通过快照模拟生产环境下结构或应用发生的变化,测试完成即可丢弃
- 使用snapshot将表数据导出到HDFS,再使用Hive/Spark等进行离线OLAP分析,比如审计报表、月度报表等
五、快照的相关操作
5.1在Hbase的配置文件hbase-site.xml中配置快照
HDP默认开启的,可以进入hbase shell直接做表的快照。
<property>
<name>hbase.snapshot.enabled</name>
<value>true</value>
</property>
5.2在Hbase shell中进行备份表
备份表
在数据目录下可以看到生成 .hbase-snapshot文件夹
可以看到快照表路径下 有两个文件,一个记录快照信息,一个记录快照表的数据信息。
5.3查看快照
查看快照:list_snapshots
查看后可以看到具体快照名称、源表、以及创建日期
5.4克隆表
利用快照可以迅速的克隆一张表,并且新表中的数据与创建快照时表中的数据一致,针对克隆表的修改不会影响快照及原始表。
### 克隆快照表
hbase(main):004:0* clone_snapshot 'traffic_device_counter_inout_20220429','traffic_device_counter_inout_test'
### 统计克隆表的行数
hbase(main):010:0> count 'traffic_device_counter_inout_test'
### 统计源表行数
hbase(main):010:0> count 'traffic_device_counter_inout'
5.5利用快照恢复表
(1)查看 person表,并做快照
(2)现在对这张表插入2条数据
hbase(main):066:0* put 'person','0145bcba86a85a2#20220313','info:name','zhangwuji'
Took 0.0044 seconds
hbase(main):067:0> put 'person','0145bcba86a85a2#20220313','info:age','23'
Took 0.0042 seconds
hbase(main):068:0> put 'person','0145bcba86a85a2#20220313','info:sex','male'
Took 0.0042 seconds
hbase(main):069:0> put 'person','0145bcba86a85a2#20220313','info:addres','beijing'
Took 0.0042 seconds
hbase(main):070:0> scan 'person'
ROW COLUMN+CELL
0145bcba86a85a2#20220313 column=info:addres, timestamp=1651311991496, value=beijing
0145bcba86a85a2#20220313 column=info:age, timestamp=1651311990440, value=23
0145bcba86a85a2#20220313 column=info:name, timestamp=1651311990416, value=zhangwuji
0145bcba86a85a2#20220313 column=info:sex, timestamp=1651311990464, value=male
0145bcba86a85a2#20220314 column=info:addres, timestamp=1651311990349, value=Xian
0145bcba86a85a2#20220314 column=info:age, timestamp=1651311990300, value=13
0145bcba86a85a2#20220314 column=info:name, timestamp=1651311990278, value=zhangsanfeng
0145bcba86a85a2#20220314 column=info:sex, timestamp=1651311990325, value=male
2 row(s)
Took 0.0417 seconds
hbase(main):071:0> disable 'person'
Took 0.4442 seconds
hbase(main):072:0>
禁用该表
hbase(main):071:0> disable 'person'
使用person 的快照表将该表恢复到快照时的状态
hbase(main):081:0> restore_snapshot 'person_20220430_sna'
enable原始表, 可以看到表已经恢复到快照时的状态,具体见如下图
hbase(main):082:0> enable 'person'
Took 0.7315 seconds
hbase(main):083:0> scan 'person'
ExportSnapshot 工具将与快照相关的所有数据(hfiles、日志、快照元数据)复制到另一个集群。 该工具执行类似于 distcp 的 Map-Reduce 作业,以在两个集群之间复制文件,并且由于它在文件系统级别工作,因此 hbase 集群不必在线。
hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot -snapshot MySnapshot -copy-to hdfs://srv2:8082/hbase -mappers 16
会使用MR进行数据的并行迁移,因此需要在开启MR的机器上进行迁移。HMaster和HRegionServer并不参与这个过程,因此不会带来额外的内存开销以及GC开销。唯一的影响是DataNode在拷贝数据的时候需要额外的带宽以及IO负载,ExportSnapshot也针对这个问题设置了参数-bandwidth来限制带宽的使用。
### 没有跨集群,集群内部的拷贝,拷贝到 HDFS /kangll/tmp路径下
hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot -snapshot person_20220430_sna -copy-to hdfs://winner/kangll/tmp -mappers 16
拷贝到本集群的/kangll/tmp 路径下
快照的删除操作,两个快照,我们删除其中一个
总结:如果现有的工具解决不了数据拷贝和快照问题,我们自定义实现数据的移动和拷贝,生产中我们的 HBase表结果发生了变化,所以代码自定义实现了数据拷贝,也是小数据量逐步的复制,避免影响线上正常业务。