使用 DR Orchestrator Framework 自動化跨區域容錯移轉和容錯回復 - AWS 方案指引

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

使用 DR Orchestrator Framework 自動化跨區域容錯移轉和容錯回復

由 Jitendra Kumar (AWS)、Oliver Francis (AWS) 和 Pavithra Balasubramanian (AWS) 建立

Summary

此模式說明如何使用 DR Orchestrator Framework 協調和自動化手動、容易出錯的步驟,以跨 Amazon Web Services (AWS) 區域執行災難復原。模式涵蓋下列資料庫:

  • MySQL 的 Amazon Relational Database Service (Amazon RDS)、PostgreSQL 的 Amazon RDS 或 Amazon RDS for MariaDB

  • Amazon Aurora MySQL 相容版本或 Amazon Aurora PostgreSQL 相容版本 (使用集中式檔案)

  • Amazon ElastiCache (Redis OSS)

若要示範 DR Orchestrator Framework 的功能,您可以建立兩個資料庫執行個體或叢集。主要 位於 AWS 區域 us-east-1,次要 位於 us-west-2。若要建立這些資源,您可以使用 aws-cross-region-dr-databases GitHub 儲存庫的 App-Stack 資料夾中的 AWS CloudFormation 範本。

先決條件和限制

一般先決條件

引擎特定的先決條件

  • Amazon Aurora – 至少必須有兩個可用的 Aurora 全域資料庫 AWS 區域。您可以使用 us-east-1做為主要區域,並使用 us-west-2做為次要區域。

  • Amazon ElastiCache (Redis OSS) – ElastiCache 全域資料存放區必須提供兩種。 AWS 區域您可以use us-east-1做為主要區域,並使用 us-west-2做為次要區域。

Amazon RDS 限制

  • DR Orchestrator Framework 在執行容錯移轉或容錯回復之前,不會檢查複寫延遲。必須手動檢查複寫延遲。

  • 此解決方案已使用具有一個僅供讀取複本的主要資料庫執行個體進行測試。如果您想要使用多個僅供讀取複本,請在生產環境中實作解決方案之前,先徹底測試解決方案。

Aurora 限制

  • 功能可用性和支援會因每個資料庫引擎的特定版本和不同版本而有所不同 AWS 區域。如需跨區域複寫功能和區域可用性的詳細資訊,請參閱跨區域僅供讀取複本

  • Aurora 全域資料庫具有支援 Aurora 資料庫執行個體類別的特定組態需求,以及最大數量 AWS 區域。如需詳細資訊,請參閱 Amazon Aurora 全域資料庫的組態需求

  • 此解決方案已使用具有一個僅供讀取複本的主要資料庫執行個體進行測試。如果您想要使用多個僅供讀取複本,請在生產環境中實作解決方案之前,先徹底測試解決方案。

ElastiCache 限制

  • 如需全域資料存放區和 ElastiCache 組態需求的區域可用性資訊,請參閱 ElastiCache 文件中的先決條件和限制

Amazon RDS product 版本

Amazon RDS 支援下列引擎版本:

  • MySQL – Amazon RDS 支援執行下列 MySQL 版本的資料庫執行個體:MySQL 8.0 和 MySQL 5.7

  • PostgreSQL – 如需有關 Amazon RDS for PostgreSQL 支援版本的資訊,請參閱可用的 PostgreSQL 資料庫版本

  • MariaDB – Amazon RDS 支援執行下列 MariaDB 版本的資料庫執行個體:

    • MariaDB 10.11

    • MariaDB 10.6

    • MariaDB 10.5

Aurora 產品版本

ElastiCache (Redis OSS) 產品版本

Amazon ElastiCache (Redis OSS) 支援下列 Redis 版本:

  • Redis 7.1 (增強版)

  • Redis 7.0 (增強版)

  • Redis 6.2 (增強版)

  • Redis 6.0 (增強版)

  • Redis 5.0.6 (增強版)

