伦敦证券交易所集团如何为 Amazon Aurora PostgreSQL 全球数据库优化蓝绿

伦敦证券交易所集团如何优化了亚马逊 Aurora PostgreSQL 全球数据库的蓝/绿部署

作者:Ionut Bruma, Richard Chester, Inthu Anandakumar, Jonathan Kerr
发布日期:2024年7月1日
来源:

关键要点

在本文中,我们将介绍伦敦证券交易所集团(LSEG)如何通过持续的逻辑数据库复制来优化其蓝/绿部署策略,显著提高了生产数据库的可用性和部署效率。通过采用逻辑复制,该过程省去了手动备份和恢复数据库的繁琐步骤,减少了停机时间,使团队能够更快速地发布新功能。

蓝/绿部署是一种在生产和预备环境之间切换的策略,旨在实现更高效、安全的软件更新。本文将细致展示如何在 Amazon Aurora PostgreSQL全球数据库上实施这一流程,并探讨相关的最佳实践与考虑事项。


过去,LSEG的部署需手动备份并恢复生产数据库以创建绿色环境,此过程费时且需关闭生产数据库,从而导致蓝色和绿色环境的一致性问题。采用逻辑复制后,备份和恢复被持续复制所替代,这大大缩短了蓝色环境的停机时间。

蓝/绿部署策略允许在网站、应用程序或数据库中实施更改时,通过交替使用生产环境和临时环境来最小化停机时间。蓝色环境通常为主要的活跃后端,而绿色环境作为一个同步的备份。变更先在绿色环境中实施,待确认无误后再切换,以便在出现问题时快速回滚至蓝色环境。

没有蓝/绿部署的情况下,部署一般需要在非业务时间进行,导致额外的操作成本和可用性降低。通过蓝/绿部署,不仅可以提高部署的灵活性,还能缩短新功能的上市时间。

该部署方式除了支持数据库版本升级和某些数据库架构变更外,还能通过镜像生产配置来辅助内部应用更改测试。消除了每次测试周期都需要备份和恢复生产数据库的必要,为团队提供了显著优势。

解决方案概述

我们的应用程序通过 为内部用户提供服务,解析至分配流量的内部应用负载均衡器,该负载均衡器将流量分配给跨三个可用区的 Kubernetes 集群。应用层负责执行对 Aurora全球数据库的 CRUD 操作。

以下是测试阶段的架构示意图:

删除)

以下是切换流量至蓝色集群的步骤示意图:

删除)

以下是停止从蓝色到绿色复制的步骤示意图,此步骤在确保没有用户活动或批处理作业访问数据库后进行:

删除)

以下是将流量指向绿色集群的步骤示意图。从此刻起,绿色环境将作为主要的生产环境,直到下一个迭代。

删除)

接下来,我们将详细说明实施蓝/绿部署的具体步骤:

  1. 配置与源(蓝色)Aurora 全球数据库集群相关的集群参数组,以启用逻辑复制。
  2. 创建蓝色集群上托管数据库的发布。
  3. 使用 创建蓝色集群的克隆,即绿色集群。
  4. 配置来自绿色集群到蓝色发布的订阅。
  5. 验证复制延迟。
  6. 将绿色集群转换为 Aurora 全球数据库。
  7. 执行切换前验证。
  8. 修改序列并删除订阅。
  9. 切换至绿色集群。

我们使用原生 PostgreSQL 逻辑复制来同步绿色环境,以提供持续的 CDC 功能。逻辑复制过程是异步的。有关更多信息,请参考 。

目标数据库处于可写状态,允许在复制之外执行 DDL 和 DML 操作。强烈建议采取适当措施,确保 DML 和 DDL 变更应在预期的数据库上实施。

前提条件

需要完成以下前提条件:

  1. 创建一个配置为全球数据库的 Aurora PostgreSQL 集群 。

请注意,Aurora 全球数据库不支持通过 管理用户,因此在后文中我们会讨论替代的安全方法。

  1. 查看与 Amazon Aurora PostgreSQL 的逻辑复制相关的 。
  2. 确认是否满足相关 ,例如拥有 角色的用户。
  3. 通过 PostgreSQL 客户端(例如 或 )确认可以连接到 DB 集群。
  4. 通过 或 (AWS CLI)确认对 AWS 控制平面的访问。

