使用 Neptune 蓝绿解决方案执行蓝绿更新 - Amazon Neptune
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

使用 Neptune 蓝绿解决方案执行蓝绿更新

Amazon Neptune 引擎升级可能需要应用程序停机时间,因为在安装和验证更新时数据库不可用。无论它们是手动启动还是自动启动,都是如此。

Neptune 提供了蓝绿部署解决方案,您可以使用 Amazon CloudFormation 堆栈运行该解决方案,从而大大减少此类停机时间。它创建一个与您的蓝色生产环境同步的绿色暂存环境。然后,您可以更新该暂存环境以执行次要或主要引擎版本升级、图形数据模型更改或操作系统更新,并测试结果。最后,您可以快速将其切换为生产环境,停机时间非常少。

Neptune 蓝绿解决方案分为两个阶段,如下图所示:

蓝绿部署策略的高级流程图

第 1 阶段创建一个与生产集群相同的绿色数据库集群

该解决方案使用唯一的蓝绿部署标识符创建数据库集群,其集群拓扑结构与生产集群相同。也就是说,它具有与生产(蓝色)数据库集群相同的数据库实例数量和大小、相同的参数组和所有配置,不同之处在于它已升级到您指定的目标引擎版本,该版本必须高于您的当前(蓝色)引擎版本。您可以为目标指定次要和主要引擎版本。如有必要,该解决方案将执行达到指定的目标引擎版本所需的任何中间升级。这个新集群变成了绿色暂存环境。

第 2 阶段设置连续数据同步

在完全准备好绿色环境后,该解决方案使 Neptune 流在源(蓝色)集群和目标(绿色)集群之间建立连续复制。当它们之间的复制差异达到零时,暂存环境就准备好进行测试了。此时,您必须暂停写入蓝色集群,以避免任何进一步的复制滞后。

您的目标引擎版本可能具有影响应用程序的新特征或依赖关系。检查引擎版本下的目标引擎版本页面和中间引擎版本页面,查看自当前引擎版本以来发生了什么变化。在将绿色集群提升到生产环境之前,最好在绿色集群上运行集成测试或手动验证应用程序。

在测试并验证了绿色集群中的更改后,只需将应用程序中的数据库端点从蓝色集群切换到绿色集群即可。

切换后,Neptune 蓝绿解决方案不会删除旧的蓝色生产环境。如果需要,您仍然可以访问它以进行其它验证和测试。标准账单费用适用于其实例,直到您将其删除。蓝绿解决方案还使用其它 Amazon 服务,其费用按正常价格计费。清理部分介绍了有关在完成解决方案后将其删除的详细信息。

运行 Neptune 蓝绿堆栈的先决条件

在启动 Neptune 蓝绿堆栈之前:

  • 请务必在生产(蓝色)集群上启用 Neptune 流

  • 蓝色集群中的所有实例都必须处于可用状态。您可以在 Neptune 控制台中或使用 describe-db-instances API 查看实例状态。

  • 所有实例还必须与数据库集群参数组同步。

  • Neptune 蓝绿解决方案要求您的蓝色集群所在的 VPC 中有一个 DynamoDB VPC 端点。请参阅使用 Amazon VPC 端点访问 DynamoDB

  • 选择在蓝色生产数据库集群上的写入工作负载尽可能轻的时候运行解决方案。例如,避免在将要进行批量加载或出于任何其它原因可能存在大量写入操作时运行解决方案。

使用 Amazon CloudFormation 模板运行 Neptune 蓝绿解决方案

您可以使用 Amazon CloudFormation 部署 Neptune 蓝绿解决方案。CloudFormation 模板在与您的蓝色源 Neptune 数据库相同的 VPC 中创建一个 Amazon EC2 实例,在那里安装解决方案并运行该实例。您可以在 CloudWatch 日志中监控其进度,如监控进度中所述。

您可以使用以下链接审核解决方案模板,也可以选择启动堆栈按钮在 Amazon CloudFormation 控制台中启动该模板:

在控制台中,从窗口右上角的下拉列表中选择要运行解决方案的 Amazon 区域。

按如下方式设置堆栈参数:

  • DeploymentID – 每个 Neptune 蓝绿部署的唯一标识符。

    它用作绿色数据库集群标识符,也用作为在部署期间创建的新资源命名的前缀。

  • NeptuneSourceClusterId – 要升级的蓝色数据库集群的标识符。

  • NeptuneTargetClusterVersion: – 您要将蓝色数据库集群升级到的 Neptune 引擎版本

    此值必须高于当前蓝色数据库集群的引擎版本。

  • DeploymentMode – 表示这是新部署,还是尝试恢复先前的部署。当您使用与先前部署相同的 DeploymentID 时,请将 DeploymentMode 设置为 resume

    有效值为:new(默认值)和 resume

  • GraphQueryType - 数据库的图形数据类型。

    有效值为:propertygraph(默认值)和 rdf

  • SubnetId – 来自您的蓝色数据库集群所在的同一 VPC 的子网 ID。(请参阅从同一 VPC 中的 Amazon EC2 实例连接到 Neptune 数据库集群)。

    如果您想通过 EC2 连接以 SSH 方式连接到该实例,请提供公有子网的 ID。

  • InstanceSecurityGroup – Amazon EC2 实例的安全组。

    安全组必须有权访问您的蓝色数据库集群,并且您必须能够以 SSH 方式连接到该实例。请参阅使用 VPC 控制台创建安全组

