Multi-AZ DB Instance Failover

Amazon RDS 多可用区实例部署为 RDS实例提供了增强的可用性和持久性。当我们配置多可用区 DB 实例时,Amazon RDS 会自动创建一个主 DB 实例,并将数据同步复制到另一个可用区(AZ)中的备用实例。每个可用区都在自己的物理上独立、独立的基础设施上运行,并经过高度可靠的设计。如果发生基础设施故障,Amazon RDS 会自动进行故障转移到备用实例,以便我们可以在故障转移完成后立即恢复数据库操作。由于我们的 DB 实例的端点在故障转移后保持不变,因此我们的应用程序可以在无需手动管理干预的情况下恢复数据库操作。更多详细信息可以在这里 查看。

在第一节我们创建RDS数据库时,选择了Multi-AZ DB Instance的方式。除了创建primary库,还会创建一个standby库,这个standby库平时不抗流量,仅在primary库发生故障时自动failover, 而且failover后endpiont不变,程序自动连接无需手动干预:

image-20231105071151998

本节我们就介绍Multi-AZ DB Instance的Failover。RDS 为客户提供了一个选项来模拟可用区故障,方法是提供Failover选项,重新启动 Postgres 实例。 此选项将启动实例的AZ级别failover,辅助可用区上的stand by实例将成为primary,而primary所在可用区上的实例将成为新的stand by实例。

首先在Configuration中确认RDS已经开启Multi-AZ,可以看到standby节点是在us-west-2a,和primary分布在不同的AZ:

image-20231104145817534

当然也可以用CLI来确认是否开启multi-az:

AWSREGION=`aws configure get region`

aws rds describe-db-instances \
	--db-instance-identifier rds-pg-labs \
	--query 'DBInstances[].MultiAZ' \
	--output text \
	--region $AWSREGION

连接到数据库

在Cloud 9终端窗口中,输入并运行以下命令, 每隔 10 秒展示一次与数据库的连接:

while true;
do
psql pglab -c 'select now() ,inet_server_addr(), pg_postmaster_start_time() '; 
echo -e "\n\n"
sleep 10
done

image-20231104150017043

为Failover 事件创建事件订阅

为了及时收到failover事件,RDS支持事件订阅。在控制台上点击Create event subscription

image-20231104150104995

提前创建好一个SNS主题,以邮件方式接收事件通知:

image-20231104150611418

Source选择rds-pg-labs实例,事件类型选择failover:

image-20231104150233763

最后点击创建事件订阅

执行failover

RDS 为客户提供了一个选项来模拟可用区故障,方法是提供Failover选项来重新启动 Postgres 实例。 此选项将启动实例的AZ级别failover,辅助可用区上的stand by实例将成为primary,而primary所在可用区上的实例将成为新的stand by实例。

在RDS控制台,选中rds-pg-labs数据库,点击Reboot

image-20231104150740701

选择Reboot With Failover并确认重启:

image-20231104150755397

在RDS的Log & events页面,也能看到failover的事件:

image-20231104151338204

在Cloud 9的控制台上,能看到中间连接的数据库的IP发生了变化,并在数据库发生failover时有连接不上的提示:

image-20231104151423333

同时也会收到几封邮件,分别代表开始发生failover以及完成failover过程:

image-20231104151547456