vlambda博客
学习文章列表

全新 Amazon RDS for MySQL 和 PostgreSQL 多可用区 (Multi-AZ) 部署选项

月初,我们宣布推出全新的 Amazon Relational Database Service (RDS) 多可用区 (Multi-AZ) 部署选项 https://aws.amazon.com/rds/ ,其事务提交延迟最多可提速 2 倍,自动故障转移时间通常少于 35 秒,并包含可读的备用实例。



Amazon RDS 提供两种复制选项,以增强可用性和性能:


  • 多可用区部署 https://aws.amazon.com/rds/features/multi-az/  可提供高可用性和自动故障转移功能。Amazon RDS 会在第二个可用区中创建数据库的存储级别副本。然后,它会将数据从主数据库实例同步复制到备用数据库实例,以实现高可用性。主数据库实例为应用程序请求提供服务,而备用数据库实例则会在出现故障时随时接管。Amazon RDS 负责管理故障检测、故障转移和修复操作的各方面事宜,以便使用数据库的应用程序具有高可用性。


  • 只读副本 https://aws.amazon.com/rds/features/read-replicas/  允许应用程序跨多个数据库实例扩展其读取操作。数据库引擎会将数据异步复制到只读副本。应用程序将写入请求(INSERTUPDATE 和 DELETE)发送到主数据库,读取请求 (SELECT) 可以在只读副本之间实现负载均衡。如果主节点出现故障,您可以手动将只读副本提升为新的主数据库 https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_ReadRepl.html#USER_ReadRepl.Promote



多可用区部署和只读副本有不同的用途。多可用区部署可为您的应用程序提供高可用性、持久性和自动故障转移的服务。只读副本可为您的应用程序提供读取可扩展性。


但是,如果应用程序既需要高可用性、自动故障转移,同时又需要读取可扩展性,该怎么办?



隆重介绍具有两个可读备用实例的新 Amazon RDS 多可用区部署选项。


从今天开始,我们将添加一个新选项来部署 Amazon RDS 数据库。此选项结合了自动故障转移和只读副本:Amazon RDS 多可用区,并带有两个可读备用实例。此部署选项适用于 MySQL 和 PostgreSQL 数据库。这是一个具有一个主实例和两个可读备用实例的数据库集群 https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/multi-az-db-clusters-concepts.html 。它提供的事务提交延迟可提速 2 倍,同时提供自动故障转移功能,通常用时不超过 35 秒。


下图展示了这种部署服务:


全新 Amazon RDS for MySQL 和 PostgreSQL 多可用区 (Multi-AZ) 部署选项


启用新的多可用区数据库集群 (Multi-AZ) 部署选项后,Amazon RDS 将在三个不同的可用区中配置一个主数据库和两个只读副本。然后,它会监视并在主节点出现故障时启用故障转移。

与传统的只读副本一样,数据库引擎会在主节点和只读副本之间复制数据。与多可用区单备用部署选项类似,Amazon RDS 会自动检测和管理故障转移以实现高可用性。

您不必在高可用性或可扩展性之间进行选择;具有两个可读备用副本的多可用区数据库集群可同时实现两种特质。


有什么益处?

与传统的多可用区部署相比,此新部署选项为您带来了四大优势:经过改进的提交延迟、更快的故障转移、可读的备用实例和得到优化的复制。


首先,使用多可用区数据库集群时,写入操作会变得更快。新的多可用区数据库集群实例利用 M6gd 和 R6gd 实例类型。这些实例由 Amazon Graviton2 处理器 https://aws.amazon.com/ec2/graviton  提供支持。它们配备了用于本地存储的快速 NVMe SSD https://en.wikipedia.org/wiki/NVM_Express ,非常适合高速和低延迟存储要求。与基于 x86 的同类实例相比,它们的性价比最高可提升 40%,每个 vCPU 的本地存储容量可增加 50%。

多可用区数据库实例使用 Amazon Elastic Block Store (EBS) https://aws.amazon.com/ebs/ 来存储数据和事务日志。新的多可用区数据库集群实例使用实例提供的本地存储来存储事务日志。本地存储经过优化,可为应用程序提供低延迟,并提高每秒输入/输出操作数 (IOPS)。写入操作将首先写入本地存储事务日志,然后刷新到数据库存储卷上的永久存储。


其次,故障转移操作通常会比多可用区数据库实例场景中更快的速度执行。由新的多可用区数据库集群创建的只读副本是成熟的数据库实例。该系统的故障转移用时最长不超过 35 秒,另外还需加上应用任何待处理事务日志的时间。如果发生故障转移,系统将完全自动升级新的主节点,并将原有主节点重新配置为新的读取器实例。


第三,两个备用实例是热备用实例。您的应用程序可以使用集群读取器终端节点将其读取请求 (SELECT) 发送到这些备用实例。它允许您的应用程序在数据库集群的实例之间平均分配数据库读取负载。


最后,利用本地存储处理事务日志可以优化复制操作。现有的多可用区数据库实例会在存储级别复制所有更改。新的多可用区数据库集群仅复制事务日志,并使用仲裁机制来确认至少有一个备用实例认可了更改。当其中一个辅助实例确认事务日志已写入其本地磁盘时,数据库事务将同步提交。


迁移现有数据库

