HBase快照

什么是快照

快照就是一份元信息的合集,允许管理员恢复到表的先前状态,快照不是表的复制而是一个文件名称列表,因而不会复制数据。

完全快照恢复是指恢复到之前的“表结构”以及当时的数据,快照之后发生的数据不会恢复。快照就是一系列元数据信息集合,能够允许管理员将表恢复至生成快照时的状态。快照不是表的复制,最简单的方式就是把它想象成为了追踪元数据(表信息和域)和数据(HFiles, 内存存储, WALs)一系列操作的集合,在生成快照操作中没有执行任何复制数据的动作。

离线快照:讨论快照的最简单的场景就是当一张表被关闭了。关闭一张表意味着所有的数据都写入了磁盘,而且不允许任何读写操作。在这种情况下,生成快照仅仅就是获取表元数据并且与磁盘中的HFiles保持关联。主节点执行操作需要的时间,主要取决于HDFS的namenode提供文件列表需要的时间。

在线快照:在大部分情况下,表都是开启的,而且每个域服务器都不断的处理put和get请求。在这种情况下,主节点接收到快照请求并要求每个域服务器都为其负责的域生成一份快照。

主节点和域服务器之间的通信是通过Apache ZooKeeper的,使用了类似两阶段提交事务。主节点建立一个“准备快照”的znode。每个域服务器会处理请求,并且为指定的表在其负责范围内的域准备快照。一旦准备完成,就会在准备请求的znode下建立一个子节点,意味着“准备完成”。

一旦所有域服务器都回报了他们的状态,主节点就建立另一个znode表示“提交快照”;每个域服务器会完成快照并在加入节点前报告状态。一旦所有域服务器都回报完成,主节点会完成快照并标记操作完成。若某个域服务器报告失败,主节点会新建znode来广播放弃信息。当域服务器继续处理新请求时,不同的用例情况下可能需要不同的一致性模型。例如有人可能对不包含内存中最新数据的不完全的快照感兴趣,而有的人希望锁定写操作来获得一份完全保证一致性的快照以及其他可能性。

因此在域服务器上生成快照的程序是可拔插的。现在唯一的实现是“Flush Snapshot”,就是在生成快照之前进行写入操作(flush)来保证列一致性,其他的使用不同的一致性策略的程序可能会在未来实现。在线生成快照需要的时间取决于实施快照操作并且将成功状态回报给主节点最慢的域服务器,这样的操作差不多在数秒之内完成。


快照的作用

HBase中存在的备份或克隆表的方法就是使用复制/导出表或者在关闭表之后拷贝HDFS中的所有HFile。复制或导出是通过一系列工具调用MapReduce来扫描并复制表,这样会对RegionServer有直接的影响。关闭表会停止所有的读写操作,实际环境中往往无法接受。

相比之下HBase快照允许管理员不拷贝数据,而直接克隆一张表,这对域服务器产生的影响最小。将快照导出至其他集群不会直接影响到任何服务器;导出只是带有一些额外逻辑的群间数据同步。

快照优势

导出快照与复制/导出表除了更好地保持一致性外,主要的不同在于导出快照是在HDFS的层面操作的。这意味着HMaster和域服务器与操作无关。因此不需要为不必要的数据创建缓存空间,也不会有扫描过程。因为大量对象创建引起的GC暂停,对于HBase 来说主要性能影响就是DataNode额外的网络和磁盘负载。

应用场景

从用户/应用异常中还原
从一个已知的安全状态恢复/还原
查看之前的快照并有选择性的合并不同写入产品环境
当主应用程序升级或改版时保存快照。
在指定时间审查和/或报告数据。
按照规定捕获月度数据
生成日终/月末/季末报告
应用测试
通过快照模拟生产环境下结构或应用发生的变化,测试完成即可丢弃。例如:生成快照,利用快照中内容构建新表(原有结构+数据)并且修改新表的结构,添加或删除列之类。(原始表、快照和新表保持相互独立)
减少工作压力
生成快照,导入到其他集群,然后运行MapReduce jobs。因为导出的快照是HDFS级别,所以不会像复制表那样降低HBase主集群的效率。

理解HBase表

HBase表包含一系列元数据信息和键值对集合。

表信息:一份描述“设置”的清单文件,如列族,压缩类型与编码,布隆(bloom)过滤器类型等。

域:表“分区”称之为域。每个域都通过定义起始键和终止键来负责管理一份连续的键值集合。

WALs/MemStore:在数据写入磁盘之前,put会先写到写前日志(Write Ahead Log – WAL)然后保存在内存中,直到内存压力触发写入磁盘。WAL为恢复那些因为异常没有写入磁盘的put操作提供了一个简单的方式。

HFiles:某些时候所有数据都写入了磁盘。HFile就是HBase存储键值对的文件格式,HFile是不变的,但是当合并或域删除时可以被删除掉。

快照操作

生成快照:
本操作尝试对指定表生成快照。如果集群在执行数据均衡、分隔或合并等操作时,可能会引起操作失败。

克隆快照:
本操作使用与指定快照相同的结构数据构建一张新表。操作结果会生成一张有完整功能的表,对该表的任意修改不会对原表或快照产生影响。

还原快照:
本操作将表结构和数据恢复到生成快照时的状态。(注意:本操作会舍弃快照生成后任何改变)。

