作者:Ionut Bruma, Richard Chester, Inthu Anandakumar, Jonathan Kerr
发布日期:2024年7月1日
来源:
在本文中,我们将介绍伦敦证券交易所集团(LSEG)如何通过持续的逻辑数据库复制来优化其蓝/绿部署策略,显著提高了生产数据库的可用性和部署效率。通过采用逻辑复制,该过程省去了手动备份和恢复数据库的繁琐步骤,减少了停机时间,使团队能够更快速地发布新功能。
蓝/绿部署是一种在生产和预备环境之间切换的策略,旨在实现更高效、安全的软件更新。本文将细致展示如何在 Amazon Aurora PostgreSQL全球数据库上实施这一流程,并探讨相关的最佳实践与考虑事项。
过去,LSEG的部署需手动备份并恢复生产数据库以创建绿色环境,此过程费时且需关闭生产数据库,从而导致蓝色和绿色环境的一致性问题。采用逻辑复制后,备份和恢复被持续复制所替代,这大大缩短了蓝色环境的停机时间。
蓝/绿部署策略允许在网站、应用程序或数据库中实施更改时,通过交替使用生产环境和临时环境来最小化停机时间。蓝色环境通常为主要的活跃后端,而绿色环境作为一个同步的备份。变更先在绿色环境中实施,待确认无误后再切换,以便在出现问题时快速回滚至蓝色环境。
没有蓝/绿部署的情况下,部署一般需要在非业务时间进行,导致额外的操作成本和可用性降低。通过蓝/绿部署,不仅可以提高部署的灵活性,还能缩短新功能的上市时间。
该部署方式除了支持数据库版本升级和某些数据库架构变更外,还能通过镜像生产配置来辅助内部应用更改测试。消除了每次测试周期都需要备份和恢复生产数据库的必要,为团队提供了显著优势。
我们的应用程序通过 为内部用户提供服务,解析至分配流量的内部应用负载均衡器,该负载均衡器将流量分配给跨三个可用区的 Kubernetes 集群。应用层负责执行对 Aurora全球数据库的 CRUD 操作。
以下是测试阶段的架构示意图:
删除)
以下是切换流量至蓝色集群的步骤示意图:
删除)
以下是停止从蓝色到绿色复制的步骤示意图,此步骤在确保没有用户活动或批处理作业访问数据库后进行:
删除)
以下是将流量指向绿色集群的步骤示意图。从此刻起,绿色环境将作为主要的生产环境,直到下一个迭代。
删除)
接下来,我们将详细说明实施蓝/绿部署的具体步骤:
我们使用原生 PostgreSQL 逻辑复制来同步绿色环境,以提供持续的 CDC 功能。逻辑复制过程是异步的。有关更多信息,请参考 。
目标数据库处于可写状态,允许在复制之外执行 DDL 和 DML 操作。强烈建议采取适当措施,确保 DML 和 DDL 变更应在预期的数据库上实施。
需要完成以下前提条件:
请注意,Aurora 全球数据库不支持通过 管理用户,因此在后文中我们会讨论替代的安全方法。
请注意,截至本文撰写时, 不支持流复制模式。如果您使用 RDS Proxy,则应使用常规集群端点,并在复制过程中忽略 RDS Proxy。
该过程需要两级权限:
以下表格总结了相关解决方案步骤,以及是通过控制平面还是数据平面执行。
步骤编号 | 步骤描述 | 控制平面 | 数据平面 |
---|---|---|---|
1 | 配置蓝色集群参数组以支持逻辑复制 | 是 | — |
2 | 创建蓝色集群上托管数据库的发布 | — | 是 |
3 | 创建蓝色集群的克隆 | 是 | — |
4 | 配置来自绿色集群到蓝色发布的订阅 | — | 是 |
5 | 验证复制延迟 | — | 是 |
6 | 将绿色集群转换为 Aurora 全球数据库 | 是 | — |
7 | 执行切换前验证 | — | 是 |
8 | 修改序列并删除订阅 | — | 是 |
Aurora 集群和 Aurora 实例参数组是区域资源。确保这些资源在目标区域中配置为所需设置。通常,目标区域的参数设置将镜像源 RDS 集群和 RDS实例参数组。
实例应使用自定义 DB 集群参数组,其设置如下:
rds.logical_replication
参数的作用与独立 PostgreSQL 服务器的 wal_level
参数相同,以及其他控制预写日志文件管理的参数。(若参数组是在之后创建的,此更改将要求实例重启。)max_wal_senders
的数量应为并发会话数量和在任何时间内可能运行的 AWS DMS 任务数量的总和。max_wal_senders
相同的值。工作器从为服务器分配的后台进程池(max_worker_processes
)中获取。按照以下步骤在蓝色集群上创建数据库的发布:
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');
sql CREATE PUBLICATION publication_name FOR ALL TABLES;
sql SELECT pg_create_logical_replication_slot('replication_slot_name', 'pgoutput');
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;
通过克隆蓝色集群创建绿色集群。有关创建蓝色集群克隆(作为绿色集群)的说明,请参考 。
克隆完成并处于可用状态后,完成以下步骤:
sql SELECT aurora_volume_logical_start_lsn();
sql SELECT pg_drop_replication_slot('replication_slot_name');
sql DROP PUBLICATION publication_name;
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');
roname
值,该值为复制源的标识符:sql SELECT * FROM pg_replication_origin;
roname
输出配置发布中的起始位置。log_sequence_number
是前面步骤中 aurora_volume_logical_start_lsn()
的输出:sql SELECT pg_replication_origin_advance('roname', 'log_sequence_number');
sql ALTER SUBSCRIPTION subscription_name ENABLE;
确认复制已正确配置并正在复制数据:
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
在指定频率上记录前面的查询,以追踪随时间的复制延迟。
请注意,尽管 发布有关复制和复制延迟的各种指标,但这些指标适用于托管的只读副本和全球数据库。
您可以选择现在执行此步骤或在部署后进行。
确保集群参数和实例组的配置位于将要添加到全球数据库的区域。有关更多信息,请参考 。
此时,复制已配置,系统为部署更改到绿色环境做好准备。
完成后,您可以在绿色环境中执行部署验证和测试,这可能涉及完成本指南中的其余步骤,以模拟端到端的切换过程。
一旦测试完成,绿色环境可以简单地删除,并重新实例化以准备实时部署。
您现在可以从蓝色环境切换到绿色环境。以下验证步骤可能涉及多个团队完成:
diff_size
和 diff_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';
pg_stat_activity
系统视图中运行以下查询,确认蓝色集群中已删除所有非系统连接:sql SELECT * FROM pg_stat_activity WHERE usename NOT IN ('rdsadmin', 'replication_user');
sql SELECT pg_cancel_backend(pid) FROM pg_stat_activity;
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;
如果您使用序列,请将序列值重置为来自复制验证步骤的蓝色环境。您需要对所有已复制的序列执行此步骤:
sql DROP SUBSCRIPTION subscription_name;
此步骤标志着当前蓝色环境向新的绿色环境的过渡。涉及所有参与支持部署的各方。将工作负载重定向到绿色环境可能涉及更新连接字符串、Aurora 端点或 CNAME记录等操作。(请注意,全球数据库没有全球 Aurora 端点。)管理此切换的具体方法取决于您所选择的方法。
切换完成后,请停止蓝色集群并进行最终备份。根据您的组织政策,您可以在之后删除蓝色集群。
如果您设置一个或多个测试使用
Leave a Reply