请注意,截至本文撰写时, 不支持流复制模式。如果您使用 RDS Proxy,则应使用常规集群端点,并在复制过程中忽略 RDS Proxy。

所需权限

该过程需要两级权限:

  • 控制平面(AWS 资源层) — 这些权限允许修改涉及的 Aurora 集群,并通过控制台或 API 创建和修改新集群。
  • 数据平面(Aurora 数据层) — 这些权限允许使用 PostgreSQL 客户端创建复制配置。

以下表格总结了相关解决方案步骤,以及是通过控制平面还是数据平面执行。

步骤编号步骤描述控制平面数据平面
1配置蓝色集群参数组以支持逻辑复制
2创建蓝色集群上托管数据库的发布
3创建蓝色集群的克隆
4配置来自绿色集群到蓝色发布的订阅
5验证复制延迟
6将绿色集群转换为 Aurora 全球数据库
7执行切换前验证
8修改序列并删除订阅

配置蓝色集群参数组

Aurora 集群和 Aurora 实例参数组是区域资源。确保这些资源在目标区域中配置为所需设置。通常,目标区域的参数设置将镜像源 RDS 集群和 RDS实例参数组。

实例应使用自定义 DB 集群参数组,其设置如下:

  • rds.logical_replication — 将此参数配置为 1。rds.logical_replication 参数的作用与独立 PostgreSQL 服务器的 wal_level 参数相同,以及其他控制预写日志文件管理的参数。(若参数组是在之后创建的,此更改将要求实例重启。)
  • max_replication_slots — 将此参数配置为将创建的订阅总数。
  • max_wal_senders — 将此参数配置为并发连接的数量,并为管理任务和新会话预留额外开销。如果您使用 AWS DMS,max_wal_senders 的数量应为并发会话数量和在任何时间内可能运行的 AWS DMS 任务数量的总和。
  • max_logical_replication_workers — 将此参数配置为预期的逻辑复制工作器和表同步工作器数量。通常建议将复制工作器的数量设置为与 max_wal_senders 相同的值。工作器从为服务器分配的后台进程池(max_worker_processes)中获取。
  • max_worker_processes — 将此参数配置为服务器的后台进程数量。分配应足够用于复制、自动清理过程和可能并发发生的其他维护过程。

创建蓝色集群的数据库发布

按照以下步骤在蓝色集群上创建数据库的发布:

  1. 连接到蓝色集群的源数据库。
  2. 运行以下查询以确认设置:

sql SELECT name, setting FROM pg_settings WHERE name in ('rds.logical_replication', 'max_replication_slots', 'max_wal_senders', 'max_logical_replication_workers', 'max_worker_processes');

  1. 创建发布:

sql CREATE PUBLICATION publication_name FOR ALL TABLES;

  1. 创建复制槽:

sql SELECT pg_create_logical_replication_slot('replication_slot_name', 'pgoutput');

  1. 创建一个供复制使用的非管理员账户,并在源数据库中授予以下权限:

sql CREATE USER repl_user WITH PASSWORD 'Sup3r_Secure_P4ssw0rd'; GRANTrds_replication TO repl_user; GRANT INSERT, UPDATE, SELECT, DELETE ON ALLTABLES IN SCHEMA schema TO repl_user;

创建蓝色集群的克隆

通过克隆蓝色集群创建绿色集群。有关创建蓝色集群克隆(作为绿色集群)的说明,请参考 。

在绿色数据库中配置订阅

克隆完成并处于可用状态后,完成以下步骤:

  1. 连接到绿色集群的目标数据库。
  2. 从集群或写入端点获取日志位置,并安全存储。此位置将用于在克隆创建时启动订阅,以确保不会丢失数据,也不会处理重复更改。执行以下查询:

sql SELECT aurora_volume_logical_start_lsn();

  1. 仅在绿色实例上删除复制槽:

sql SELECT pg_drop_replication_slot('replication_slot_name');

  1. 仅在绿色实例上删除发布:

sql DROP PUBLICATION publication_name;

  1. 创建到蓝色实例的订阅:

sql CREATE SUBSCRIPTION subscription_name CONNECTION 'postgres://repl_user:repl_user_password@source_instance_URL/database' PUBLICATION publication_name WITH (copy_data = false, create_slot = false, enabled = false, connect = true, slot_name = 'replication_slot_name');

  1. 检索 roname 值,该值为复制源的标识符:

