

# 通过 CloudFront 源失效转移来优化高可用性
<a name="high_availability_origin_failover"></a>

对于需要高可用性的场景，您可以使用源故障转移功能设置 CloudFront。要开始使用，您需要创建一个具有两个源的*源组*：一个主源和一个辅助源。如果主源不可用，或返回指示故障的特定 HTTP 响应状态代码，则 CloudFront 自动切换到辅助源。

要设置源故障转移，您必须具有一个至少包含两个源的分配。接下来，为包含两个源（将其中一个设置为主源）的分配创建一个源组。最后，创建或更新缓存行为以使用源组。

要查看用于设置源组和配置特定源故障转移选项的步骤，请参阅[创建源组](#concept_origin_groups.creating)。

在为缓存行为配置源故障转移后，CloudFront 将针对查看器请求执行以下操作：
+ 当出现缓存命中结果时，CloudFront 将返回请求的对象。
+ 当出现缓存未命中时，CloudFront 将请求路由至源组中的主源。
+ 当主源返回不是为故障转移配置的状态代码（如 HTTP 2xx 或 3xx 状态代码）时，CloudFront 将向查看器提供请求的对象。
+ 发生以下任何情况时：
  + 主源返回您为故障转移配置的 HTTP 状态代码
  + CloudFront 无法连接到主源（当 503 设置为失效转移代码时）
  + 来自主源的响应耗时过长（超时）（当 504 设置为失效转移代码时）

  然后，CloudFront 将请求路由到源组中的辅助源。
**注意**  
对于某些使用案例（如流视频内容），您可能希望 CloudFront 快速故障转移到辅助源。要调整 CloudFront 故障转移到辅助源的速度，请参阅[控制源超时和尝试次数](#controlling-attempts-and-timeouts)。

CloudFront 将所有传入的请求路由到主源，即使先前的请求故障转移到辅助源时也是如此。CloudFront 仅在向主源发送请求失败后才向辅助源发送请求。

只有当查看器请求的 HTTP 方法是 `GET`、`HEAD` 或 `OPTIONS` 时，CloudFront 才会故障转移到辅助源。当查看器发送不同的 HTTP 方法（例如 `POST`、`PUT` 等）时，CloudFront 不会进行故障转移。

**注意**  
如果 `OPTIONS` 在缓存行为中未设置为 [缓存的 HTTP 方法](DownloadDistValuesCacheBehavior.md#DownloadDistValuesCachedHTTPMethods)，CloudFront 将无法进行失效转移。

下图阐述了源故障转移的工作原理。

![\[源故障转移的工作原理\]](http://docs.aws.amazon.com/zh_cn/AmazonCloudFront/latest/DeveloperGuide/images/origingroups-overview.png)


**Topics**
+ [

## 创建源组
](#concept_origin_groups.creating)
+ [

## 控制源超时和尝试次数
](#controlling-attempts-and-timeouts)
+ [

## 将源故障转移与 Lambda@Edge 函数结合使用
](#concept_origin_groups.lambda)
+ [

## 将自定义错误页与源故障转移结合使用
](#concept_origin_groups.custom-error)

## 创建源组
<a name="concept_origin_groups.creating"></a><a name="create-origin-groups-procedure"></a>

**创建源组**

1. 登录 AWS 管理控制台，并通过以下网址打开 CloudFront 控制台：[https://console.aws.amazon.com/cloudfront/v4/home](https://console.aws.amazon.com/cloudfront/v4/home)。

1. 选择要为其创建源组的分配。

1. 选择**源**选项卡。

1. 确保此分配有多个源。否则请添加第二个源。

1. 在**源**选项卡的**（源组**窗格中，选择**创建源组**。

1. 选择源组的源。添加源后，使用箭头设置优先级，即哪个源是主源组，哪个源是辅助源。

1. 为此源组输入一个名称。

1. 选择要用作故障转移条件的 HTTP 状态代码。您可以选择以下状态代码的任意组合：400、403、404、416、500、502、503 或 504。当 CloudFront 收到具有您指定的状态代码之一的响应时，它会故障转移到辅助源。
**注意**  
只有当查看器请求的 HTTP 方法是 `GET`、`HEAD` 或 `OPTIONS` 时，CloudFront 才会故障转移到辅助源。当查看器发送不同的 HTTP 方法（例如 `POST`、`PUT` 等）时，CloudFront 不会进行故障转移。

1. 在**源选择标准**下，指定您的分配在路由查看器请求时，如何选择您的源。您可以选择以下选项。  
**默认值**  
CloudFront 将使用您在**设置**页面上指定的默认源优先级。  
**媒体质量得分**  
CloudFront 跟踪此分数，并使用此分数来确定将请求转发到的第一个源。这也授权 CloudFront 向源组中的备用来源发出异步 `HEAD` 请求，以确定其媒体质量得分。您只能为 AWS Elemental MediaPackage v2 源选择此选项。有关更多信息，请参阅 [媒体质量感知弹性](media-quality-score.md)。

1. 选择**创建源组**。

请务必将您的源组指定为分配缓存行为的源。有关更多信息，请参阅 [名称](DownloadDistValuesOrigin.md#DownloadDistValuesId)。

## 控制源超时和尝试次数
<a name="controlling-attempts-and-timeouts"></a>

默认情况下，CloudFront 长达 30 秒（尝试 3 次连接，每次 10 秒）尝试连接到源组中的主源，之后故障转移到辅助源。对于某些使用案例（如流视频内容），您可能希望 CloudFront 更快地故障转移到辅助源。您可以调整以下设置，以影响 CloudFront 故障转移到辅助源的速度。如果源是辅助源或不属于源组的源，则这些设置会影响 CloudFront 向查看器返回 HTTP 504 响应的速度。

要更快地进行故障转移，请指定更短的连接超时、更少的连接尝试次数，或者同时指定两者。对于自定义源（包括配置*为* 静态网站托管的 Amazon S3 存储桶源），您还可以调整源响应超时。

**源连接超时**  
源连接超时设置影响 CloudFront 尝试建立到源的连接时等待的时间。默认情况下，CloudFront 等待 10 秒以建立连接，但您可以指定 1-10 秒（含）。有关更多信息，请参阅 [连接超时](DownloadDistValuesOrigin.md#origin-connection-timeout)。

**源连接尝试次数**  
源连接尝试设置会影响 CloudFront 尝试连接到源的次数。默认情况下，CloudFront 尝试 3 次进行连接，但您可以指定 1-3（含）。有关更多信息，请参阅 [连接尝试次数](DownloadDistValuesOrigin.md#origin-connection-attempts)。  
对于自定义源（包括配置为静态网站托管的 Amazon S3 存储桶），此设置还影响在源响应超时的情况下 CloudFront 尝试从源获取响应的次数。

**源响应超时**  
源响应超时（也称为源读取超时）影响 CloudFront 从源接收响应（或接收完整响应）的等待时间。默认情况下，CloudFront 等待 30 秒，但您可以指定 1–120 秒（含）。有关更多信息，请参阅 [响应超时](DownloadDistValuesOrigin.md#DownloadDistValuesOriginResponseTimeout)。

### 如何更改这些设置
<a name="controlling-attempts-and-timeouts-how-to"></a>

**在 [CloudFront 控制台](https://console.aws.amazon.com/cloudfront/v4/home)中更改这些设置**
+ 对于新源或新分配，您可以在创建资源时指定这些值。
+ 对于现有分配中的现有源，可在编辑源时指定这些值。

有关更多信息，请参阅 [所有分配设置参考](distribution-web-values-specify.md)。

## 将源故障转移与 Lambda@Edge 函数结合使用
<a name="concept_origin_groups.lambda"></a>

可以将 Lambda@Edge 函数与已使用源组设置的 CloudFront 分配结合使用。要使用 Lambda 函数，请在创建缓存行为时在源组的[源请求或源响应触发器](lambda-cloudfront-trigger-events.md)中指定它。当您将 Lambda@Edge 函数与源组一起使用时，对于单个查看器请求可以触发两次此函数。例如，考虑以下情景：

1. 使用源请求触发器创建 Lambda@Edge 函数。

1. 当 CloudFront（对于缓存未命中）向主源发送请求时会触发一次 Lambda 函数。

1. 主源使用为故障转移配置的 HTTP 状态代码进行响应。

1. 当 CloudFront 向辅助源发送相同的请求时，将再次触发 Lambda 函数。

下图阐述了源故障转移在源请求或响应触发器中包含 Lambda@Edge 函数时的工作方式。

![\[源故障转移如何与 Lambda@Edge 函数结合使用\]](http://docs.aws.amazon.com/zh_cn/AmazonCloudFront/latest/DeveloperGuide/images/origingroups-with-lambda-edge.png)


有关如何使用 Lambda@Edge 触发器的更多信息，请参阅[为 Lambda@Edge 函数添加触发器](lambda-edge-add-triggers.md)。

有关管理 DNS 故障转移的更多信息，请参阅《Amazon Route 53 开发人员指南》**中的[配置 DNS 故障转移](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/dns-failover-configuring.html)。

## 将自定义错误页与源故障转移结合使用
<a name="concept_origin_groups.custom-error"></a>

可以将自定义错误页面与源组结合使用，方式与将其与未为源故障转移设置的源结合使用的方式类似。

当使用源故障转移时，可将 CloudFront 配置为返回主源和/或辅助源的自定义错误页面：
+ **返回主源的自定义错误页** – 如果主源返回未为故障转移配置的 HTTP 状态代码，则 CloudFront 将向查看器返回自定义错误页面。
+ **返回辅助源的自定义错误页** – 如果 CloudFront 从辅助源收到故障状态代码，则 CloudFront 返回自定义错误页。

有关将自定义错误页面与 CloudFront 结合使用的更多信息，请参阅[生成自定义错误响应](GeneratingCustomErrorResponses.md)。