HBase–Snapshot(快照)的使用

1. 基于Hbase snapshot数据快速备份方法

连接到Hbase:

hbase shell

需要开启快照功能,在hbase-site.xml文件中添加如下配置项:

  <property>
  <name>hbase.snapshot.enabled</name>
  <value>true</value>
  </property>

(1)创建快照

查看snapshot

list_snapshots

查看help:

hbase(main):009:0> snapshot

ERROR: wrong number of arguments (0 for 2)

Here is some help for this command:
Take a snapshot of specified table. Examples:

  hbase> snapshot 'sourceTable', 'snapshotName'
  hbase> snapshot 'namespace:sourceTable', 'snapshotName', {SKIP_FLUSH => true}

创建snapshot,为表 tableName 打一个快照 table_snapshot,快照不涉及数据移动,可以在线完成。

snapshot 'tableName','table_snapshot'

(2)删除快照

删除并查看快照

delete_snapshot 'table_snapshot'

(3)基于快照,clone

基于快照,clone一个新表。根据快照回复出一个新表,回复过程不涉及数据移动,可以在秒级完成。

clone_snapshot 'table_snapshot','new_table'

(4)基于快照回复表(原hbase表tableName需要禁用)

命令如下,恢复指定快照,恢复过程会替代原有数据,将表还原到快照点,快照点之后的搜友更新将会丢失。

需要注意的是原表需要先disable掉,才能执行restore_snaoshot操作。

# 禁用表
disable 'tableName'
# 查看表是否存在
exists 'tableName'
restore_snapshot 'table_snapshot'

(5)基于快照将数据导出到另外一个集群中的本地文件中

利用mapreduce job 将 table_snapshot这个 snapshot 到处到本地目录usr/hdp/2.5.3.0-37/hbase/hbasedata

hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot -snapshot 'table_snapshot' -copy-to file:usr/hdp/2.5.3.0-37/hbase/hbasedata -mappers 16

(6)基于快照将数据导出到另外一个集群中的hdfs上

hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot -snapshot 'table_snapshot' -copy-to hdfs:///hbase/bak_emp_snapshot -mappers 16

使用 ExportSnapshot 命令可以将A集群的快照数据迁移到B集群,ExportSnapshot 是HDFS 层面的擦欧总,会使用MR进行数据的并行迁移,因此需要在开启 MR 的机器上进行迁移。HMaster 和 HRegionServer 并不参议这个过程,因此不会带来额外的内存开销以及GC开销。唯一的影响是 DN 在拷贝数据的时候需要额外的带宽以及IO负载,ExportSnapshot 也针对这个问题设置了参数 -bandwidth 来限制带宽的使用

2. snapshot 基本原理

snapshot机制并不会拷贝数据,可以理解为 它是元数据的一份指针。在HBase这种LSM类型系统结构下是比较容易理解的,我们知道HBase数据文件一旦落到磁盘之后就不再允许更新删除等原地修改操作,如果想更新删除的话可以追加写入新文件(HBase中根本没有更新接口,删除命令也是追加写入)。这种机制下实现某个表的snapshot只需要给当前表的所有文件分别新建一个引用(指针),其他新写入的数据重新创建一个新文件写入即可。如下图所示:

在这里插入图片描述

snapshot 流程主要涉及3个步骤:

  1. 加一把全局锁,此时不允许任何的数据写入更新以及删除
  2. 将 Memstore 中的缓存数据 flush 到文件中(可选)
  3. 为所有HFile文件分别新建引用指针,这些指针元数据就是snapshot

snapshot 使用场景

  1. 增量备份,通常情况下,对重要的业务数据,建议至少每天执行一次snapshot来保存数据的快照记录,并且定期清理过期快照,这样如果业务发生重要错误需要回滚的话是可以回滚到之前的一个快照点的。
  2. 从用户或者应用异常中还原;从一个已知的安全状态回复/还原
  3. 查看之前的快照并有选择性的合并不同写入产品环境
  4. 如果要对集群做重大的升级的话,建议升级前对重要的表执行一次 snapshot,一旦升级有任何异常可以快速回滚到升级前。
  5. 数据迁移,生成快照,导入到其他集群进行操作。因为导出的快照是HDFS级别,所以不会像复制表那样降低HBase主集群的效率。机房在线迁移,通常情况是数据在A机房,因为A机房机位不够或者机架不够需要将整个集群迁移到另一个容量更大的B集群,而且在迁移过程中不能停服。基本迁移思路是先使用snapshot 在B集群恢复出一个全量数据,再使用replication 技术增量复制A集群的更新数据,等待两个集群数据一致之后将客户端请求重定向到B机房。
  6. 应用测试,构建测试环境:通过快照模拟生产环境下结构或应用发生的变化,测试完成即可丢弃
  7. 使用snapshot 将表数据导出到HDFS,再使用Hive\Spark 等进行离线OLAP 分析,比如审计报表、月度报表等
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