sql SELECT * FROM pg_replication_origin;

  1. 使用上一步的 roname 输出配置发布中的起始位置。log_sequence_number 是前面步骤中 aurora_volume_logical_start_lsn() 的输出:

sql SELECT pg_replication_origin_advance('roname', 'log_sequence_number');

  1. 启用订阅:

sql ALTER SUBSCRIPTION subscription_name ENABLE;

验证复制延迟

确认复制已正确配置并正在复制数据:

  1. 连接到蓝色集群的源数据库。
  2. 运行以下查询以确认:

sql SELECT now() AS CURRENT_TIME, slot_name, active, active_pid, pg_size_pretty(pg_wal_lsn_diff(pg_current_wal_lsn(), confirmed_flush_lsn)) ASdiff_size, pg_wal_lsn_diff(pg_current_wal_lsn(), confirmed_flush_lsn) ASdiff_bytes FROM pg_replication_slots WHERE slot_type = 'logical';

可选择使用 pg_cron

在指定频率上记录前面的查询,以追踪随时间的复制延迟。

请注意,尽管 发布有关复制和复制延迟的各种指标,但这些指标适用于托管的只读副本和全球数据库。

将绿色集群转换为 Aurora 全球数据库

您可以选择现在执行此步骤或在部署后进行。

确保集群参数和实例组的配置位于将要添加到全球数据库的区域。有关更多信息,请参考 。

此时,复制已配置,系统为部署更改到绿色环境做好准备。

完成后,您可以在绿色环境中执行部署验证和测试,这可能涉及完成本指南中的其余步骤,以模拟端到端的切换过程。

一旦测试完成,绿色环境可以简单地删除,并重新实例化以准备实时部署。

执行切换前验证

您现在可以从蓝色环境切换到绿色环境。以下验证步骤可能涉及多个团队完成:

  1. 停止对蓝色环境的写入(使用您首选的方法)。
  2. 连接到蓝色集群的源数据库。
  3. 运行以下查询以确保复制已赶上。当 diff_sizediff_bytes 的值达到 0 时,副本已跟上源集群:

sql SELECT now() AS CURRENT_TIME, slot_name, active, active_pid, pg_size_pretty(pg_wal_lsn_diff(pg_current_wal_lsn(), confirmed_flush_lsn)) ASdiff_size, pg_wal_lsn_diff(pg_current_wal_lsn(), confirmed_flush_lsn) ASdiff_bytes FROM pg_replication_slots WHERE slot_type = 'logical';

  1. pg_stat_activity 系统视图中运行以下查询,确认蓝色集群中已删除所有非系统连接:

sql SELECT * FROM pg_stat_activity WHERE usename NOT IN ('rdsadmin', 'replication_user');

  1. 取消仍处于打开状态的任何活动连接:

sql SELECT pg_cancel_backend(pid) FROM pg_stat_activity;

  1. 使用您首选的方法验证蓝色和绿色环境的数据集,例如对象和行计数、二进制校验和或第三方工具。
  2. 如果您使用序列,请检索并存储序列的当前值,因为它们需要稍后重新同步到绿色环境。连接到蓝色集群的源数据库,并运行以下代码,该代码将输出需要运行的命令:

sql select 'ALTER SEQUENCE ' || c.relname || ' RESTART WITH ' || nextval(s.seqrelid::regclass) || ';' AS alter_sequences from pg_sequence sinner join pg_class c on s.seqrelid = c.oid;

修改序列并删除订阅

如果您使用序列,请将序列值重置为来自复制验证步骤的蓝色环境。您需要对所有已复制的序列执行此步骤:

  1. 连接到绿色集群的目标数据库。
  2. 运行上一步骤第 7 步的输出以重置所有序列。
  3. 现在可以从绿色环境中删除订阅:

sql DROP SUBSCRIPTION subscription_name;

切换至绿色集群

此步骤标志着当前蓝色环境向新的绿色环境的过渡。涉及所有参与支持部署的各方。将工作负载重定向到绿色环境可能涉及更新连接字符串、Aurora 端点或 CNAME记录等操作。(请注意,全球数据库没有全球 Aurora 端点。)管理此切换的具体方法取决于您所选择的方法。

切换后的步骤

切换完成后,请停止蓝色集群并进行最终备份。根据您的组织政策,您可以在之后删除蓝色集群。

清理

如果您设置一个或多个测试使用

Leave a Reply

Required fields are marked *