如需詳細資訊,請參閱支援的 ElastiCache (Redis OSS) 版本

架構

Amazon RDS 架構

Amazon RDS 架構包含下列資源:

  • 在主要區域 (us-east-1) 中建立的主要 Amazon RDS 資料庫執行個體,具有用戶端的讀取/寫入存取權

  • 在次要區域 (us-west-2) 中建立的 Amazon RDS 僅供讀取複本,具有用戶端的唯讀存取權

  • 部署在主要和次要區域的 DR Orchestrator Framework

單一 AWS 帳戶中雙區域 RDS 架構的圖表。

上圖顯示以下項目:

  1. 主要執行個體與次要執行個體之間的非同步複寫

  2. 主要區域中用戶端的讀取/寫入存取權

  3. 次要區域中用戶端的唯讀存取

Aurora 架構

Amazon Aurora 架構包含下列資源:

  • 在具有作用中寫入器端點的主要區域 (us-east-1) 中建立的主要 Aurora 資料庫叢集

  • 在次要區域 (us-west-2) 中建立且具有非作用中寫入器端點的 Aurora 資料庫叢集

  • 部署在主要和次要區域的 DR Orchestrator Framework

單一 AWS 帳戶中雙區域 Aurora 部署的圖表。

上圖顯示以下項目:

  1. 主要叢集與次要叢集之間的非同步複寫

  2. 具有主動寫入器端點的主要資料庫叢集

  3. 具有非作用中寫入器端點的次要資料庫叢集

ElastiCache (Redis OSS) 架構

Amazon ElastiCache (Redis OSS) 架構包含下列資源:

  • 使用兩個叢集建立的 ElastiCache (Redis OSS) 全域資料存放區:

    1. 主要區域中的主要叢集 (us-east-1)

    2. 次要區域中的次要叢集 (us-west-2)

  • 兩個叢集之間具有 TLS 1.2 加密的 Amazon 跨區域連結

  • 部署在主要和次要區域的 DR Orchestrator Framework

使用 Amazon 跨區域連結的雙區域 ElastiCache 部署圖表。

自動化和擴展

DR Orchestrator Framework 可擴展,並支援平行容錯移轉或容錯回復多個 AWS 資料庫。

您可以使用下列承載程式碼容錯移轉您帳戶中的多個 AWS 資料庫。在此範例中,三個 AWS 資料庫 (兩個全域資料庫,例如 Aurora MySQL 相容或 Aurora PostgreSQL 相容,以及一個 Amazon RDS for MySQL 執行個體) 容錯移轉至 DR 區域:

{ "StatePayload": [ { "layer": 1, "resources": [ { "resourceType": "PlannedFailoverAurora", "resourceName": "Switchover (planned failover) of Amazon Aurora global databases (MySQL)", "parameters": { "GlobalClusterIdentifier": "!Import dr-globaldb-cluster-mysql-global-identifier", "DBClusterIdentifier": "!Import dr-globaldb-cluster-mysql-cluster-identifier" } }, { "resourceType": "PlannedFailoverAurora", "resourceName": "Switchover (planned failover) of Amazon Aurora global databases (PostgreSQL)", "parameters": { "GlobalClusterIdentifier": "!Import dr-globaldb-cluster-postgres-global-identifier", "DBClusterIdentifier": "!Import dr-globaldb-cluster-postgres-cluster-identifier" } }, { "resourceType": "PromoteRDSReadReplica", "resourceName": "Promote RDS for MySQL Read Replica", "parameters": { "RDSInstanceIdentifier": "!Import rds-mysql-instance-identifier", "TargetClusterIdentifier": "!Import rds-mysql-instance-global-arn" } } ] } ] }

工具

