本文详细介绍了如何在AWS上实现跨区域的pilot light灾备方案,由于部分闲置的AWS组件会给客户增加额外的成本,因此在整个方案中,除了VPC预配置和RDS热备外,其余所有的组件 都是灾难发生后通过脚本动态创建,达到最小的Infra cost。当发生灾难时,用户通过预先定义好的灾备脚本,在灾备 区域快速构建 AWS 资源。
该方案是模拟一个 WordPress cluster 部署在 AWS 上进行 multi-region pilot light 灾备的方案。生产区域组件选择如下:
根据 Pilot Light 的需求,我们需要将 WordPress 的文件存储,和数据库异步同步到其他其他区域。架构图如下:
以下为各个组件的介绍。 RDS MySQL 数据备份 RDS Mysql 配置Cross Region Replica,实现数据库的异步复制。如何配置跨Region只读副本,请参考文档。 当灾难发生后,通过提升只读副本为独立的数据库实例,使其能够执行正常的写入操作。在本方案中,会使用脚本实现 提升只读副本的操作。 S3 Bucket 数据备份(WordPress Media File) 开启S3 Cross Region Replication,实现S3文件的跨Region自动复制。关于如何开启S3跨区域复制, 请参考文档。 应用镜像 当北京区域新建AMI后,需要把新建的AMI复制到宁夏区域。您可以手动触发复制过程 也可以通过脚本自动化整个过程,例如在CloudWatch Event中设定时任务,触发lambda捕捉某段时间内 新建的AMI,通过简单的AWS api调用把新建的AMI复制到到宁夏区域。请根据项目实时性的需求为定时任务 设定合适的执行频率。 应用配置 在EC2的启动配置中设置user-data,使EC2内应用程序在启动后能够获取所需的配置,例如RDS Mysql和 Redis的endpoint等等。启动配置已经包含在灾难恢复的脚本中。 灾备脚本 按照上述方案,在GitHub aws-dr-samples上提供了基于 Terraform 的可执行脚本,该套脚本可以帮助用户快速构建模拟生产环境和灾备环境。 用户根据所需创建的资源写成脚本文件。执行脚本时,Terraform 通过调用 AWS API 来快速构建 AWS 资源。下文有如何使用的详细步骤描述。 在本方案中,设定Redis不包含持久化数据。因此无需实现复制,只需在灾难恢复时通过脚本创建新实例即可。 当灾难发生后,按照以下顺序进行灾难恢复:
接下来,我们会详细描述该方案的实施步骤和脚本运行执行过程。
以宁夏区为例,按照上述灾备方案,假定需要的灾备资源及产生的费用为:
| 服务 | 类型 | 单价 | 1 年价格 |
|---|---|---|---|
| AMI 20G | 0.277/GB/月 | 66.48 | |
| S3 不频繁访问 1T | 0.1030029/GB/月 | 1265.7 | |
| RDS Read Replica | db.m4.large 单AZ | 1.1733/小时 | 5540 |
| Cross Region traffic 2T | 0.6003/GB | 1229.414 | |
| Total | 8101.594 | ||
| Total with tax | 8587.69 |
以上仅做参考,实际配置情况,应该根据工作负载合理配置。
terraform脚本请点击此处获取。 项目内有三个文件夹,basic, database, app。
LockID,类型为 string。在本环境中,该 DynamoDB Table名称 为tf-state。请勿在生产区域部署 S3, DynamoDB,防止 Region Down 之后,无法使用 Terraform。
由于 WordPress 会记录域名,请勿使用ELB的域名直接访问, 为 WordPress 配置自定义域名。
<project>/index.tf 和 <project>/variables.tf. <project>代表basic, database, app三个相应folder的泛指,请分别进行修改。aws provider 会比较慢,可提前手动下载, 并解压到<project>/.terraform/plugins/<arch>/ 目录下。<arch> 为本机的系统和CPU架构, 如 darwin_amd64, linux_amd64。 >>>点击此处手动下载 Terraform AWS Provider<<<如果对现有生产环境进行操作,直接跳过此步骤。
该步骤创建模拟的生产环境,用于演示。可以选择手动创建,或者利用脚本快速创建。使用脚本的好处是, 在演示结束后,我们可以快速销毁演示环境。 创建基础环境
basic/variables.tf 和 basic/index.tfterraform initterraform workspace new prod 创建 模拟生产环境的 workspace. 我们使用 workspace 来区分是模拟生产环境或者灾备环境terraform apply 创建基础网络环境创建数据库
database/variables.tf 和 database/index.tfterraform initterraform workspace new prod 创建 模拟生产环境的 workspace.terraform apply 创建数据库相关资源创建应用层
app/variables.tf 和 app/index.tfterraform initterraform workspace new prod 创建模拟生产环境的 workspaceterraform apply 创建APP相关资源我们需要提前在灾备环境创建基础网络架构,来使得灾难发生时可以快速切换。在使用以下脚本的时候 注意参数的配置。推荐使用脚本创建,这样可以提高自动化的水平。 如果已经在创建模拟生产环境中修改了 index.tf 文件,无需修改该文件。 拷贝镜像
创建基础环境
basic/dr.tfvars 和 basic/index.tfterraform initterraform workspace new dr 创建灾备环境的 workspace. 我们使用 workspace 来区分是模拟生产环境或者灾备环境terraform apply --var-file=dr.tfvars 创建基础网络环境S3 数据同步
aws s3 sync s3://SOURCE_BUCKET_NAME s3://TARGET_BUCKET_NAME
有关于开启 S3 Cross Region Replication 的更多资料,请参考这里。
RDS 数据同步


修改灾备应用脚本启动参数
app/dr.tfvarsapp/dr.tfvars, app/index.tf(如之前未修改)terraform initterraform workspace new dr 创建灾备环境的 workspace.修改灾备脚本参数时,要谨慎核对参数。
强烈建议在完成数据同步之后,进行一次故障转移的演练。
在灾难发生后,执行故障转移, 请确保 app 目录下的 terraform workspace 是 dr。 可以通过 terraform workspace list 来确认当前 workspace, 或者通过 terraform workspcae select dr 来切换到 dr workspace。
灾后恢复请务必咨询架构师!
可以通过以下步骤快速销毁演示环境。 销毁灾备环境 以下都是 dr terraform workspace
terraform destroy --var-file=dr.tfvarsterraform destroy --var-file=dr.tfvars, 请在数据库实例删除后执行销毁演示生产环境 以下都是 prod terraform workspace, 可以通过 terraform workspace select prod 切换。
terraform destoryterraform destroyterraform destory如需要,可手动删除 WordPress Media 文件 S3 Bucket, 以及 Terraform backend.
Terraform 故障排查 可以通过在 Terraform 命令之前添加环境变量,来使 Terraform 输出更多的日志信息来帮助故障排查,如:
TF_LOG=DEBUG terraform init
本文详细介绍了如何在AWS上实现跨区域的pilot light灾备方案,并提供了terraform模板进行可行性验证。在整个方案中,除了VPC预配置和RDS热备外,其余所有的组件 都是灾难发生后通过脚本动态创建,达到最小的Infra cost。当发生灾难时,用户通过预先定义好的灾备脚本,在灾备 区域快速构建 AWS 资源。
本文转载亚马逊云科技官方博客《企业备份&容灾系列 – AWS 多区域 Pilot Light 容灾设计》