AWS RDS 多可用區與讀取複本

AWS RDS Multi-AZ and Read Replicas

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. 手動觸發故障轉移

手動觸發故障轉移

 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

參考資料

comments powered by Disqus
Built with Hugo
Theme Stack designed by Jimmy