等到堆栈完成。一旦完成,就启动此解决方案。然后,您可以使用 CloudWatch 日志监控部署过程,如下一节所述。

监控 Neptune 蓝绿部署的进度

您可以通过前往 CloudWatch 控制台并查看 /aws/neptune/(Neptune Blue/Green deployment ID) CloudWatch 日志组中的日志来监控 Neptune 蓝绿解决方案的进度。您可以在解决方案的 Amazon CloudFormation 堆栈的输出中找到 CloudWatch 日志的链接:

蓝绿 Amazon CloudFormation 堆栈输出的屏幕截图

如果您提供公有子网作为堆栈参数,则还可以通过 SSH 方式连接到作为堆栈一部分创建的 Amazon EC2 实例,并参考 /var/log/cloud-init-output.log 中的日志。

该日志显示 Neptune 蓝绿解决方案所采取的操作,如以下屏幕截图所示:

Neptune 蓝绿日志屏幕截图

日志消息显示蓝色和绿色集群之间的同步状态:

Neptune 蓝绿解决方案日志消息的屏幕截图

同步过程通过计算蓝色集群上的最新数据流 eventID 与由 Neptune 至 Neptune 复制堆栈创建的 DynamoDB 检查点表中存在的复制检查点之间的差异来检查复制滞后。使用这些消息,您可以监控当前的复制差异。

从生产蓝色集群切换到更新后的绿色集群

在将绿色集群提升到生产环境之前,请确保蓝色和绿色集群之间的提交差异为零,然后禁用蓝色集群的所有写入流量。在将数据库端点切换到绿色集群的同时继续写入蓝色集群,可能会因向两个集群写入部分数据而导致数据损坏。您可能还不需要禁用读取流量。

如果您已在源(蓝色)集群上启用了 IAM 身份验证,请务必更新应用程序中使用的所有 IAM policy 以指向绿色集群(有关此类策略的示例,请参阅此无限制访问策略)。

禁用写入流量后,等待复制完成,然后在绿色集群上(但不在蓝色集群上)启用写入流量。同时将读取流量从蓝色集群切换到绿色集群。

在 Neptune 蓝绿解决方案完成后进行清理

将暂存(绿色)集群升级到生产环境后,清理由 Neptune 蓝绿解决方案创建的资源:

  • 删除为运行该解决方案而创建的 Amazon EC2 实例。

  • 删除基于 Neptune 流的复制的 Amazon CloudFormation 模板,这些模板使绿色集群与蓝色集群保持同步。主模板具有您之前提供的堆栈名称,一个模板名称由部署 ID 后跟“-replication”组成:即 (DeploymentID)-replication

删除 Amazon CloudFormation 模板并不会删除集群本身。确认绿色集群按预期运行后,您可以选择在手动删除蓝色集群之前拍摄快照。

Neptune 蓝绿解决方案最佳实践

  • 在将绿色集群切换到生产环境之前,值得彻底验证其是否运行正常。检查数据的一致性和数据库的配置。某些新的引擎版本可能还需要客户端升级。请在升级之前查看引擎版本说明。在生产环境中开始蓝绿升级之前,值得在开发、测试和预生产环境中对所有这些进行测试。

  • 最好在维护时段内执行从蓝色服务器到绿色服务器的切换。

  • 为了确保升级和同步后一切正常运行,在删除原始集群之前,值得将其保留一段时间。如果出现不可预见的问题,它可能会很有用。

  • 运行 Neptune 蓝绿解决方案时,请避免繁重的写入操作,例如批量加载,因为它们可能会导致复制滞后,从而导致大量的停机时间。理想情况下,从关闭对蓝色集群的写入到为绿色集群开启写入只有很短的时间。

对 Neptune 蓝绿解决方案进行故障排除

Neptune 蓝绿解决方案引发的错误
  • Cluster with id = (blue_green_deployment_id) already exists – 具有标识符 (blue_green_deployment_id) 的现有集群。

    如果集群是在之前的 Neptune 蓝绿运行中创建的,请提供新的部署 ID 或将部署模式设置为 resume

  • Streams should be enabled on the source Cluster for Blue Green Deployment – 在蓝色(源)集群上启用 Neptune 流

  • No Bulkload should be in progress on source cluster: (cluster_id) – 如果 Neptune 蓝绿解决方案识别出持续的批量加载,它就会终止。

    这是为了确保同步过程能够赶上正在进行的写入操作。在启动 Neptune 蓝绿解决方案之前,请避免或取消任何正在进行的批量加载任务。

  • Blue Green deployment requires instances to be in sync with db cluster parameter group – 对集群参数组的任何更改都应在整个数据库集群中同步。请参阅Amazon Neptune 参数组

  • Invalid target engine version for Blue Green Deployment – 目标引擎版本必须在Amazon Neptune 的引擎版本中列为活动的版本,并且必须高于源(蓝色)集群的当前引擎版本。