

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

# 使用 IaC 原则自动 blue/green 部署 Amazon Aurora 全球数据库
<a name="p-automate-blue-green-deployments-aurora-global-databases-iac"></a>

*Ishwar Chauthaiwale、ANKIT JAIN 和 Ramu Jagini，Amazon Web Services*

## Summary
<a name="p-automate-blue-green-deployments-aurora-global-databases-iac-summary"></a>

对于在 [Amazon Aurora 全球数据库](https://aws.amazon.com/rds/aurora/global-database/)上运行关键工作负载的组织来说，管理数据库更新、迁移或扩展的工作可能极具挑战性。确保在零停机的状况下无缝执行这些操作，对于维持服务可用性并避免用户遭遇中断至关重要。

 blue/green 部署策略允许您同时运行两个相同的环境：蓝色（当前环境）和绿色（新环境），从而为这一挑战提供了解决方案。 blue/green 策略使您能够以最小的风险和停机时间实施更改、执行测试和在环境之间切换流量。

此模式可帮助您使用基础设施即代码 (IaC) 原则自动执行 Aurora 全球数据库的 blue/green 部署过程。它使用[AWS CloudFormation[AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html)](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html)、和 [Amazon Route 53](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/Welcome.html) 来简化 blue/green 部署。为了提高可靠性，它使用全局事务标识符 (GTIDs) 进行复制。与二进制日志（binlog）复制相比，基于 GTID 的复制能在环境间提供更优的数据一致性和失效转移能力。

**注意**  
此模式假设您使用的是 Aurora MySQL 兼容版全局数据库集群。如果您改用 Aurora PostgreSQL-Compatible，请使用与 MySQL 命令对应的 PostgreSQL 命令。

通过遵循此模式中的步骤，您可以：
+ 配置绿色 Aurora 全球数据库：使用 CloudFormation 模板可以创建反映现有蓝色环境的绿色环境。
+ 设置基于 GTID 的复制：您可以配置 GTID 复制以保持蓝色环境和绿色环境同步。
+ 无缝切换流量：完全同步后，可以使用 Route 53 和 Lambda 自动将流量从蓝色环境切换到绿色环境。
+ 完成部署：确认绿色环境已完全作为主数据库运行，然后停止复制并清理所有临时资源。

此模式中的方法具有以下优势：
+ 减少关键数据库更新或迁移期间的停机时间：自动化可确保环境之间的顺畅过渡，最大限度地减少服务中断。
+ 支持快速回滚：如果流量切换到绿色环境后出现问题，可以快速恢复到蓝色环境并保持服务连续性。
+ 增强测试与验证：可以在不影响实时蓝色环境的情况下对绿色环境进行全面测试，从而降低生产环境中出现错误的可能性。
+ 确保数据一致性：基于 GTID 的复制技术可使蓝绿环境保持同步，从而防止迁移期间出现数据丢失或不一致的情况。
+ 保持业务连续性：自动化 blue/green 部署有助于在更新或迁移期间保持服务可用性，从而避免长时间中断和经济损失。

## 先决条件和限制
<a name="p-automate-blue-green-deployments-aurora-global-databases-iac-prereqs"></a>

**先决条件**
+ 活跃 AWS 账户的.
+ 源 Aurora MySQL 兼容版全局数据库集群（蓝色环境）。全球数据库提供多区域配置，助力实现高可用性和灾难恢复。有关设置全球数据库集群的说明，请参阅 [Aurora 文档](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/aurora-global-database-getting-started.html)。
+ 在源集群上启用了 [基于 GTID 的复制](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/mysql-replication-gtid.html)。

**限制**
+ 有些 AWS 服务 并非全部可用 AWS 区域。有关区域可用性，请参阅[按区域划分的AWS 服务](https://aws.amazon.com/about-aws/global-infrastructure/regional-product-services/)。有关特定端点，请参阅[服务端点和配额](https://docs.aws.amazon.com/general/latest/gr/aws-service-information.html)页面，然后选择相应服务的链接。

**产品版本**
+ Aurora MySQL 兼容版 8.0 或更高版本

## 架构
<a name="p-automate-blue-green-deployments-aurora-global-databases-iac-architecture"></a>

![使用 GTID 复制技术同步不同区域中的蓝色和绿色环境。](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/19922266-c2e5-460b-9a0f-22e6d6736094/images/7a8c3095-7904-4080-906f-0c403c289a4f.png)


下图说明了以下内容：
+ 全局数据库设置：Aurora 全球数据库集群策略性地部署在两个集群上 AWS 区域。此配置支持地理分布和区域冗余，从而增强了灾难恢复能力。
+ 主区域到辅助区域复制：逻辑复制机制确保从主区域到辅助区域的无缝数据同步。这种复制可保持数据一致性，同时最大限度地减少跨地理距离的延迟。
+ 集群之间基于 GTID 的复制：基于 GTID 的复制技术可在蓝色主集群与绿色主集群之间维持事务一致性与有序数据流，确保数据同步的可靠性。
+ 蓝色主集群到辅助集群复制：逻辑复制可在蓝色主集群与其辅助集群之间建立强大的数据管道。这种复制可实现连续的数据同步与高可用性。
+ Route 53 DNS 配置：Route 53 托管区记录管理所有蓝绿集群数据库端点的 DNS 解析。此配置可提供无缝的端点映射，并在失效转移场景中实现高效的流量路由。

## 工具
<a name="p-automate-blue-green-deployments-aurora-global-databases-iac-tools"></a>

**Amazon Web Services**
+ [Amazon Aurora](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/CHAP_AuroraOverview.html) 是与 MySQL 和 PostgreSQL 兼容的完全托管式的云端关系数据库引擎。
+ [CloudFormation](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html)帮助您对 AWS 资源进行建模和设置，这样您就可以花更少的时间管理这些资源，而将更多的时间集中在运行的应用程序上 AWS。您可以创建一个描述所需所有 AWS 资源的模板，并 CloudFormation 负责为您配置和配置这些资源。
+  [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html) 是一项计算服务，无需预调配或管理服务器即可运行代码。Lambda 只在需要时运行您的代码，并自动进行扩展，从每天几个请求扩展到每秒数千个请求。 
+ [Amazon Route 53](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/Welcome.html) 是一种可用性高、可扩展性强的 DNS Web 服务。

## 最佳实践
<a name="p-automate-blue-green-deployments-aurora-global-databases-iac-best-practices"></a>

我们建议您仔细阅读 AWS 文档，以加深对 Route 53 中的[蓝/绿部署策略](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/blue-green-deployments-overview.html)、[基于 GTID 的复制](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/mysql-replication-gtid.html)和[加权路由策略](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/routing-policy-weighted.html)的理解。这些知识对于有效实施和管理数据库迁移、确保数据一致性、优化流量路由至关重要。通过全面了解这些 AWS 功能和最佳实践，您将能够更好地处理未来的更新，最大限度地减少停机时间并维护弹性和安全的数据库环境。

有关使用此模式 AWS 服务 的指南，请参阅以下 AWS 文档：
+ [亚马逊 Aurora MySQL 的最佳实践](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/AuroraMySQL.BestPractices.html)
+ [CloudFormation  ](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/best-practices.html) 最佳实践
+ [使用 AWS Lambda 函数的最佳实践](https://docs.aws.amazon.com/lambda/latest/dg/best-practices.html)
+ [亚马逊 Route 53 最佳实践](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/best-practices.html)

## 操作说明
<a name="p-automate-blue-green-deployments-aurora-global-databases-iac-epics"></a>

### 创造绿色环境
<a name="create-the-green-environment"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 从蓝色集群创建快照备份。 | 在 blue/green 部署中，绿色环境代表当前（蓝色）数据库环境的全新、相同版本。在切换生产流量之前，可以使用绿色环境来安全地测试更新、验证更改并确保稳定性。它充当实施数据库变更的临时平台，能最大限度地减少对实时环境的干扰。<br />要创建绿色环境，请先在 Aurora MySQL 兼容版全局数据库中创建主（蓝色）集群的快照。此快照为创建绿色环境奠定了基础。<br />要创建快照：[See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/p-automate-blue-green-deployments-aurora-global-databases-iac.html)<br />或者，您可以使用 AWS Command Line Interface (AWS CLI) 来创建快照：<pre>aws rds create-db-cluster-snapshot --db-cluster-snapshot-identifier blue-green-demo --db-cluster-identifier ex-global-cluster --region eu-west-1</pre><br />请确保快照成功完成，然后再进入下一步。 | 数据库管理员 | 
| 为您的全局数据库及其资源生成 CloudFormation 模板。 |  CloudFormation IaC 生成器可帮助您利用现有 AWS 资源生成 CloudFormation 模板。使用此功能为现有 Aurora MySQL 兼容的全局数据库及其相关资源创建 CloudFormation 模板。此模板配置子网组、安全组、参数组和其他设置。[See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/p-automate-blue-green-deployments-aurora-global-databases-iac.html) | 数据库管理员 | 
| 修改绿色环境的 CloudFormation 模板。 | 自定义 CloudFormation 模板以反映绿色环境的设置。这包括更新资源名称和标识符，确保绿色环境独立于蓝色集群运行。[See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/p-automate-blue-green-deployments-aurora-global-databases-iac.html)如果您使用 `SnapshotIdentifier` 属性恢复数据库集群，请避免指定诸如 `GlobalClusterIdentifier`、`MasterUsername` 或 `MasterUserPassword` 之类的属性。 | 数据库管理员 | 
| 部署 CloudFormation 堆栈为绿色环境创建资源。 | 在此步骤中，您将部署自定义 CloudFormation 模板来创建绿色环境的资源。<br />要部署 CloudFormation 堆栈，请执行以下操作：[See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/p-automate-blue-green-deployments-aurora-global-databases-iac.html)<br />CloudFormation 启动创建绿色环境资源的过程。此过程可能需要几分钟才能完成。 | 数据库管理员 | 
| 验证 CloudFormation 堆栈和资源。 |  CloudFormation 堆栈部署完成后，您需要验证绿色环境是否已成功创建：[See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/p-automate-blue-green-deployments-aurora-global-databases-iac.html)<br />验证完成后，您的绿色环境即已准备就绪，可进行后续配置，包括从蓝色环境复制数据。 | 数据库管理员 | 

### 配置基于 GTID 的复制
<a name="configure-gtid-based-replication"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 验证蓝色集群上的 GTID 设置。 | GTIDs 为在蓝色和绿色环境之间复制数据提供了一种高度可靠的方法。[基于 GTID 的复制](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/mysql-replication-gtid.html)通过为蓝色环境中的每件事务分配唯一标识符，带来一种弹性、简化的方法。与传统的二进制日志复制相比，此方法可确保环境间的数据同步无缝衔接、保持一致，且更易于管理。<br />在配置复制之前，您需要确保在蓝色集群上正确启用基于 GTID 的复制。此步骤确保在蓝色环境中的每件事务都能被唯一追踪，并可复制到绿色环境中。<br />要确认 GTID 是否启用：[See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/p-automate-blue-green-deployments-aurora-global-databases-iac.html)<br />这些设置将为蓝色环境中的所有未来事务启用 GTID 跟踪。确认这些设置之后，就可以开始设置复制。 | 数据库管理员 | 
| 创建复制用户。 | 要将数据从蓝色环境复制到绿色环境，需要在蓝色集群上创建专用的复制用户。该用户将负责管理复制流程。<br />要设置复制用户：[See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/p-automate-blue-green-deployments-aurora-global-databases-iac.html)<br />此用户现在即拥有在两个环境之间复制数据的必要权限。 | 数据库管理员 | 
| 在绿色集群上配置基于 GTID 的复制。 | 下一步是为基于 GTID 的复制配置绿色集群。此设置可确保绿色环境将持续同步蓝色环境中发生的全部事务。<br />要配置绿色集群：[See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/p-automate-blue-green-deployments-aurora-global-databases-iac.html) | 数据库管理员 | 
| 开始在绿色集群上复制。 | 您现在可以启动复制流程。在绿色集群上运行以下命令：<pre>START SLAVE;</pre><br />这使绿色环境能够开始同步数据，并从蓝色环境接收和应用事务。 | 数据库管理员 | 
| 验证复制过程。 | 要验证绿色环境是否准确地复制了蓝色集群中的数据：[See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/p-automate-blue-green-deployments-aurora-global-databases-iac.html)<br />如果所有指标都正确，说明基于 GTID 的复制运行平稳，绿色环境已与蓝色环境完全同步。 | 数据库管理员 | 

### 将流量从蓝色集群切换到绿色集群
<a name="switch-traffic-from-blue-to-green-cluster"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 配置 Route 53 加权路由策略。 | 验证完蓝色和绿色环境之间的数据一致性之后，可以将流量从蓝色集群切换至绿色集群。这种过渡应该平稳进行且最大限度地减少停机时间，并确保应用程序数据库的完整性。为满足这些要求，可以使用 Route 53 进行 DNS 路由，使用 Lambda 自动切换流量。此外，完善的回滚方案可确保在出现任何问题时，您能够恢复到蓝色集群。<br />第一步是在 Route 53 中配置加权路由。加权路由允许您控制蓝色和绿色集群之间的流量分布，并逐步将流量从一个环境转移到另一个环境。<br />要配置加权路由：[See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/p-automate-blue-green-deployments-aurora-global-databases-iac.html)<br />有关加权路由策略的更多信息，请参阅 [Route 53 文档](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/routing-policy-weighted.html)。 | AWS DevOps | 
| 部署 Lambda 函数来监控复制延迟。 | 为确保绿色环境与蓝色环境完全同步，部署一个 Lambda 函数来监控集群之间的复制延迟。此函数可检查复制状态，特别是 **Seconds\_Behind\_Master** 指标，以确定绿色集群是否已准备好处理所有流量。<br />以下是您可以使用的 Lambda 函数示例：<pre>import boto3<br /><br />def check_replication_lag(event, context):<br />    client = boto3.client('rds')<br />    response = client.describe_db_instances(DBInstanceIdentifier='green-cluster-instance')<br />    replication_status = response['DBInstances'][0]['ReadReplicaDBInstanceIdentifiers']<br />    if replication_status:<br />        lag = replication_status[0]['ReplicationLag']<br />        return lag<br />    return -1</pre><br />此函数检查复制延迟并返回值。如果延迟为零，说明绿色集群与蓝色集群完全同步。 | AWS DevOps | 
| 使用 Lambda 自动调整 DNS 权重。 | 当复制延迟达到零时，即可将所有流量切换到绿色集群。可以使用另一个 Lambda 函数来自动完成此过渡，该函数会调整 Route 53 中的 DNS 权重，将流量 100% 定向到绿色集群。<br />以下是自动切换流量的 Lambda 函数示例：<pre>import boto3<br /><br />def switch_traffic(event, context):<br />    route53 = boto3.client('route53')<br />    lag = check_replication_lag(event, context)<br />    if lag == 0:<br />        response = route53.change_resource_record_sets(<br />            HostedZoneId='YOUR_HOSTED_ZONE_ID',<br />            ChangeBatch={<br />                'Changes': [<br />                    {<br />                        'Action': 'UPSERT',<br />                        'ResourceRecordSet': {<br />                            'Name': 'db.example.com',<br />                            'Type': 'CNAME',<br />                            'SetIdentifier': 'GreenCluster',<br />                            'Weight': 100,<br />                            'TTL': 60,<br />                            'ResourceRecords': [{'Value': 'green-cluster-endpoint'}]<br />                        }<br />                    },<br />                    {<br />                        'Action': 'UPSERT',<br />                        'ResourceRecordSet': {<br />                            'Name': 'db.example.com',<br />                            'Type': 'CNAME',<br />                            'SetIdentifier': 'BlueCluster',<br />                            'Weight': 0,<br />                            'TTL': 60,<br />                            'ResourceRecords': [{'Value': 'blue-cluster-endpoint'}]<br />                        }<br />                    }<br />                ]<br />            }<br />        )<br />        return response</pre><br />此功能会检查复制延迟，并在延迟为零时更新 Route 53 DNS 权重，以将流量完全切换到绿色集群。****割接过程中，如果蓝色集群遇到大量写入流量，请考虑在割接期间暂停写入操作。这样可以确保复制及时完成，并防止蓝色集群与绿色集群之间出现数据不一致的情况。 | AWS DevOps | 
| 验证流量切换。 | Lambda 函数调整 DNS 权重后，您应验证所有流量是否都定向到绿色集群以及切换是否成功。<br />要验证：[See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/p-automate-blue-green-deployments-aurora-global-databases-iac.html)<br />如果一切运行正常，流量切换即告完成。 | AWS DevOps | 
| 如果遇到任何问题，请回滚更改。 | 制定回滚计划至关重要，可防止流量切换后出现任何问题。以下是必要时快速恢复至蓝色集群的方法：[See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/p-automate-blue-green-deployments-aurora-global-databases-iac.html)<br />实施此回滚计划可确保在出现任何意外问题时，将对用户的干扰降至最低。 | AWS DevOps | 

### 验证并停止基于 GTID 的复制
<a name="validate-and-stop-gtid-based-replication"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 在绿色集群上停止基于 GTID 的复制。 | 将流量从蓝色环境切换至绿色环境后，应验证过渡是否成功，并确保绿色集群按预期运行。此外，必须停止蓝色和绿色集群之间基于 GTID 的复制，因为绿色环境现在用作主数据库。完成这些任务可确保您的环境安全可靠、运行高效，并为持续运营提供最佳支持。<br />要停止复制：[See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/p-automate-blue-green-deployments-aurora-global-databases-iac.html)<br />停止复制后，绿色集群将完全独立，并作为工作负载的主数据库环境运行。 | 数据库管理员 | 
| 清理资源。 | 清理从蓝色集群迁移至绿色集群过程中创建的任何临时或未使用资源，可确保您的环境保持优化、安全且具有成本效益。清理工作包括调整安全设置、进行最终备份以及停用不必要的资源。<br />要清理资源：[See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/p-automate-blue-green-deployments-aurora-global-databases-iac.html)<br />清理资源有助于维护安全高效的环境，降低成本，并确保仅保留必要的基础设施。 | AWS DevOps | 

## 相关资源
<a name="p-automate-blue-green-deployments-aurora-global-databases-iac-resources"></a>

CloudFormation:
+ [CloudFormation 用户指南](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html)
+ [CloudFormation  ](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/best-practices.html) 最佳实践
+ [使用 IaC 生成器从现有资源生成模板](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/generate-IaC.html)
+ 将@@ [整个应用程序导入 CloudFormation](https://aws.amazon.com/blogs/devops/import-entire-applications-into-aws-cloudformation/)（AWS 博客文章）

Amazon Aurora：
+ [Amazon Aurora 用户指南](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/Welcome.html)
+ [管理亚马逊 Aurora 数据库集群](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/CHAP_Aurora.html)

蓝绿部署策略：
+ [亚马逊 Aurora Blue/Green 部署概述](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/blue-green-deployments-overview.html)

基于 GTID 的复制：
+ [使用基于 GTID 的复制](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/mysql-replication-gtid.html)（Amazon RDS 文档）

AWS Lambda:
+ [AWS Lambda 开发人员指南](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html)
+ [使用 AWS Lambda 函数的最佳实践](https://docs.aws.amazon.com/lambda/latest/dg/best-practices.html)

Amazon Route 53：
+ [Amazon Route 53 开发人员指南](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/Welcome.html)
+ [加权路由](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/routing-policy-weighted.html)

MySQL 客户端工具：
+ [PyMYSQL](https://github.com/PyMySQL/PyMySQL)