AWS 服務

  • Amazon Aurora 是一種全受管關聯式資料庫引擎,專為雲端而建置,並與 MySQL 和 PostgreSQL 相容。

  • Amazon ElastiCache 可協助您在 中設定、管理和擴展分散式記憶體內快取環境 AWS 雲端。此模式使用 Amazon ElastiCache (Redis OSS)。

  • AWS Lambda 是一項運算服務,可協助您執行程式碼,無需佈建或管理伺服器。它只會在需要時執行程式碼並自動擴展,因此您只需按使用的運算時間付費。在此模式中,Lambda 函數由 AWS Step Functions 用來執行步驟。

  • Amazon Relational Database Service (Amazon RDS) 可協助您在 中設定、操作和擴展關聯式資料庫 AWS 雲端。此模式支援 Amazon RDS for MySQL、Amazon RDS for PostgreSQL 和 Amazon RDS for MariaDB。

  • 適用於 Python (Boto3) 的 AWS SDK 可協助您整合 Python 應用程式、程式庫或指令碼 AWS 服務。在此模式中,Boto3 APIs用於與資料庫執行個體或全域資料庫通訊。

  • AWS Step Functions 是一種無伺服器協同運作服務,可協助您結合 AWS Lambda 函數和其他 AWS 服務 來建置業務關鍵型應用程式。在此模式中,Step Functions 狀態機器用於協調和執行資料庫執行個體或全域資料庫的跨區域容錯移轉和容錯回復。

程式碼儲存庫

此模式的程式碼可在 GitHub 上的 aws-cross-region-dr-databases 儲存庫中使用。

史詩

任務描述所需的技能

複製 GitHub 儲存庫。

若要複製儲存庫,請執行下列命令:

git clone https://github.com/aws-samples/aws-cross-region-dr-databases.git
AWS DevOps、AWS 管理員

在 .zip 檔案封存中封裝 Lambda 函數程式碼。

建立 Lambda 函數的封存檔案,以包含 DR Orchestrator Framework 相依性:

cd <YOUR-LOCAL-GIT-FOLDER>/DR-Orchestration-artifacts bash scripts/deploy-orchestrator-sh.sh
AWS 管理員

建立 S3 儲存貯體。

需要 S3 儲存貯體來存放 DR Orchestrator Framework 以及您的最新組態。建立兩個 S3 儲存貯體,一個位於主要區域 (us-east-1),另一個位於次要區域 (us-west-2):

  • dr-orchestrator-xxxxxx-us-east-1

  • dr-orchestrator-xxxxxx-us-west-2

xxxxxx 以隨機值取代 ,讓儲存貯體名稱是唯一的。

AWS 管理員

建立子網路和安全群組。

在主要區域 (us-east-1) 和次要區域 (us-west-2) 中,為您的 VPC 中的 Lambda 函數部署建立兩個子網路和一個安全群組:

  • subnet-XXXXXXX

  • subnet-YYYYYYY

  • sg-XXXXXXXXXXXX

AWS 管理員

更新 DR Orchestrator 參數檔案。

<YOUR-LOCAL-GIT-FOLDER>/DR-Orchestration-artifacts/cloudformation資料夾中,更新下列 DR Orchestrator 參數檔案:

  • Orchestrator-Deployer-parameters-us-east-1.json

  • Orchestrator-Deployer-parameters-us-west-2.json

使用以下參數值,yx和 取代為您的資源名稱:

[ { "ParameterKey": "TemplateStoreS3BucketName", "ParameterValue": "dr-orchestrator-xxxxxx-us-east-1" }, { "ParameterKey": "TemplateVPCId", "ParameterValue": "vpc-xxxxxx" }, { "ParameterKey": "TemplateLambdaSubnetID1", "ParameterValue": "subnet-xxxxxx" }, { "ParameterKey": "TemplateLambdaSubnetID2", "ParameterValue": "subnet-yyyyyy" }, { "ParameterKey": "TemplateLambdaSecurityGroupID", "ParameterValue": "sg-xxxxxxxxxx" } ]
AWS 管理員

將 DR Orchestrator Framework 程式碼上傳至 S3 儲存貯體。