删除快照:
本操作将系统中的快照删除,释放未共享的磁盘空间, 而且不会影响其他克隆或快照。

导出快照:
本操作将快照数据和元数据复制到其他集群。操作只会涉及HDFS,不会与HMaster或RegionServer产生任何联系,因此HBase集群可以关闭。

目前的限制

快照需要依赖一些条件,目前有一些工具还没有很好的整合新特性:
 合并引用快照的集群会引起快照和克隆表的数据丢失。
 当复制开启时还原一个表,会造成两个集群不同步,表不会在复制集上还原。

通过检查hbase-site.xml中的hbase.snapshot.enabled是否设置为true确认打开了快照许可。HBase以往数据的备份基于distcp或者copyTable等工具,这些备份机制或多或少对当前的online数据读写存在一定的影响,snapshot提供了一种快速的数据备份方式,无需进行数据copy。


 hbase.snapshot.enabled
 true


Snapshot操作类型包括在线和离线的

离线方式是disabletable,由HBase Master遍历HDFS中的table metadata和hfiles,建立对他们的引用。


在线方式是enabletable,由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指定的数据文件。参见clone新表操作示意图:


snapshot参考指令

1、获取指定表的快照使用snapshot命令(不产生文件复制)
hbase>snapshot 'tableName','snapshotName'

2、列出所有的快照,使用list_snapshot命令。会展示出快照名称,源表,以及创建日期和时间
hbase>list_snapshots

3、删除快照使用deleted_snapshot命令。删除快照不会影响到克隆表或者之后生成的快照。
hbase>delete_snapshot 'snapshotName'

4、使用clone_snapshot命令从指定的快照生成新表(克隆)。由于不会产生数据复制,所以最终用到的数据不会是之前的两倍。
hbsse>clone_snapshot 'snapshotName','newTableName'

5、使用restore_snapshot命令将指定快照内容替换当前表结构或数据;
hbase>restore_snapshot 'snapshotName'
用快照恢复数据,它需要先禁用表,再进行恢复
hbase>disable 'myTable' 
hbase>restore_snapshot 'myTableSnapshot-122112'

提示:因为备份(replication)是系统日志级别的,而快照是文件系统级别的,当使用快照恢复之后,副本会和master出于不同的状态,如果你需要使用恢复的话,你要停止备份,并且重置bootstrap。如果是因为不正确的客户端行为导致数据丢失,全表恢复又需要表被禁用,可以采用快照生成一个新表,然后从新表中把需要的数据用map-reduce拷贝到主表当中。

6、使用ExportSnapshot工具将现有快照导出至其他集群。导出工具不会影响到域服务器负载,只是工作在HDFS层面,所以需要指定HDFS路径(其他集群的hbase根目录)。该操作要用hbase的账户执行,并且在hdfs当中要有hbase的账户建立的临时目录(hbase.tmp.dir参数控制)

hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot -snapshotName -copy-to hdfs :///hbfreeoa2:8082/hbase

采用16个mappers来把一个名为MySnapshot的快照复制到一个名为hbfreeoa2的集群当中
hbase class org.apache.hadoop.hbase.snapshot.ExportSnapshot -snapshot MySnapshot -copy-to hdfs://hbfreeoa2:8020/hbase -mappers 16

零复制快照、恢复、克隆

快照和复制/导出表之间的主要差异是快照操作只写入元数据,不涉及海量数据。HBase的主要设计原则之一就是一旦文件写入就不再修改。文件不可变意味着快照只需保持对快照产生时存在的文件追踪,并且在压缩时负责提示系统该文件不应删除而是应当归档保存。

同样的原则也适用于克隆和恢复操作。因为文件是不变的,新建一个表只需要通过快照“链接”到文件引用即可。导出快照是唯一需要复制数据的操作,因为其他集群没有数据文件。

导出快照与复制/导出表

导出快照与复制/导出表除了更好地保持一致性外,主要的不同在于导出快照是在HDFS的层面操作的。这意味这Master和域服务器与操作无关。因此不需要为不必要的数据创建缓存空间,也不会有扫描过程因为大量对象创建引起的GC暂停。对于HBase来说主要性能影响就是DataNode额外的网络和磁盘负载。

从快照中克隆表

当管理员执行克隆操作时,按快照中的表结构建立了新表并按快照域信息中的开始/结束键分割。一旦表元数据建立,能够像快照使用的方式一样而不用拷入数据。因为HFiles是不可变的只是对建立的源文件的引用,这样就避免了数据拷贝并允许克隆能够修改而不影响源表或镜像。克隆操作是由主节点执行的。

从快照中恢复表

恢复操作与克隆操作相似。你可以把它想象成时删除表之后再从快照中克隆出来。恢复操作会恢复快照中的老数据并删除快照中不存在的数据,表结构也会恢复到与快照相同。在底层,恢复操作时通过比较表状态与快照间不同来实现的,移除快照中不存在的文件并加上快照中有而当前表状态中没有的文件关联。同样的表结构也被修改至快照生成时刻的状态。恢复操作是由主节点执行并且表要处于关闭状态。


参考来源

Apache HBase快照介绍

HBase snapshot分析

转载于:https://my.oschina.net/weikan/blog/785579

你可能感兴趣的:(大数据,运维)