HBase 快照允许您获取表的副本(包括内容和元数据),并且性能影响非常小。快照是表元数据的不可变集合,以及在拍摄快照时包含表的 HFile 列表。快照的“克隆”从该快照创建新表,快照的“恢复”将表的内容返回到创建快照时的内容。 “克隆”和“恢复”操作不需要复制任何数据,因为底层 HFiles(包含 HBase 表数据的文件)不会被任何操作修改。 Simiarly,将快照导出到另一个集群对本地集群的 RegionServers 几乎没有影响。
在版本 0.94.6 之前,备份或克隆表的唯一方法是使用 CopyTable / ExportTable,或者在禁用表后复制 HDFS 中的所有 hfiles。这些方法的缺点是您可以降低区域服务器性能(复制/导出表),或者您需要禁用表,这意味着没有读取或写入;这通常是不可接受的。
要打开快照支持,只需将hbase.snapshot.enabled
属性设置为 true 即可。 (默认情况下,快照在 0.95+中启用,默认情况下在 0.94.6+时关闭)
<property>
<name>hbase.snapshot.enabled</name>
<value>true</value>
</property>
无论是启用还是禁用,您都可以创建表的快照。快照操作不涉及任何数据复制。
$ ./bin/hbase shell
hbase> snapshot 'myTable', 'myTableSnapshot-122112'
拍摄快照而不刷新
默认行为是在拍摄快照之前在内存中执行数据刷新。这意味着内存中的数据包含在快照中。在大多数情况下,这是期望的行为。但是,如果您的设置可以容忍从快照中排除内存中的数据,则可以使用snapshot
命令的SKIP_FLUSH
选项在拍摄快照时禁用和刷新。
hbase> snapshot 'mytable', 'snapshot123', {SKIP_FLUSH => true}
无论是启用还是禁用刷新,都无法确定或预测给定快照中是否包含非常并发的插入或更新。快照仅是时间窗口中表的表示。快照操作到达每个区域服务器所花费的时间可能从几秒到一分钟不等,具体取决于资源负载和硬件或网络的速度等因素。也无法知道给定的插入或更新是在内存中还是已刷新。
列出所有拍摄的快照(通过打印名称和相关信息)。
$ ./bin/hbase shell
hbase> list_snapshots
您可以删除快照,如果不再需要,将删除为该快照保留的文件。
$ ./bin/hbase shell
hbase> delete_snapshot 'myTableSnapshot-122112'
从快照中,您可以创建一个新表(克隆操作),其中包含拍摄快照时的相同数据。克隆操作不涉及数据副本,对克隆表的更改不会影响快照或原始表。
$ ./bin/hbase shell
hbase> clone_snapshot 'myTableSnapshot-122112', 'myNewTestTable'
还原操作需要禁用表,并且表将恢复到拍摄快照时的状态,如果需要,还会更改数据和架构。
$ ./bin/hbase shell
hbase> disable 'myTable'
hbase> restore_snapshot 'myTableSnapshot-122112'
由于 Replication 在日志级别工作,而快照在文件系统级别工作,因此在还原之后,副本将与主服务器处于不同的状态。如果要使用还原,则需要停止复制并重做引导程序。
如果由于行为不当而导致部分数据丢失,而不是需要禁用表的完全恢复,您可以从快照克隆表并使用 Map-Reduce 作业从您复制所需的数据,克隆到主要的一个。
如果您使用 AccessController 协处理器的安全性(请参阅 hbase.accesscontrol.configuration ),则只有全局管理员才能获取,克隆或还原快照,并且这些操作不会捕获 ACL 权限。这意味着还原表会保留现有表的 ACL 权限,而克隆表会创建一个没有 ACL 权限的新表,直到管理员添加它们为止。
ExportSnapshot 工具将与快照(hfiles,日志,快照元数据)相关的所有数据复制到另一个群集。该工具执行类似于 distcp 的 Map-Reduce 作业,以在两个集群之间复制文件,并且由于它在文件系统级别工作,因此 hbase 集群不必在线。
使用 16 个映射器将名为 MySnapshot 的快照复制到 HBase 集群 srv2(hdfs:/// srv2:8082 / hbase):
$ bin/hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot -snapshot MySnapshot -copy-to hdfs://srv2:8082/hbase -mappers 16
限制带宽消耗
您可以通过指定-bandwidth
参数来限制导出快照时的带宽消耗,该参数需要一个表示每秒兆字节数的整数。以下示例将上述示例限制为 200 MB /秒。
$ bin/hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot -snapshot MySnapshot -copy-to hdfs://srv2:8082/hbase -mappers 16 -bandwidth 200
您可以使用以下过程从 Amazon S3 存储和检索快照。
您还可以在 Microsoft Azure Blob 存储中存储快照。请参阅在 Microsoft Azure Blob 存储中存储快照。
先决条件
您必须使用 HBase 1.0 或更高版本以及 Hadoop 2.6.1 或更高版本,这是第一个使用 Amazon AWS SDK 的配置。
您必须使用s3a://
协议连接到 Amazon S3。旧的s3n://
和s3://
协议有各种限制,不使用 Amazon AWS SDK。
必须在运行用于导出和还原快照的命令的服务器上配置s3a://
URI 并使其可用。
完成先决条件后,像平常一样拍摄快照。之后,您可以使用org.apache.hadoop.hbase.snapshot.ExportSnapshot
命令将其导出,如下所示,替换copy-from
或copy-to
指令中您自己的s3a://
路径,并根据需要替换或修改其他选项:
$ hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot \
-snapshot MySnapshot \
-copy-from hdfs://srv2:8082/hbase \
-copy-to s3a://<bucket>/<namespace>/hbase \
-chuser MyUser \
-chgroup MyGroup \
-chmod 700 \
-mappers 16
$ hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot \
-snapshot MySnapshot
-copy-from s3a://<bucket>/<namespace>/hbase \
-copy-to hdfs://srv2:8082/hbase \
-chuser MyUser \
-chgroup MyGroup \
-chmod 700 \
-mappers 16
您也可以通过包含-remote-dir
选项将org.apache.hadoop.hbase.snapshot.SnapshotInfo
实用程序与s3a://
路径一起使用。
$ hbase org.apache.hadoop.hbase.snapshot.SnapshotInfo \
-remote-dir s3a://<bucket>/<namespace>/hbase \
-list-snapshots