S3 儲存貯體的程式碼會比本機目錄更安全。將DR-Orchestration-artifacts目錄,包括所有檔案和子資料夾,上傳至 S3 儲存貯體。

若要上傳程式碼,請執行下列動作:

  1. 登入 AWS Management Console。

  2. 導覽至 Amazon S3 主控台。

  3. 選取dr-orchestrator-xxxxxx-us-east-1 bucket

  4. 選擇上傳,然後選擇新增資料夾

  5. 選取 DR-Orchestration-artifacts 資料夾。

  6. 選擇上傳

  7. 選取儲存dr-orchestrator-xxxxxx-us-west-2貯體。

  8. 重複步驟 4–7。

AWS 管理員

在主要區域中部署 DR Orchestrator Framework。

若要在主要區域 (us-east-1) 中部署 DR Orchestrator Framework,請執行下列命令:

cd <YOUR-LOCAL-GIT-FOLDER>/DR-Orchestration-artifacts/cloudformation aws cloudformation deploy \ --region us-east-1 \ --stack-name dr-orchestrator \ --template-file Orchestrator-Deployer.yaml \ --parameter-overrides file://Orchestrator-Deployer-parameters-us-east-1.json \ --capabilities CAPABILITY_AUTO_EXPAND CAPABILITY_NAMED_IAM CAPABILITY_IAM \ --disable-rollback
AWS 管理員

在次要區域中部署 DR Orchestrator Framework。

在次要區域 (us-west-2) 中,執行下列命令:

cd <YOUR-LOCAL-GIT-FOLDER>/DR-Orchestration-artifacts/cloudformation aws cloudformation deploy \ --region us-west-2 \ --stack-name dr-orchestrator \ --template-file Orchestrator-Deployer.yaml \ --parameter-overrides file://Orchestrator-Deployer-parameters-us-west-2.json \ --capabilities CAPABILITY_AUTO_EXPAND CAPABILITY_NAMED_IAM CAPABILITY_IAM \ --disable-rollback
AWS 管理員

驗證部署。

如果 AWS CloudFormation 命令成功執行,則會傳回下列輸出:

Successfully created/updated stack - dr-orchestrator

或者,您可以導覽至 AWS CloudFormation 主控台並驗證dr-orchestrator堆疊的狀態。

AWS 管理員
任務描述所需的技能

建立資料庫子網路和安全群組。

在 VPC 中,為主要 (us-east-1) 和次要 (us-west-2) 區域中的資料庫執行個體或全域資料庫建立兩個子網路和一個安全群組:

  • subnet-XXXXXX

  • subnet-XXXXXX

  • sg-XXXXXXXXXX

AWS 管理員

更新主要資料庫執行個體或叢集的參數檔案。

<YOUR LOCAL GIT FOLDER>/App-Stack資料夾中,更新主要區域的參數檔案。

Amazon RDS

RDS-MySQL-parameter-us-east-1.json 檔案中,DBSecurityGroup使用您建立的資源名稱更新 SubnetIds和 :

{ "Parameters": { "SubnetIds": "subnet-xxxxxx,subnet-xxxxxx", "DBSecurityGroup": "sg-xxxxxxxxxx", "MySqlGlobalIdentifier":"rds-mysql-instance", "InitialDatabaseName": "mysqldb", "DBPortNumber": "3789", "PrimaryRegion": "us-east-1", "SecondaryRegion": "us-west-2", "KMSKeyAliasName": "rds/rds-mysql-instance-KmsKeyId" } }

Amazon Aurora

Aurora-MySQL-parameter-us-east-1.json 檔案中,DBSecurityGroup使用您建立的資源名稱更新 SubnetIds和 :

{ "Parameters": { "SubnetIds": "subnet1-xxxxxx,subnet2-xxxxxx", "DBSecurityGroup": "sg-xxxxxxxxxx", "GlobalClusterIdentifier":"dr-globaldb-cluster-mysql", "DBClusterName":"dbcluster-01", "SourceDBClusterName":"dbcluster-02", "DBPortNumber": "3787", "DBInstanceClass":"db.r5.large", "InitialDatabaseName": "sampledb", "PrimaryRegion": "us-east-1", "SecondaryRegion": "us-west-2", "KMSKeyAliasName": "rds/dr-globaldb-cluster-mysql-KmsKeyId" } }

