本文详细介绍了如何在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.tf
terraform init
terraform workspace new prod
创建 模拟生产环境的 workspace. 我们使用 workspace 来区分是模拟生产环境或者灾备环境terraform apply
创建基础网络环境创建数据库
database/variables.tf
和 database/index.tf
terraform init
terraform workspace new prod
创建 模拟生产环境的 workspace.terraform apply
创建数据库相关资源创建应用层
app/variables.tf
和 app/index.tf
terraform init
terraform workspace new prod
创建模拟生产环境的 workspaceterraform apply
创建APP相关资源我们需要提前在灾备环境创建基础网络架构,来使得灾难发生时可以快速切换。在使用以下脚本的时候 注意参数的配置。推荐使用脚本创建,这样可以提高自动化的水平。 如果已经在创建模拟生产环境中修改了 index.tf
文件,无需修改该文件。 拷贝镜像
创建基础环境
basic/dr.tfvars
和 basic/index.tf
terraform init
terraform 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.tfvars
app/dr.tfvars
, app/index.tf
(如之前未修改)terraform init
terraform 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.tfvars
terraform destroy --var-file=dr.tfvars
, 请在数据库实例删除后执行销毁演示生产环境 以下都是 prod
terraform workspace, 可以通过 terraform workspace select prod
切换。
terraform destory
terraform destroy
terraform 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 容灾设计》