在之前,备份或者拷贝一个表只能用copy/export表,或者disable表后,从hdfs中拷贝出所有hfile。copy/export表用的是MapReduce来scan和copy表,这会对Region Server产生直接的性能影响,而用disable后拷贝文件则是直接不能访问了。
以此相反,HBase的snapshots功能可以让管理员不用拷贝数据的情况下轻松拷贝table,并且只会对RS造成很小影响。导出snapshots到另一个集群不会直接作用于RS,只是添加一些额外的逻辑。
下面是一些实用snapshots的场景:
一个snapshot其实就是一组metadata信息的集合,它可以让管理员将表恢复到以前的一个状态。snapshot并不是一份拷贝,它只是一个文件名的列表,并不拷贝数据。一个全的snapshot恢复以为着你可以回滚到原来的表schema和创建snapshot之前的数据。
操作
snapshot和CopyTable/ExportTable最大的区别是snapshot仅涉及metadata,不涉及数据拷贝。
Hbase一个重要的设计就是一旦写到一个文件就不会修改了。有不可修改的文件意味着一个snapshot仅需保持当前文件的使用相关信息就可以了, 并且,当compaction发生的时候,snapshot通知hbase系统仅把这些文件归档而不要删除它。
同样,当克隆或者恢复操作发生的时候,由于这些不变的文件,当用snapshot创建新表的时候仅需链接向这些不变的文件就行了。
导出snapshot是唯一需要拷贝数据的操作,这是因为其它的集群并没有这些数据文件。
除去更加好的一致性保证外,和Copy/Export作业相比,最大的不同是导出snapshot操作是在HDFS层级进行的。这就意味着hbase的master和Region Server是不参与该操作的,因此snapshot导出不会创建一些不必要的数据缓存,并且也不会因为由于很多scan操作导致的GC。snapshot导出操作产生的网络和磁盘开销都被HDFS的datanode分摊吸收了。
要想使用snapshot功能,请确认你的hbase-site.xml中的hbase.snapshot.enabled
配置项为true,如下:
1 |
<property> |
2 |
|
3 |
<name>hbase.snapshot.enabled</name> |
4 |
5 |
<value> true </value> |
6 |
|
7 |
</property> |
创建一个snapshot用如下命令,该操作没有文件拷贝操作:
1 |
hbase> snapshot ‘tableName’, ‘snapshotName’ |
要想知道系统中创建了哪些snapshot,可以用list_snapshot命令,它会显示snapshot名,源表和创建时间日期。
1 |
hbase> list_snapshots |
2 |
SNAPSHOT TABLE + CREATION TIME |
3 |
TestSnapshot TestTable (Mon Feb 25 21 : 13 : 49 + 0000 2013 )</pre> |
要想移除snapshot,用delete_snapshot命令,移除snapshot不会对已经克隆好的表和随后发生的snapshot造成任何影响。
1 |
hbase> delete_snapshot ‘snapshotName’ |
要想使用snapshot来创建一个新表,用clone_snapshot命令。该操作也无任何数据拷贝操作发生。
1 |
hbase> clone_snapshot ‘snapshotName’, ‘newTableName’ |
要是想恢复或者替换当前表的schema和数据,用restore_snapshot命令。
1 |
hbase> restore_snapshot ‘snapshotName’ |
要想导出一个snapshot到另外的集群,用ExportSnapshot工具。导出操作不会对Region server造成额外的负担。因为它工作在HDFS层级,你仅需指定HDFS的位置(其它集群的hbase.rootdir)即可,如下。
1 |
hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot -snapshot |
2 |
SnapshotName -copy-to hdfs: ///srv2:8082/hbase |
Snapshots依赖于一些想当然的地方,当前还有很多新特性并没有完全集成到工具里:
当前的snapshot特性以及包括了所有基本功能,但是依然还有很多工作要做,例如质量(metrics),Web UI集成,磁盘使用优化等。
要想了解更多snapshot相关信息,请看官方文档的snapshot一节。