Amazon ElastiCache (Redis OSS)

ElastiCache-parameter-us-east-1.json 檔案中,DBSecurityGroup使用您建立的資源名稱更新 SubnetIds和 。

{ "Parameters": { "CacheNodeType": "cache.m5.large", "DBSecurityGroup": "sg-xxxxxxxxxx", "SubnetIds": "subnet-xxxxxx,subnet-xxxxxx", "EngineVersion": "5.0.6", "GlobalReplicationGroupIdSuffix": "demo-redis-global-datastore", "NumReplicas": "1", "NumShards": "1", "ReplicationGroupId": "demo-redis-cluster", "DBPortNumber": "3788", "TransitEncryption": "true", "KMSKeyAliasName": "elasticache/demo-redis-global-datastore-KmsKeyId", "PrimaryRegion": "us-east-1", "SecondaryRegion": "us-west-2" } }
AWS 管理員

在主要區域中部署資料庫執行個體或叢集。

若要在主要區域 (us-east-1) 中部署執行個體或叢集,請根據您的資料庫引擎執行下列命令。

Amazon RDS

cd <YOUR-LOCAL-GIT-FOLDER>/App-Stack aws cloudformation deploy \ --region us-east-1 \ --stack-name rds-mysql-app-stack \ --template-file RDS-MySQL-Primary.yaml \ --parameter-overrides file://RDS-MySQL-parameter-us-east-1.json \ --capabilities CAPABILITY_AUTO_EXPAND CAPABILITY_NAMED_IAM CAPABILITY_IAM \ --disable-rollback

Amazon Aurora

cd <YOUR-LOCAL-GIT-FOLDER>/App-Stack aws cloudformation deploy \ --region us-east-1 \ --stack-name aurora-mysql-app-stack \ --template-file Aurora-MySQL-Primary.yaml \ --parameter-overrides file://Aurora-MySQL-parameter-us-east-1.json \ --capabilities CAPABILITY_AUTO_EXPAND CAPABILITY_NAMED_IAM CAPABILITY_IAM \ --disable-rollback

Amazon ElastiCache (Redis OSS)

cd <YOUR-LOCAL-GIT-FOLDER>/App-Stack aws cloudformation deploy \ --region us-east-1 --stack-name elasticache-ds-app-stack \ --template-file ElastiCache-Primary.yaml \ --parameter-overrides file://ElastiCache-parameter-us-east-1.json \ --capabilities CAPABILITY_AUTO_EXPAND CAPABILITY_NAMED_IAM CAPABILITY_IAM \ --disable-rollback

確認 AWS CloudFormation 資源已成功部署。

AWS 管理員

更新次要資料庫執行個體或叢集的參數檔案。

<YOUR LOCAL GIT FOLDER>/App-Stack資料夾中,更新次要區域的 參數檔案。

Amazon RDS

RDS-MySQL-parameter-us-west-2.json 檔案中,DBSecurityGroup使用您建立的資源名稱更新 SubnetIDs和 。PrimaryRegionKMSKeyArn 使用從主要資料庫執行個體 AWS CloudFormation 堆疊的輸出區段MySQLKmsKeyId取得的值更新 :

{ "Parameters": { "SubnetIds": "subnet-aaaaaaaaa,subnet-bbbbbbbbb", "DBSecurityGroup": "sg-cccccccccc", "MySqlGlobalIdentifier":"rds-mysql-instance", "InitialDatabaseName": "mysqldb", "DBPortNumber": "3789", "PrimaryRegion": "us-east-1", "SecondaryRegion": "us-west-2", "KMSKeyAliasName": "rds/rds-mysql-instance-KmsKeyId", "PrimaryRegionKMSKeyArn":"arn:aws:kms:us-east-1:xxxxxxxxx:key/mrk-xxxxxxxxxxxxxxxxxxxxx" } }