对于那些拥有现有 Amazon RDS 数据库并愿意利用这一新的多可用区数据库集群部署选项的用户,您可以拍摄数据库快照 https://docs.aws.amazon.com/en_us/AmazonRDS/latest/UserGuide/USER_CreateSnapshot.html,以创建现有数据库实例的存储级备份。快照准备就绪后,您可以根据此快照使用多可用区数据库集群部署选项创建新的数据库集群。您的新多可用区数据库集群将是现有数据库的完美副本。



我们来看看它的实际操作

首先,我将浏览器指向 Amazon 管理控制台 https://console.aws.amazon.com/  并导航到 Amazon RDS。多可用区数据库集群部署选项适用于 MySQL 8.0.28 或更高版本以及 PostgreSQL 版本 13.4 R1 和 13.5 R1。我选择任一数据库引擎,并确保版本符合最低要求。该过程的其余部分与标准 Amazon RDS 数据库启动程序相同。

在 Deployment options(部署选项)下,我选择 PostgreSQL,版本 13.4 R1,在Availability and Durability(可用性和持久性)下,选择 Multi-AZ DB cluster(多可用区数据库集群)。


全新 Amazon RDS for MySQL 和 PostgreSQL 多可用区 (Multi-AZ) 部署选项


如有需要,我还可以选择 Amazon RDS 用于集群的可用区集。为此,我创建了一个数据库子网组 https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_VPC.WorkingWithRDSInstanceinaVPC.html#USER_VPC.Subnets  并将集群分配给该子网组。

启动后,我会验证是否已创建了三个数据库实例。我还注意到 Amazon RDS 提供了两个端点:两个可读备用实例的主端点和一个负载均衡端点。


全新 Amazon RDS for MySQL 和 PostgreSQL 多可用区 (Multi-AZ) 部署选项


为了测试新集群,我在数据库所在同一安全组中的同一 VPC 中创建了一个 Amazon Linux 2 EC2 实例,并确保我附加了一个包含 AmazonSSMManagedInstanceCore https://console.aws.amazon.com/iam/home#/policies/arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore$jsonEditor  托管策略的 IAM 角色。这让我能够使用 SSM 而非 SSH 连接实例 https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/session-manager.html 。

实例启动后,我将使用 SSM 连接到实例。我安装了 PostgreSQL 客户端工具。


sudo amazon-linux-extras enable postgresql13
sudo yum clean metadata
sudo yum install postgresql

*左滑查看更多


我连接到主数据库。我创建了一个表并插入一条记录。


psql -h awsnewsblog.cluster-c1234567890r.us-east-1.rds.amazonaws.com -U postgres

postgres=> create table awsnewsblogdemo (id int primary key, name varchar);
CREATE TABLE

postgres=> insert into awsnewsblogdemo (id,name) values (1, 'seb');
INSERT 0 1

postgres=> exit

*左滑查看更多


为了验证复制是否按预期工作,我会连接到只读副本。请注意端点名称中的-ro-。我检查了表结构并输入 SELECT 语句以确认数据已被复制。


psql -h awsnewsblog.cluster-ro-c1234567890r.us-east-1.rds.amazonaws.com -U postgres

postgres=> \dt

              List of relations
 Schema |      Name       | Type  |  Owner
--------+-----------------+-------+----------
 public | awsnewsblogdemo | table | postgres
(1 row)

postgres=> select * from awsnewsblogdemo;
 id | name
----+------
  1 | seb
(1 row)

postgres=> exit

*左滑查看更多


在故障转移的情况下,应用程序将断开与主数据库实例的连接。在这种情况下,应用程序级代码尝试重新建立网络连接非常重要。短时间过后,端点的 DNS 名称将指向备用实例,您的应用程序将能够重新连接。


要了解有关多可用区数据库集群的更多信息,请参阅我们的文档 https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/multi-az-db-clusters-concepts.html


定价和可用性

具有两个可读备用副本的 Amazon RDS 多可用区部署通常在以下区域提供:美国东部(弗吉尼亚北部)、美国西部(俄勒冈)和欧洲(爱尔兰)。我们将在此列表中添加更多区域。

您可以在 MySQL 8.0.28 或更高版本以及 PostgreSQL 版本 13.4 R1 或 13.5 R1 中使用它。

定价取决于实例类型。在美国区域,M6gd 实例的按需定价起价为每小时 0.522 美元,R6gd 实例的按需定价为每小时 0.722 美元。与往常一样,Amazon RDS 定价页面包含 MySQL https://aws.amazon.com/rds/mysql/pricing/?pg=pr&loc=2  和 PostgreSQL https://aws.amazon.com/rds/postgresql/pricing/?pg=pr&loc=3  的详细信息。

您可以立即开始使用。


本篇作者


全新 Amazon RDS for MySQL 和 PostgreSQL 多可用区 (Multi-AZ) 部署选项

Sébastien Stormacq

自从在八十年代中期首次接触 Commodore 64 以来,Seb 一直在编写代码。他激励构建人员,利用自己的激情、热心、以客户为中心的态度、好奇心和创造力,发掘亚马逊云科技云的价值。他的兴趣包括软件架构、开发工具和移动计算。


全新 Amazon RDS for MySQL 和 PostgreSQL 多可用区 (Multi-AZ) 部署选项

扫描上方二维码即刻注册

全新 Amazon RDS for MySQL 和 PostgreSQL 多可用区 (Multi-AZ) 部署选项

听说,点完下面4个按钮

就不会碰到bug了!