# 备份和恢复

## 79\. 概述

备份和还原是许多数据库提供的标准操作。有效的备份和还原策略有助于确保用户可以在发生意外故障时恢复数据。 HBase备份和还原功能有助于确保使用HBase作为规范数据存储库的企业可以从灾难性故障中恢复。另一个重要功能是能够将数据库还原到特定时间点，通常称为快照。

HBase备份和还原功能可以在HBase集群中的表上创建完整备份和增量备份。完整备份是应用增量备份以构建不同版本快照的基础。可以按计划运行增量备份以捕获随时间的变化，例如通过使用Cron任务。增量备份比完全备份更具成本效益，因为它们仅捕获自上次备份以来的更改，并且还使管理员能够将数据库还原到任何先前的增量备份。此外，如果你不想进行整个数据集备份和恢复，该机制也支持启用表级数据备份和恢复。

备份和还原功能是对HBase复制功能的补充。虽然HBase复制非常适合创建数据的“热”副本（复制数据可立即用于查询），但备份和恢复功能非常适合创建“冷”数据副本（必须手动来恢复系统）。用户以前只能通过ExportSnapshot功能创建完整备份。增量备份实现是对ExportSnapshot提供的备份功能的改进。

备份和还原功能使用DistCp在群集之间传输文件。 [HADOOP-15850](https://issues.apache.org/jira/browse/HADOOP-15850)修复了一个CopyCommitter＃concatFileChunks无条件地尝试将正在DistCp传输的文件都拼接起来，拷贝到目标集群（尽管文件是独立的)的bug。如果没有[HADOOP-15850](https://issues.apache.org/jira/browse/HADOOP-15850)的修复，拷贝会失败。以下是能正确支持备份和恢复功能的hadoop版本。

*   2.7.x

*   2.8.x

*   2.9.2+

*   2.10.0+

*   3.0.4+

*   3.1.2+

*   3.2.0+

*   3.3.0+

## 80\. 术语

备份和还原功能引入了新术语，可用于了解系统控制流。


*   _A backup_: 数据和元数据的逻辑单元，可以将表恢复到特定时间点的状态。

*   _Full backup_: 一种备份类型，完整包含某个时间点表的所有内容。

*   _Incremental backup_: 一种备份类型，包含自上一次完整备份以来表中的所有更改内容。

*   _Backup set_: 一个用户定义的名称，用来表示一个或多个可以执行备份操作的表。

*   _Backup ID_: 一个唯一的名称，用于标识一份备份，例如： `backupId_1467823988425`。

## 81\. 规划

有一些常用策略可用于在你的环境中实现备份和还原。以下部分将展示这些策略的实现方式和内在权衡。

>此备份和还原工具尚未在启用透明数据加密（TDE）的HDFS群集上进行测试。这与未决问题[HBASE-16178](https://issues.apache.org/jira/browse/HBASE-16178)有关。


### 81.1\. 集群内备份


此策略将备份数据存储在备份源的集群上。这种方法仅适用于测试，因为它不会为集群提供任何额外的安全性。


![backup intra cluster](img/af3ab01e99efede4a55dff10d7e1717b.jpg)Figure 4\. 集群内备份

### 81.2\. 使用专用集群备份

此策略提供更高的容错能力，并提供了一条灾难恢复途径。在此设置中，您将备份存储在单独的HDFS群集上，方法是将备份目标群集的HDFS URL提供给备份实用程序。您应该考虑备份到不同的物理位置，例如不同的数据中心。

通常备份专用HDFS集群会使用更经济的硬件配置来节省资金。

![backup dedicated cluster](img/e270c1fd9489e56c40b608613aebba45.jpg)Figure 5\. 专用HDFS备份集群

### 81.3\. 备份到云或存储设备供应商

保护HBase增量备份的另一种方法是将数据存储在属于第三方供应商且异地的安全服务器上。供应商可以是公共云提供商或使用Hadoop文件系统兼容的存储供应商，例如S3和其他与HDFS兼容的系统。

![backup cloud appliance](img/28d3dba63300aff4c4afa3539dbaba24.jpg)Figure 6\. 备份到云或存储设备供应商

> HBase备份应用程序不支持备份到多个目标。解决方法是从HDFS或S3手动创建备份文件的副本。

## 82\. 首次配置步骤


本节包含使用备份和还原功能的必要配置。由于此功能大量使用YARN的MapReduce框架来并行化这些I / O繁重的操作，因此配置更改扩展到了`hbase-site.xml`之外。

### 82.1\. 在YARN中授权“hbase”系统用户


YARN **container-executor.cfg** 配置文件必须具有以下属性设置：_allowed.system.users =hbase_。此配置文件的条目中不允许有空格。


> 跳过此步骤将导致执行备份任务时发生运行时错误。

**与备份和恢复功能有关的的有效container-executor.cfg文件的示例如下:**

```
yarn.nodemanager.log-dirs=/var/log/hadoop/mapred
yarn.nodemanager.linux-container-executor.group=yarn
banned.users=hdfs,yarn,mapred,bin
allowed.system.users=hbase
min.user.id=500
```

### 82.2\. HBase相关更改


将以下属性添加到hbase-site.xml里并重新启动HBase（如果它已在运行）。

> “，...”是一个省略号，意味着这是一个以逗号分隔的值列表，而不是应该添加到hbase-site.xml的文本文本。

```
<property>
  <name>hbase.backup.enable</name>
  <value>true</value>
</property>
<property>
  <name>hbase.master.logcleaner.plugins</name>
  <value>org.apache.hadoop.hbase.backup.master.BackupLogCleaner,...</value>
</property>
<property>
  <name>hbase.procedure.master.classes</name>
  <value>org.apache.hadoop.hbase.backup.master.LogRollMasterProcedureManager,...</value>
</property>
<property>
  <name>hbase.procedure.regionserver.classes</name>
  <value>org.apache.hadoop.hbase.backup.regionserver.LogRollRegionServerProcedureManager,...</value>
</property>
<property>
  <name>hbase.coprocessor.region.classes</name>
  <value>org.apache.hadoop.hbase.backup.BackupObserver,...</value>
</property>
<property>
  <name>hbase.master.hfilecleaner.plugins</name>
  <value>org.apache.hadoop.hbase.backup.BackupHFileCleaner,...</value>
</property>
```

## 83\. 备份和恢复指令


这包括管理员用于创建，恢复和合并备份的命令行机制。有关检查特定备份会话详细信息的工具将在下一节[备份映像管理](＃br.administration)中介绍。

运行命令`hbase backup help <command>`可以查看有关命令及其选项的基本信息。下面涉及到的信息都可以在对应命令帮助消息中找到。


### 83.1\. 创建一个备份镜像

|  | 


对于也使用Apache Phoenix的HBase集群：在备份中包含SQL系统目录表。如果需要恢复HBase备份，则可以通过访问系统目录表来恢复Phoenix与已还原数据的互操作性。

 |

运行备份和还原程序的第一步是执行完全备份，并将数据存储在与源不同的映像中。至少，您必须执行此操作才能获得基准，然后才能依赖增量备份。

以HBase超级用户身份运行以下命令:

```
hbase backup create <type> <backup_path>
```


命令完成运行后，控制台将显示SUCCESS或FAILURE状态消息。 SUCCESS消息包括 _backup\_ID_ 。备份ID是HBase master从客户端收到备份请求的Unix时间（也称为Epoch时间）。

|  | 


记录成功备份结束时显示的备份ID。一旦源群集出现故障并且您需要使用恢复操作恢复数据集，此时如果有备份ID则可以节省时间。

 |

#### 83.1.1\. 位置命令行参数

_type_


要执行的备份类型：_full_或 _incremental_。提醒一下，_incremental_ 备份需要 _full_ 备份才能存在。


_backup\_path_

_backup\_path_ 参数指定存储备份映像的位置的完整文件系统URI。有效前缀为 _hdfs:_, _webhdfs:_, _s3a:_或其他兼容的Hadoop文件系统实现。

#### 83.1.2\. 命名命令行参数

_-t <table_name[,table_name]>_


要备份的以逗号分隔的表列表。如果未指定表，则备份所有表。不支持正则表达式或通配符;必须明确列出所有表名。有关对表集合执行操作的更多信息，请参见[备份集](＃br.using.backup.sets)。与 _-s_ 选项互斥;二者之间必须选一个。

_-s <backup_set_name>_


根据备份集确定要备份的表。有关备份集的用途和用法，请参阅[使用备份集](＃br.using.backup.sets)。与 _-t_ 选项互斥。


_-w <number_workers>_

（可选）指定将数据复制到备份目标的并行工作线程数。备份当前是由MapReduce作业执行的，因此该值也对应于作业将生成的Mapper数。

_-b <bandwidth_per_worker>_


（可选）指定每个工作线程的带宽，以MB/秒为单位。

_-d_

可选）启用“DEBUG”模式，该模式打印有关备份创建的其他日志记录。

_-q <name>_


（可选）指定执行创建备份的MapReduce作业的YARN队列的名称。此选项有助于防止备份任务与其他高优先级MapReduce作业中竞争资源。

#### 83.1.3\. 用法示例

```
$ hbase backup create full hdfs://host5:8020/data/backup -t SALES2,SALES3 -w 3
```


此命令在路径 _/data/backup_ 中的NameNode为host5:8020的HDFS实例中创建两个表SALES2和SALES3的完整备份映像。 _-w_ 选项指定不超过三个并行工作完成操作。


### 83.2\. 从一个备份镜像中恢复

以HBase超级用户身份运行以下命令。您只能在正在运行的HBase集群上恢复备份，因为必须将数据重新分发到RegionServers才能成功完成操作。

```
hbase restore <backup_path> <backup_id>
```

#### 83.2.1\. 位置命令参数

_backup_path_

_backup\_path_ 参数指定存储备份映像的位置的完整文件系统URI。有效前缀为 _hdfs:_,  _webhdfs:_, _s3a:_或其他兼容的Hadoop文件系统实现。

_backup_id_

唯一标识要还原的备份映像的备份ID。

#### 83.2.2\. 命名命令参数

_-t <table_name[,table_name]>_

要恢复的以逗号分隔的表列表。有关对表集合执行操作的更多信息，请参见[备份集](＃br.using.backup.sets)。与 _-s_ 选项互斥;二者之间必须选一个。

_-s <backup_set_name>_

根据备份集确定要备份的表。有关备份集的用途和用法，请参阅[使用备份集](＃br.using.backup.sets)。与 _-t_ 选项互斥。

_-q <name>_

（可选）指定执行创建备份的MapReduce作业的YARN队列的名称。此选项有助于防止备份任务与其他高优先级MapReduce作业中竞争资源。

_-c_

（可选）执行还原的模拟运行。只执行检查操作，但不执行。

_-m <target_tables>_

（可选）要还原的以逗号分隔的表列表。如果未提供此选项，则使用原始表名。提供此选项时，必须提供与`-t`选项中相同数量的条目。

_-o_

（可选）指定对于要还原的目标表，如果存在，则执行覆盖操作。


#### 83.2.3\. 用法示例

```
hbase restore /tmp/backup_incremental backupId_1467823988425 -t mytable1,mytable2
```

此命令恢复增量备份映像的两个表。在此示例中：• `/tmp/backup_incremental`是包含备份映像的目录的路径。 • `backupId_1467823988425`是备份ID。 • `mytable1`和`mytable2`是要恢复的备份映像中的表的名称。


### 83.3\. 合并增量备份映像

此命令可用于将两个或多个增量备份映像合并为单个增量备份映像。这可用于将多个小型增量备份映像合并为一个较大的增量备份映像。此命令可用于将每小时增量备份合并到每日增量备份映像中，或每日增量备份合并到每周增量备份中。

```
$ hbase backup merge <backup_ids>
```

#### 83.3.1\. 位置命令参数

_backup_ids_


以逗号分隔的增量备份镜像ID列表，这些ID将合并到单个镜像中。

#### 83.3.2\. 命名命令参数

无。

#### 83.3.3\. 用法示例

```
$ hbase backup merge backupId_1467823988425,backupId_1467827588425
```

### 83.4\. 使用备份集


备份集可以通过减少表名重复输入的数量来简化HBase数据备份和还原的管理。您可以使用`hbase backup set add`命令将表分组到命名备份集中。然后，您可以使用`-set`选项在`hbase backup create`或`hbase restore`中调用备份集的名称，而不是单独列出组中的每个表。您可以拥有多个备份集。

>注意`hbase backup set add`命令和 _-set_ 选项之间的区别。必须先运行`hbase backup set add`命令，然后才能在其他命令中使用`-set`选项，因为在将备份集用作快捷方式之前，必须先命名和定义备份集。

如果运行`hbase backup set add`命令并指定系统上尚不存在的备份集名称，则会创建一个新集。如果运行具有现有备份集名称的命令的命令，则指定的表将添加到该集合中。

在此命令中，备份集名称区分大小写。

>备份集的元数据存储在HBase中。如果您无法访问具有备份集元数据的原始HBase集群，则必须指定单个表名以还原数据。

要创建备份集，请以HBase超级用户身份运行以下命令：

```
$ hbase backup set <subcommand> <backup_set_name> <tables>
```

#### 83.4.1\. 备份集子命令


以下列表详细介绍了hbase backup set命令的子命令。

>在hbase备份集设置完成操作后，您必须输入以下子命令中的一个（且不超过一个）。此外，备份集名称在命令行程序中是区分大小写的。

_add_

将表[s]添加到备份集。在此参数后面指定 _backup_set_name_值以创建备份集。

_remove_

从集中删除表。在tables参数中指定要删除的表。

_list_

列出所有备份集。

_describe_

显示备份集的描述信息。包括该集合是具有完整备份还是增量备份，备份的开始和结束时间以及集合中的表列表。此子命令必须为 _backup\_set\_name_ 指定一个有效值。

_delete_

删除备份集。在`hbase backup set delete`命令后直接输入 _backup\_set\_name_ 选项的值。



#### 83.4.2\. 位置命令参数

_backup_set_name_

用于分配或执行操作的备份集名称。备份集名称必须仅包含可打印字符，并且不能包含任何空格。

_tables_

要包含在备份集中的表（或单个表）的列表。输入表名是以逗号作为分隔符的列表。如果未指定表，则所有表都包含在集中。

>保存好备份集名称以及其在远程集群上相应的表列表和备份策略。如果主群集出现故障，这些信息可以帮助您。


#### 83.4.3\. 用法示例

```
$ hbase backup set add Q1Data TEAM3,TEAM_4
```


根据环境的不同，此命令将导致以下一项操作：

* 如果`Q1Data`备份集不存在，则创建包含表`TEAM_3`和`TEAM_4`的备份集。

* 如果`Q1Data`备份集已经存在，表`TEAM_3`和`TEAM_4`将被添加到`Q1Data`备份集。

## 84\. 备份镜像管理


`hbase backup`命令有几个子命令，可以帮助管理备份映像。大多数生产环境都需要重复备份，因此必须使用工具程序来帮助管理备份存储库的数据。通过某些子命令，您可以查找有助于识别与搜索特定数据相关的备份的信息。您还可以删除备份映像。

以下列表详细介绍了可以帮助管理备份的每个`hbase backup子命令`。以HBase超级用户身份运行完整的命令-子命令行。


### 84.1\. 管理备份进度

您可以通过运行 _hbase backup progress_命令并将备份ID指定为参数来监视另一个终端会话中正在运行的备份。

例如，以hbase超级用户身份运行以下命令以查看备份进度

```
$ hbase backup progress <backup_id>
```

#### 84.1.1\. 位置命令行参数

_backup_id_

通过查看进度信息指定要监视的备份。 backupId区分大小写。

#### 84.1.2\. 命名命令行参数

None.

#### 84.1.3\. 用法示例

```
hbase backup progress backupId_1467823988425
```

### 84.2\. 管理备份历史记录

此命令显示备份会话的日志。每个会话的信息包括备份ID，类型（完整或增量），备份中的表，状态以及开始和结束时间。使用可选的-n参数指定要显示的备份会话数。

```
$ hbase backup history <backup_id>
```

#### 84.2.1\. 位置命令行参数

_backup_id_

通过查看进度信息指定要监视的备份。 backupId区分大小写。

#### 84.2.2\. 命令命令行参数

_-n <num_records>_

（可选）最大备份记录数（默认值：10）。

_-p <backup_root_path>_

存储备份映像的完整文件系统URI。

_-s <backup_set_name>_

要获取其历史记录的备份集的名称。与 _-t_ 选项互斥。

_-t_ <table_name>

获取历史记录的表的名称。与 _-s_ 选项互斥。

#### 84.2.3\. 用法示例

```
$ hbase backup history
$ hbase backup history -n 20
$ hbase backup history -t WebIndexRecords
```

### 84.3\. 描述备份映像

此命令可用于获取有关特定备份映像的信息。

```
$ hbase backup describe <backup_id>
```

#### 84.3.1\. 位置命令行参数

_backup_id_

要描述的备份映像的ID。

#### 84.3.2\. 命名命令行参数

None.

#### 84.3.3\. 用法示例

```
$ hbase backup describe backupId_1467823988425
```

### 84.4\. 删除备份映像

此命令可用于删除不再需要的备份映像。

```
$ hbase backup delete <backup_id>
```

#### 84.4.1\. 位置命令行参数

_backup_id_

应删除备份映像的ID。

#### 84.4.2\. 命名命令行参数

None.

#### 84.4.3\. 用法示例

```
$ hbase backup delete backupId_1467823988425
```

### 84.5\. 备份修复命令

此命令尝试更正由于软件错误或未处理的故障情况而存在的持久备份元数据中的任何不一致。虽然备份实现尝试自行更正所有错误，但在系统无法自动恢复的情况下，此工具可能是必需的。


```
$ hbase backup repair
```

#### 84.5.1\. 位置命令行参数

None.

### 84.6\. 命名命令行参数

None.

#### 84.6.1\. 用法示例

```
$ hbase backup repair
```

## 85\. 配置键

备份和还原功能包括必需和可选配置键。

### 85.1\. 必需的属性

_hbase.backup.enable_ ：控制是否启用该功能（默认值：`false`）。将此值设置为`true`。

_hbase.master.logcleaner.plugins_ ：清除HBase Master中的日志时调用的逗号分隔的类列表。将此值设置为`org.apache.hadoop.hbase.backup.master.BackupLogCleaner`或将其附加到当前值。


_hbase.procedure.master.classes_ ：用Master中的Procedure框架调用的逗号分隔的类列表。将此值设置为`org.apache.hadoop.hbase.backup.master.LogRollMasterProcedureManager`或将其附加到当前值。

_hbase.procedure.regionserver.classes_ ：使用RegionServer中的Procedure框架调用的逗号分隔的类列表。将此值设置为`org.apache.hadoop.hbase.backup.regionserver.LogRollRegionServerProcedureManager`或将其附加到当前值。


_hbase.coprocessor.region.classes_ ：在表上部署的以逗号分隔的RegionObservers列表。将此值设置为`org.apache.hadoop.hbase.backup.BackupObserver`或将其附加到当前值。

_hbase.master.hfilecleaner.plugins_ ：部署在Master上的以逗号分隔的HFileCleaners列表。将此值设置为`org.apache.hadoop.hbase.backup.BackupHFileCleaner`或将其附加到当前值。

### 85.2\. 可选属性

_hbase.backup.system.ttl_ ：`hbase:backup`表中数据的生存时间（以秒为单位）（默认值：永久）。此属性仅在创建`hbase:backup`表之前有效。当此表已存在时，使用HBase shell中的`alter`命令修改TTL。有关此配置属性的影响的更多详细信息，请参见下面的[部分](#br.filesystem.growth.warning)。

_hbase.backup.attempts.max_ ：做hbase表快照时尝试执行的次数（默认值：10）。

_hbase.backup.attempts.pause.ms_ ：重试快照时需要等待的时间（以毫秒为单位）（默认值：10000）。

_hbase.backup.logroll.timeout.millis_ ：等待RegionServers在Master的过程框架中执行WAL滚动的时间（以毫秒为单位）（默认值：30000）。

## 86\. 最佳做法

### 86.1\. 制定恢复策略并对其进行测试

在依赖生产环境的备份和还原策略之前，必须演练如何执行备份，更重要的是，必须演练如何还原。测试该策略以确保其可行。至少，能把生产集群的数据存储备份到不同集群或服务器上的。要进一步保护数据，请使用位于不同物理位置的备份位置。

如果由于计算机系统问题导致主生产集群上的数据丢失不可恢复，则可以从同一站点的其他集群或服务器还原数据。然而，破坏整个站点的灾难使本地存储的备份变得毫无用处。考虑存储备份数据和必要资源（计算能力和操作员专业知识），以便在远离生产站点的站点恢复数据。如果在整个主要站点（火灾，地震等）发生灾难，远程备份站点可能非常有价值。


### 86.2\. 首先保护完整备份映像

作为基准，您必须至少完成一次HBase数据的完整备份，然后才能依赖增量备份。完整备份应存储在源集群之外。要确保完整的数据集恢复，必须使用还原基准完全备份选项运行还原实用程序。完整备份是数据集的基础。在还原操作期间，将在完全备份的基础上应用增量备份数据，以使您返回上次执行备份的时间点。


### 86.3\. 为作为整个数据集的逻辑子集的表组定义和使用备份集

您可以将表分组到称为备份集的对象中。当您有一组特定的表，您希望重复备份或还原时，备份集可以节省时间。

创建备份集时，键入要包括在组中的表名。备份集不仅包括相关表组，还包含HBase备份元数据。然后，您可以使用备份集名称以指示对哪些表执行命令，而不用输入所有表名。


### 86.4\. 记录备份和还原策略，理想情况下记录有关每个备份的信息

记录整个过程，以便知识库可以在员工离职后转移给新的管理员。作为额外的安全预防措施，还要记录日期，时间以及有关每个备份数据的其他相关详细信息。在源群集发生故障或主站点灾难的情况下，此元数据可能有助于查找特定数据集。给所有文档维护重复副本：生产集群站点的一个副本和备份位置的或管理员从生产集群远程访问的任何位置一个副本。


## 87\. 场景：在Amazon S3上保护应用程序数据集

此业务情景描述了假设的零售业务如何使用备份来保护应用程序数据，然后在故障后恢复数据集。

HBase管理团队使用备份集来存储来自一组表的数据，这些表具有名为green的应用程序的相关信息。在此示例中，一个表包含事务记录，另一个表包含客户详细信息。需要备份这两个表并将其作为一个组进行恢复。

管理团队还希望确保自动进行每日备份。

![backup app components](img/e59d0f7f1e375b613c7d5565d10d5d8d.jpg)图 7\. 备份集中的表

以下是用于备份 _green_ 应用程序的数据并稍后恢复数据的命令步骤和示例的大纲。所有命令需要以HBase超级用户身份运行。

*   创建名为 _green_set_ 的备份集作为事务表和客户表的别名。备份集可用于所有操作，以避免键入每个表名。备份集名称区分大小写，应仅使用可打印字符且不带空格。

    ```
    $ hbase backup set add green_set transactions
    $ hbase backup set add green_set customer
    ```

*   green_set数据的第一个备份必须是完整备份。以下命令示例显示如何将凭据传递到Amazon S3并指定文件系统使用s3a:前缀。

    ```
    $ ACCESS_KEY=ABCDEFGHIJKLMNOPQRST
    $ SECRET_KEY=123456789abcdefghijklmnopqrstuvwxyzABCD
    $ sudo -u hbase hbase backup create full\
      s3a://$ACCESS_KEY:SECRET_KEY@prodhbasebackups/backups -s green_set
    ```

*   应根据计划运行增量备份，以确保在发生灾难时进行必要的数据恢复。在这家零售公司，HBase管理团队决定自动每日备份可以充分保护数据。团队决定通过修改`/etc/crontab`中定义的现有Cron作业来实现此目的。因此，IT通过添加以下行来修改Cron作业：

    ```
    @daily hbase hbase backup create incremental s3a://$ACCESS_KEY:$SECRET_KEY@prodhbasebackups/backups -s green_set
    ```

*   灾难性IT事件导致green应用程序的生产集群不可用。备份群集的HBase系统管理员必须将 _green _set_数据集还原到最接近恢复目标的时间点。

    > 如果备份HBase群集的管理员具有可访问记录中具有相关详细信息的备份ID，则可以绕过以下使用`hdfs dfs -ls`命令进行的搜索并手动扫描备份ID列表。请考虑在环境中的生产集群外部持续维护和保护备份ID的详细日志。

    HBase管理员在存储备份的目录上运行以下命令，以在控制台上打印成功备份ID的列表：

    ```
    `hdfs dfs -ls -t /prodhbasebackups/backups`
    ```

*   管理员扫描列表以查看在最接近恢复目标的日期和时间创建了哪个备份。为此，管理员将恢复时间点的日历时间戳转换为Unix时间，因为备份ID是用Unix时间唯一标识的。备份ID按反向时间顺序列出，这意味着最先出现的最新成功备份。

    管理员注意到命令输出中的以下行与需要恢复的 _green_set_ 备份相对应：

    ```
    /prodhbasebackups/backups/backup_1467823988425`
    ```

*   管理员恢复green_set调用备份ID和-overwrite选项。 -overwrite选项会删除目标集群中的所有现有数据，并使用备份数据集中的数据填充表。如果没有此标志，备份数据将附加到目标中的现有数据。在当前情况下，管理员决定覆盖数据，因为它已损坏。

    ```
    $ sudo -u hbase hbase restore -s green_set \
      s3a://$ACCESS_KEY:$SECRET_KEY@prodhbasebackups/backups backup_1467823988425 \ -overwrite
    ```

## 88\. 备份数据的安全性

利用此功能可以将数据复制到远程位置，需要花些时间思考数据安全性问题。与HBase复制功能一样，备份和还原提供了将数据从公司内自动复制到公司外的某个系统的能力。在做敏感数据备份和恢复功能时，除了从HBase中提取数据，还有发送数据的位置都经过安全审核以确保只允许经过身份验证的用户访问该数据时，这一点非常重要。

例如，上述示例将数据备份到S3，最重要的是将适当的权限分配给S3存储桶以确保仅允许最小的一组授权用户访问该数据。由于不再通过HBase访问数据及其身份验证和授权控制，因此我们必须确保存储该数据的文件系统提供相当级别的安全性。这是用户 **必须** 自行实施的手动步骤。

## 89\. 增量备份和还原的技术细节

与之前尝试使用串行备份和还原解决方案（例如仅使用HBase导出和导入API的方法）相比，HBase增量备份可以更有效地捕获HBase表映像。增量备份使用“预写日志”（WAL）来捕获自上次备份创建以来的数据更改。在所有RegionServers上执行WAL roll（创建新的WAL）以跟踪需要在备份中的WAL。

创建增量备份映像后，源备份文件通常与数据源位于同一节点上。类似于DistCp（分布式拷贝）工具的进程会将源备份文件移动到目标文件系统。当表恢复操作开始时，会执行一个两步过程。首先，从完整备份映像恢复完整备份。其次，来自上次完全备份和正在恢复的增量备份之间的增量备份的所有WAL文件都将转换为HFiles，HBase批量装载程序会自动将其导入为表中的已还原数据。

您只能在活动的HBase集群上进行还原，因为必须重新分发数据才能成功完成还原操作。

## 90\. 关于文件系统容量增长的警告

提醒一下，通过保留HBase主要用于数据持久性的预写日志来实现增量备份。因此，为确保在系统中仍然可用的所有数据包含在备份中，HBase备份和还原功能将保留自上次备份以来直到执行下一个增量备份的所有预写日志。

与HBase快照一样，对于数据量大的表，这可能对HBase依赖的HDFS使用产生巨大影响。注意启用和使用备份和还原功能，尤其要注意在未主动使用备份会话时记得删除备份会话。

目前，用于设定备份和还原的保留预写日志大小上限是基于`hbase:backup`系统表的TTL，截至本文档编写时，该TTL是无限的（备份表条目永远不会自动删除）。这要求管理员按照周期性执行备份，该计划的频率需要与HDFS上的可用空间量相匹配（例如，较少的可用HDFS空间需要更积极的备份合并和删除）。提醒一下，可以使用HBase shell中的`alter`命令在`hbase:backup`表上更改TTL。在系统表存在后修改hbase-site.xml中的配置属性`hbase.backup.system.ttl`无效。

## 91\. 容量规划

在规划分布式系统部署时，必须执行一些基本的数学估算，以确保在给定系统的数据和软件要求的情况下有足够的计算能力。而对于备份和还原功能，在估算备份和还原策略的性能时，网络容量是最大的瓶颈。第二个瓶颈是可以读/写数据的速度。

### 91.1\. 完整备份

要估计完整备份的持久化时间，我们必须了解调用的一般操作：

*   每个RegionServer上的预写日志滚动：根据每个RegionServer的不同负载，每个RegionServer一到数十秒。

*   获取表格的HBase快照：通常几十秒。根据构成表的region和文件的数量不同有所变化。

*   将快照导出到目的地：请参阅下文。与数据的大小和到目的地的网络带宽有关。

为了估计最后一步将花费多长时间，我们必须对硬件做出一些假设。请注意，这些对您的系统来说是 **并非**准确的 - 这些是您或您的管理员对您的系统所熟知的数字。假设在单个节点上从HDFS读取数据的速度上限为80MB / s（在该主机上运行的所有Mapper上），现代网络接口控制器（NIC）支持10Gb / s，架顶式交换机可以处理40Gb / s，集群之间的WAN为10Gb / s。这意味着您只能以1.25GB / s的速度向远程数据库发送数据 - 这意味着参与ExportSnapshot的16个节点（`1.25 * 1024 / 80 = 16`）应该能够完全打满集群之间的链接。由于群集中有很多节点，我们可以让每个节点export一部分，仍然可以打满网络。这样对任何一个节点的影响较小，有助于确保本地SLA。如果快照的大小是10TB，这将完全备份将占用2.5小时的网络带宽（`10 * 1024 / 1.25 / (60 * 60) = 2.23hrs`）

通常，本地集群与远程存储之间的WAN带宽很可能是完整备份速度的最大瓶颈。

当关注限制备份对“生产系统”的计算性能影响时，上述公式可以与`hbase backup create`：`-b`，`-w`，`-q`的可选命令行参数一起使用。 `-b`选项限制每个工作程序（Mapper）写入数据的带宽。 `-w`参数限制将在DistCp作业中生成的工作程序数量。 `-q`允许用户指定YARN队列，该队列可以限制执行复制备份工作到特定节点 - 这可以将执行复制的备份工作任务隔离到一组非关键节点。将`-b`和`-w`选项与我们之前的公式相关联：`-b`将用于限制每个节点以完全80MB/s的速度读取数据，`-w`用于限制该任务只产生16个工作程序。

### 91.2\. 增量备份

就像我们为完整备份所做的那样，我们也必须了解增量备份过程的运行时和成本。

*   识别自上次完全备份或增量备份以来的新预写日志：可忽略不计，根据来自备份系统表的先验知识就能获取。

*   读取，过滤和写入等同于WALls的“最小化”文件：以写入数据的速度为主，这个取决于HDFS的写入速度。

*   将HFiles拷贝到目的地：[见上文](#br.export.snapshot.cost)。

对于第二步，此操作的主要成本是重写数据（假设WAL中的大多数数据被保留）。在这种情况下，我们可以假设每个节点的聚合写入速度为30MB / s。继续我们的16节点集群示例，这需要大约15分钟来执行50GB数据（50 * 1024/60/60 = 14.2）写入。启动DistCp MapReduce作业的时间可能会主导复制数据所需的实际时间，网络传输时间（50 / 1.25 = 40秒）可以忽略。

## 92\. 备份和还原机制的限制

**串行备份操作**

备份操作不能同时运行。操作包括创建，删除，还原和合并等操作。仅支持一个活动备份会话。 [HBASE-16391](https://issues.apache.org/jira/browse/HBASE-16391) 将引入多备份会话支持。

**无法取消备份操作**

备份和还原操作都无法取消。 （ [HBASE-15997](https://issues.apache.org/jira/browse/HBASE-15997) ， [HBASE-15998](https://issues.apache.org/jira/browse/HBASE-15998) ）。取消备份的解决方法是终止客户端备份命令（`control-C`），确保已退出所有相关的MapReduce作业，然后运行`hbase backup repair`命令以确保系统备份元数据一致。

**备份只能保存到一个位置**

将备份信息复制到多个位置需要用户自己实现。 [HBASE-15476](https://issues.apache.org/jira/browse/HBASE-15476) 将引入本质上指定多备份目的地的能力。

**需要HBase超级用户访问**

只允许HBase超级用户（例如hbase）执行备份/恢复，这可能会对共享HBase用户造成问题。当前的缓解措施需要与系统管理员协调，以构建和部署备份和恢复策略（ [HBASE-14138](https://issues.apache.org/jira/browse/HBASE-14138) ）。

**备份恢复是在线操作**

要从备份数据执行还原操作，当前实现需要HBase集群在线（ [HBASE-16573](https://issues.apache.org/jira/browse/HBASE-16573) ）。

**某些操作可能会失败并需要重新运行**

HBase备份功能主要由客户端驱动。虽然HBase连接中内置了标准的HBase重试逻辑，但执行操作中的持久性错误可能会传播回客户端（例如，由于区域分裂导致的快照失败）。应将备份实现从客户端移动到将来的ProcedureV2框架中，这将为瞬态/可重试故障提供额外的稳健性。 `hbase backup repair`命令用于纠正系统无法自动检测和恢复的状态。

**避免声明公开API**

虽然存在与此功能交互的Java API并且其实现与接口分离，但是仍然不足以说明它是否是我们打算给普通用户使用的。因此，它被标记为`Private`受众，一旦用户开始尝试该功能，这将会破坏兼容性（ [HBASE-17517](https://issues.apache.org/jira/browse/HBASE-17517) ）。

**缺乏备份和恢复的全局指标**

单独的备份和恢复操作包含有关操作所包含的工作量的指标，但没有集中位置（例如Master UI）提供执行相关信息（ [HBASE-16565](https://issues.apache.org/jira/browse/HBASE-16565) ）。