本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
使用 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 RDS 限制
Aurora 限制
功能可用性和支援會因每個資料庫引擎的特定版本和不同版本而有所不同 AWS 區域。如需跨區域複寫功能和區域可用性的詳細資訊,請參閱跨區域僅供讀取複本。
Aurora 全域資料庫具有支援 Aurora 資料庫執行個體類別的特定組態需求,以及最大數量 AWS 區域。如需詳細資訊,請參閱 Amazon Aurora 全域資料庫的組態需求。
此解決方案已使用具有一個僅供讀取複本的主要資料庫執行個體進行測試。如果您想要使用多個僅供讀取複本,請在生產環境中實作解決方案之前,先徹底測試解決方案。
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
上圖顯示以下項目:
主要執行個體與次要執行個體之間的非同步複寫
主要區域中用戶端的讀取/寫入存取權
次要區域中用戶端的唯讀存取
Aurora 架構
Amazon Aurora 架構包含下列資源:
在具有作用中寫入器端點的主要區域 (us-east-1
) 中建立的主要 Aurora 資料庫叢集
在次要區域 (us-west-2
) 中建立且具有非作用中寫入器端點的 Aurora 資料庫叢集
部署在主要和次要區域的 DR Orchestrator Framework
上圖顯示以下項目:
主要叢集與次要叢集之間的非同步複寫
具有主動寫入器端點的主要資料庫叢集
具有非作用中寫入器端點的次要資料庫叢集
ElastiCache (Redis OSS) 架構
Amazon ElastiCache (Redis OSS) 架構包含下列資源:
使用兩個叢集建立的 ElastiCache (Redis OSS) 全域資料存放區:
主要區域中的主要叢集 (us-east-1
)
次要區域中的次要叢集 (us-west-2
)
兩個叢集之間具有 TLS 1.2 加密的 Amazon 跨區域連結
部署在主要和次要區域的 DR Orchestrator Framework
自動化和擴展
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 服務
程式碼儲存庫
此模式的程式碼可在 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 ): 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 參數檔案: 使用以下參數值,y 將 x 和 取代為您的資源名稱: [
{
"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 儲存貯體。 若要上傳程式碼,請執行下列動作: 登入 AWS Management Console。 導覽至 Amazon S3 主控台。 選取dr-orchestrator-xxxxxx-us-east-1 bucket 。 選擇上傳,然後選擇新增資料夾。 選取 DR-Orchestration-artifacts 資料夾。 選擇上傳。 選取儲存dr-orchestrator-xxxxxx-us-west-2 貯體。 重複步驟 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 管理員 |
相關資源