Amazon Aurora

Aurora-MySQL-parameter-us-west-2.json 檔案中,DBSecurityGroup使用您建立的資源名稱更新 SubnetIDs和 。PrimaryRegionKMSKeyArn 使用從主要資料庫執行個體 AWS CloudFormation 堆疊的輸出區段AuroraKmsKeyId取得的值更新 :

{ "Parameters": { "SubnetIds": "subnet1-aaaaaaaaa,subnet2-bbbbbbbbb", "DBSecurityGroup": "sg-cccccccccc", "GlobalClusterIdentifier":"dr-globaldb-cluster-mysql", "DBClusterName":"dbcluster-01", "SourceDBClusterName":"dbcluster-02", "DBPortNumber": "3787", "DBInstanceClass":"db.r5.large", "InitialDatabaseName": "sampledb", "PrimaryRegion": "us-east-1", "SecondaryRegion": "us-west-2", "KMSKeyAliasName": "rds/dr-globaldb-cluster-mysql-KmsKeyId" } }

Amazon ElastiCache (Redis OSS)

ElastiCache-parameter-us-west-2.json 檔案中,DBSecurityGroup使用您建立的資源名稱更新 SubnetIDs和 。PrimaryRegionKMSKeyArn 使用從 AWS CloudFormation 主要資料庫執行個體堆疊的輸出區段ElastiCacheKmsKeyId取得的 值來更新 :

{ "Parameters": { "CacheNodeType": "cache.m5.large", "DBSecurityGroup": "sg-cccccccccc", "SubnetIds": "subnet-aaaaaaaaa,subnet-bbbbbbbbb", "EngineVersion": "5.0.6", "GlobalReplicationGroupIdSuffix": "demo-redis-global-datastore", "NumReplicas": "1", "NumShards": "1", "ReplicationGroupId": "demo-redis-cluster", "DBPortNumber": "3788", "TransitEncryption": "true", "KMSKeyAliasName": "elasticache/demo-redis-global-datastore-KmsKeyId", "PrimaryRegion": "us-east-1", "SecondaryRegion": "us-west-2" } }
AWS 管理員

在次要區域中部署資料庫執行個體或叢集。

根據您的資料庫引擎執行下列命令。

Amazon RDS

cd <YOUR-LOCAL-GIT-FOLDER>/App-Stack aws cloudformation deploy \ --region us-west-2 \ --stack-name rds-mysql-app-stack \ --template-file RDS-MySQL-DR.yaml \ --parameter-overrides file://RDS-MySQL-parameter-us-west-2.json \ --capabilities CAPABILITY_AUTO_EXPAND CAPABILITY_NAMED_IAM CAPABILITY_IAM \ --disable-rollback

Amazon Aurora

cd <YOUR-LOCAL-GIT-FOLDER>/App-Stack aws cloudformation deploy \ --region us-west-2 \ --stack-name aurora-mysql-app-stack \ --template-file Aurora-MySQL-DR.yaml \ --parameter-overrides file://Aurora-MySQL-parameter-us-west-2.json \ --capabilities CAPABILITY_AUTO_EXPAND CAPABILITY_NAMED_IAM CAPABILITY_IAM \ --disable-rollback

Amazon ElastiCache (Redis OSS)

cd <YOUR-LOCAL-GIT-FOLDER>/App-Stack aws cloudformation deploy \ --region us-west-2 \ --stack-name elasticache-ds-app-stack \ --template-file ElastiCache-DR.yaml \ --parameter-overrides file://ElastiCache-parameter-us-west-2.json \ --capabilities CAPABILITY_AUTO_EXPAND CAPABILITY_NAMED_IAM CAPABILITY_IAM \ --disable-rollback

確認 AWS CloudFormation 資源已成功部署。

AWS 管理員

相關資源