

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 使用快照管理应用程序备份
<a name="how-snapshots"></a>

*快照*是 Apache Flink *保存点*的 Managed Service for Apache Flink 实现。快照是用户或服务触发、创建和管理的应用程序状态备份。有关 Apache Flink 指标的更多信息，请参阅 Apache Flink 文档中的[保存点](https://nightlies.apache.org/flink/flink-docs-release-1.19/docs/ops/state/savepoints/)。通过使用快照，您可以从特定的应用程序状态快照中重新启动应用程序。

**注意**  
我们建议您的应用程序每天创建几次快照，以便使用正确的状态数据正确重启。正确的快照频率取决于应用程序的业务逻辑。频繁创建快照可让您恢复更新的数据，但会增加成本并需要更多的系统资源。

在 Managed Service for Apache Flink 中，您可以使用以下 API 操作管理快照：
+ [https://docs.aws.amazon.com/managed-flink/latest/apiv2/API_CreateApplicationSnapshot.html](https://docs.aws.amazon.com/managed-flink/latest/apiv2/API_CreateApplicationSnapshot.html)
+ [https://docs.aws.amazon.com/managed-flink/latest/apiv2/API_DeleteApplicationSnapshot.html](https://docs.aws.amazon.com/managed-flink/latest/apiv2/API_DeleteApplicationSnapshot.html)
+ [https://docs.aws.amazon.com/managed-flink/latest/apiv2/API_DescribeApplicationSnapshot.html](https://docs.aws.amazon.com/managed-flink/latest/apiv2/API_DescribeApplicationSnapshot.html)
+ [https://docs.aws.amazon.com/managed-flink/latest/apiv2/API_ListApplicationSnapshots.html](https://docs.aws.amazon.com/managed-flink/latest/apiv2/API_ListApplicationSnapshots.html)

有关每个应用程序的快照数限制，请参阅[Managed Service for Apache Flink 与 Studio 笔记本配额](limits.md)。如果应用程序达到快照限制，则手动创建快照将失败并出现 `LimitExceededException`。

Managed Service for Apache Flink永远不会删除快照。您必须使用 [https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_DeleteApplicationSnapshot.html](https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_DeleteApplicationSnapshot.html) 操作手动删除快照。

要在启动应用程序时加载已保存的应用程序状态快照，请使用 [https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_StartApplication.html](https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_StartApplication.html) 或 [https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_UpdateApplication.html](https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_UpdateApplication.html) 操作的 [https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_ApplicationRestoreConfiguration.html](https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_ApplicationRestoreConfiguration.html) 参数。

**Topics**
+ [管理自动快照创建](#how-fault-snapshot-update)
+ [从包含不兼容状态数据的快照中还原](#how-fault-snapshot-restore)
+ [查看快照 API 示例](#how-fault-snapshot-examples)

## 管理自动快照创建
<a name="how-fault-snapshot-update"></a>

如果在应用程序`true`中设置`SnapshotsEnabled`为，则 Apache Flink 托管服务将在应用程序更新、缩放或停止时自动创建和使用快照，以提供精确一次的处理语义。[ ApplicationSnapshotConfiguration](https://docs.aws.amazon.com/managed-flink/latest/apiv2/API_ApplicationSnapshotConfiguration.html)

**注意**  
如果将 `ApplicationSnapshotConfiguration::SnapshotsEnabled` 设置为 `false`，将导致在应用程序更新期间丢失数据。

**注意**  
Managed Service for Apache Flink在创建快照期间触发中间保存点。对于 Flink 1.15 或更高版本，中间保存点不再产生任何不良影响。参见[触发保存点](https://nightlies.apache.org/flink/flink-docs-master/docs/ops/state/savepoints/#triggering-savepoints)。

自动创建的快照具有以下特性：
+ 快照由服务管理，但您可以使用[ ListApplicationSnapshots](https://docs.aws.amazon.com/managed-flink/latest/apiv2/API_ListApplicationSnapshots.html)操作查看快照。自动创建的快照计入您的快照限制。
+ 如果您的应用程序超过快照限制，手动创建的快照将失败，但是当应用程序更新、扩展或停止时，Managed Service for Apache Flink仍会成功创建快照。在手动创建更多快照之前，必须使用[ DeleteApplicationSnapshot](https://docs.aws.amazon.com/managed-flink/latest/apiv2/API_DeleteApplicationSnapshot.html)操作手动删除快照。

## 从包含不兼容状态数据的快照中还原
<a name="how-fault-snapshot-restore"></a>

由于快照包含有关操作符的信息，因此，如果从自上一应用程序版本以来发生变化的操作符的快照中还原状态数据，则可能会出现意外的结果。如果尝试从与当前操作符不对应的快照中还原状态数据，应用程序将会发生故障。发生故障的应用程序将停滞在 `STOPPING` 或 `UPDATING` 状态。

要允许应用程序从包含不兼容状态数据的快照中恢复，[FlinkRunConfiguration](https://docs.aws.amazon.com/managed-flink/latest/apiv2/API_FlinkRunConfiguration.html)请`true`使用[UpdateApplication](https://docs.aws.amazon.com/managed-flink/latest/apiv2/API_UpdateApplication.html)操作将的`AllowNonRestoredState`参数设置为。

从过时的快照中还原应用程序时，您将会看到以下行为：
+ **添加了操作符：**如果添加了新操作符，则保存点没有新操作符的状态数据。不会发生故障，也不需要设置 `AllowNonRestoredState`。
+ **删除了操作符：**如果删除了现有操作符，则保存点具有丢失的操作符的状态数据。除非 `AllowNonRestoredState` 设置为 `true`，否则，将会发生故障。
+ **修改了操作符：**如果进行了兼容的更改，例如将参数的类型更改为兼容的类型，则应用程序可以从过时的快照中还原。有关从快照恢复的更多信息，请参阅 Apache Flink 文档中的[保存点](https://nightlies.apache.org/flink/flink-docs-release-1.19/docs/ops/state/savepoints/)。可以从具有不同架构的快照中还原使用 Apache Flink 版本 1.8 或更高版本的应用程序。无法还原使用 Apache Flink 版本 1.6 的应用程序。对于 two-phase-commit接收器，我们建议使用系统快照 (SW) 而不是用户创建的快照 (CreateApplicationSnapshot)。

  Managed Service for Apache Flink在创建快照期间触发中间保存点。对于 Flink 1.15 或更高版本，中间保存点不再产生任何不良影响。参见[触发保存点](https://nightlies.apache.org/flink/flink-docs-master/docs/ops/state/savepoints/#triggering-savepoints)

如果您需要恢复与现有 savepoint 数据不兼容的应用程序，我们建议您将操作的`ApplicationRestoreType`参数设置为，从而跳过从快照还原的[StartApplication](https://docs.aws.amazon.com/managed-flink/latest/apiv2/API_StartApplication.html)操作。`SKIP_RESTORE_FROM_SNAPSHOT`

有关 Apache Flink 如何处理不兼容状态数据的更多信息，请参阅 *Apache Flink 文档*中的[状态架构演变](https://nightlies.apache.org/flink/flink-docs-release-1.19/docs/dev/datastream/fault-tolerance/serialization/schema_evolution/)。

## 查看快照 API 示例
<a name="how-fault-snapshot-examples"></a>

本节包含将快照与应用程序一起使用的 API 操作的示例请求。有关如何将 JSON 文件用于 API 操作输入的信息，请参阅 [Managed Service for Apache Flink API 示例代码](api-examples.md)。

### 为应用程序启用快照
<a name="how-fault-savepoint-examples-enable"></a>

[https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_UpdateApplication.html](https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_UpdateApplication.html) 操作的以下示例请求为应用程序启用快照：

```
{
   "ApplicationName": "MyApplication",
   "CurrentApplicationVersionId": 1,
   "ApplicationConfigurationUpdate": { 
      "ApplicationSnapshotConfigurationUpdate": { 
         "SnapshotsEnabledUpdate": "true"
       }
    }
}
```

### 创建快照
<a name="how-fault-savepoint-examples-create"></a>

[https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_CreateApplicationSnapshot.html](https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_CreateApplicationSnapshot.html) 操作的以下示例请求创建当前应用程序状态的快照：

```
{
   "ApplicationName": "MyApplication",
   "SnapshotName": "MyCustomSnapshot"
}
```

### 列出应用程序的快照
<a name="how-fault-snapshot-examples-list"></a>

[https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_ListApplicationSnapshots.html](https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_ListApplicationSnapshots.html) 操作的以下示例请求列出当前应用程序状态的前 50 个快照：

```
{
   "ApplicationName": "MyApplication",
   "Limit": 50
}
```

### 列出应用程序快照的详细信息
<a name="how-fault-snapshot-examples-describe"></a>

[https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_DescribeApplicationSnapshot.html](https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_DescribeApplicationSnapshot.html) 操作的以下示例请求列出特定应用程序快照的详细信息：

```
{
   "ApplicationName": "MyApplication",
   "SnapshotName": "MyCustomSnapshot"
}
```

### 删除快照
<a name="how-fault-snapshot-examples-delete"></a>

[https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_DeleteApplicationSnapshot.html](https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_DeleteApplicationSnapshot.html) 操作的以下示例请求删除以前保存的快照。您可以使用以下任一方法来获取 [https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_ListApplicationSnapshots.html](https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_ListApplicationSnapshots.html) 或 [https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_DeleteApplicationSnapshot.html](https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_DeleteApplicationSnapshot.html) 的 `SnapshotCreationTimestamp` 值：

```
{
   "ApplicationName": "MyApplication",
   "SnapshotName": "MyCustomSnapshot",
   "SnapshotCreationTimestamp": 12345678901.0,
}
```

### 使用命名的快照重新启动应用程序
<a name="how-fault-snapshot-examples-load-custom"></a>

[https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_StartApplication.html](https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_StartApplication.html) 操作的以下示例请求使用特定快照中保存的状态启动应用程序：

```
{
   "ApplicationName": "MyApplication",
   "RunConfiguration": { 
      "ApplicationRestoreConfiguration": { 
         "ApplicationRestoreType": "RESTORE_FROM_CUSTOM_SNAPSHOT",
         "SnapshotName": "MyCustomSnapshot"
      }
   }
}
```

### 使用最近的快照重新启动应用程序
<a name="how-fault-snapshot-examples-load-recent"></a>

[https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_StartApplication.html](https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_StartApplication.html) 操作的以下示例请求使用最近的快照启动应用程序：

```
{
   "ApplicationName": "MyApplication",
   "RunConfiguration": { 
      "ApplicationRestoreConfiguration": { 
         "ApplicationRestoreType": "RESTORE_FROM_LATEST_SNAPSHOT"
      }
   }
}
```

### 不使用快照重新启动应用程序
<a name="how-fault-snapshot-examples-load-none"></a>

[https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_StartApplication.html](https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_StartApplication.html) 操作的以下示例请求启动应用程序而不加载应用程序状态，即使具有快照也是如此：

```
{
   "ApplicationName": "MyApplication",
   "RunConfiguration": { 
      "ApplicationRestoreConfiguration": { 
         "ApplicationRestoreType": "SKIP_RESTORE_FROM_SNAPSHOT"
      }
   }
}
```