RDS 高可用性概述
Amazon RDS (Relational Database Service) 提供兩種主要機制來提升資料庫的可用性與效能:Multi-AZ 部署和讀取複本 (Read Replicas)。這兩種機制各有不同的用途和特性,理解它們的差異對於設計高可用性的資料庫架構至關重要。
- Multi-AZ:主要用於災難復原和高可用性,提供自動故障轉移功能
- 讀取複本:主要用於擴展讀取效能,將讀取流量分散到多個複本
Multi-AZ 部署架構
Multi-AZ 部署會在不同的可用區域 (Availability Zone) 中建立一個待命複本 (Standby Replica)。主要特點如下:
- 同步複寫:主資料庫的所有變更會同步複寫到待命複本
- 自動故障轉移:當主資料庫發生故障時,自動切換到待命複本
- 單一端點:應用程式使用相同的 DNS 端點,無需變更連線設定
- 資料一致性:待命複本與主資料庫保持完全同步
架構圖
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| ┌─────────────────────────────────────────────────────────────┐
│ AWS Region │
│ ┌──────────────────┐ ┌──────────────────┐ │
│ │ Availability │ │ Availability │ │
│ │ Zone A │ │ Zone B │ │
│ │ │ │ │ │
│ │ ┌───────────┐ │ 同步 │ ┌───────────┐ │ │
│ │ │ Primary │───┼────────►│ │ Standby │ │ │
│ │ │ DB │ │ 複寫 │ │ DB │ │ │
│ │ └───────────┘ │ │ └───────────┘ │ │
│ │ │ │ │ │
│ └──────────────────┘ └──────────────────┘ │
│ │
│ ▲ │
│ │ DNS Endpoint │
│ │ │
│ ┌──────┴──────┐ │
│ │ Application │ │
│ └─────────────┘ │
└─────────────────────────────────────────────────────────────┘
|
啟用 Multi-AZ
建立新的 Multi-AZ RDS 執行個體
使用 AWS CLI 建立啟用 Multi-AZ 的 RDS 執行個體:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| # 建立啟用 Multi-AZ 的 MySQL 執行個體
aws rds create-db-instance \
--db-instance-identifier mydb-production \
--db-instance-class db.r5.large \
--engine mysql \
--engine-version 8.0.35 \
--master-username admin \
--master-user-password MySecurePassword123! \
--allocated-storage 100 \
--storage-type gp3 \
--multi-az \
--vpc-security-group-ids sg-0123456789abcdef0 \
--db-subnet-group-name my-db-subnet-group \
--backup-retention-period 7 \
--preferred-backup-window "03:00-04:00" \
--preferred-maintenance-window "Mon:04:00-Mon:05:00"
|
將現有執行個體轉換為 Multi-AZ
1
2
3
4
5
6
7
8
9
10
| # 修改現有 RDS 執行個體以啟用 Multi-AZ
aws rds modify-db-instance \
--db-instance-identifier mydb-production \
--multi-az \
--apply-immediately
# 查看 Multi-AZ 狀態
aws rds describe-db-instances \
--db-instance-identifier mydb-production \
--query 'DBInstances[0].{MultiAZ:MultiAZ,SecondaryAZ:SecondaryAvailabilityZone}'
|
故障轉移機制
Multi-AZ 會在以下情況自動觸發故障轉移:
- 主資料庫執行個體故障
- 可用區域中斷
- 執行個體類型變更
- 資料庫軟體修補
- 手動觸發故障轉移
手動觸發故障轉移
1
2
3
4
5
6
7
8
9
10
11
| # 手動觸發故障轉移(用於測試)
aws rds reboot-db-instance \
--db-instance-identifier mydb-production \
--force-failover
# 查看故障轉移事件
aws rds describe-events \
--source-identifier mydb-production \
--source-type db-instance \
--duration 60 \
--query 'Events[?contains(Message, `failover`)]'
|
監控故障轉移
1
2
3
4
5
6
7
| # 設定故障轉移通知
aws rds create-event-subscription \
--subscription-name rds-failover-alerts \
--sns-topic-arn arn:aws:sns:ap-northeast-1:123456789012:rds-alerts \
--source-type db-instance \
--source-ids mydb-production \
--event-categories "failover" "failure" "recovery"
|
讀取複本概述
讀取複本是主資料庫的非同步複製副本,主要用於:
- 擴展讀取效能:將讀取查詢分散到多個複本
- 報表查詢:在複本上執行複雜的報表查詢,不影響主資料庫效能
- 災難復原:可將讀取複本提升為獨立的主資料庫
讀取複本特性
| 特性 | 說明 |
|---|
| 複寫方式 | 非同步 |
| 複本數量 | 最多 15 個(Aurora)或 5 個(其他引擎) |
| 跨區域支援 | 支援 |
| 可讀取 | 是 |
| 自動故障轉移 | 否(需手動提升) |
建立讀取複本
在同區域建立讀取複本
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| # 建立讀取複本
aws rds create-db-instance-read-replica \
--db-instance-identifier mydb-read-replica-1 \
--source-db-instance-identifier mydb-production \
--db-instance-class db.r5.large \
--availability-zone ap-northeast-1a
# 建立多個讀取複本
for i in 1 2 3; do
aws rds create-db-instance-read-replica \
--db-instance-identifier mydb-read-replica-$i \
--source-db-instance-identifier mydb-production \
--db-instance-class db.r5.large
done
|
查看讀取複本狀態
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| # 查看所有讀取複本
aws rds describe-db-instances \
--query 'DBInstances[?ReadReplicaSourceDBInstanceIdentifier!=`null`].{
Identifier:DBInstanceIdentifier,
Source:ReadReplicaSourceDBInstanceIdentifier,
Status:DBInstanceStatus,
ReplicaLag:StatusInfos[0].Message
}'
# 監控複本延遲
aws cloudwatch get-metric-statistics \
--namespace AWS/RDS \
--metric-name ReplicaLag \
--dimensions Name=DBInstanceIdentifier,Value=mydb-read-replica-1 \
--start-time $(date -u -d '1 hour ago' +%Y-%m-%dT%H:%M:%SZ) \
--end-time $(date -u +%Y-%m-%dT%H:%M:%SZ) \
--period 300 \
--statistics Average
|
跨區域讀取複本
跨區域讀取複本可用於:
- 減少遠端使用者的讀取延遲
- 建立災難復原機制
- 資料遷移到其他區域
建立跨區域讀取複本
1
2
3
4
5
6
7
| # 在不同區域建立讀取複本
aws rds create-db-instance-read-replica \
--db-instance-identifier mydb-replica-us-west-2 \
--source-db-instance-identifier arn:aws:rds:ap-northeast-1:123456789012:db:mydb-production \
--db-instance-class db.r5.large \
--region us-west-2 \
--kms-key-id arn:aws:kms:us-west-2:123456789012:key/12345678-1234-1234-1234-123456789012
|
將讀取複本提升為主資料庫
1
2
3
4
5
6
7
8
9
10
11
| # 提升讀取複本為獨立的主資料庫
aws rds promote-read-replica \
--db-instance-identifier mydb-replica-us-west-2
# 確認提升狀態
aws rds describe-db-instances \
--db-instance-identifier mydb-replica-us-west-2 \
--query 'DBInstances[0].{
Status:DBInstanceStatus,
ReadReplicaSource:ReadReplicaSourceDBInstanceIdentifier
}'
|
Multi-AZ vs 讀取複本比較
| 特性 | Multi-AZ | 讀取複本 |
|---|
| 主要用途 | 高可用性、災難復原 | 擴展讀取效能 |
| 複寫方式 | 同步 | 非同步 |
| 自動故障轉移 | 是 | 否 |
| 可讀取待命/複本 | 否 | 是 |
| 跨區域支援 | 否(需使用 Multi-AZ DB Cluster) | 是 |
| 數量限制 | 1 個待命複本 | 最多 5-15 個 |
| 資料一致性 | 強一致性 | 最終一致性 |
| DNS 端點 | 單一端點 | 每個複本獨立端點 |
結合使用
建議的架構是同時使用 Multi-AZ 和讀取複本:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| # 1. 建立啟用 Multi-AZ 的主資料庫
aws rds create-db-instance \
--db-instance-identifier mydb-production \
--db-instance-class db.r5.xlarge \
--engine mysql \
--multi-az \
--allocated-storage 200 \
--storage-type gp3 \
# ... 其他參數
# 2. 為主資料庫建立讀取複本
aws rds create-db-instance-read-replica \
--db-instance-identifier mydb-read-replica-1 \
--source-db-instance-identifier mydb-production
# 3. 讀取複本也可以啟用 Multi-AZ
aws rds modify-db-instance \
--db-instance-identifier mydb-read-replica-1 \
--multi-az \
--apply-immediately
|
成本考量
Multi-AZ 成本
- 執行個體費用加倍(主資料庫 + 待命複本)
- 儲存費用加倍
- 跨可用區資料傳輸免費
讀取複本成本
- 每個讀取複本需支付執行個體費用
- 同區域內資料傳輸免費
- 跨區域資料傳輸需收費
成本最佳化建議
1
2
3
4
5
6
7
8
9
10
11
12
| # 查看 RDS 執行個體的預估成本
aws ce get-cost-and-usage \
--time-period Start=2024-04-01,End=2024-05-01 \
--granularity MONTHLY \
--metrics BlendedCost \
--filter '{
"Dimensions": {
"Key": "SERVICE",
"Values": ["Amazon Relational Database Service"]
}
}' \
--group-by Type=DIMENSION,Key=USAGE_TYPE
|
參考資料