データの可用性と耐久性を確保するために、AWSは各種データストアにレプリケーション機能を提供しています。ユースケースに応じて適切なレプリケーション戦略を選択することが重要です。
レプリケーションの種類
同期 vs 非同期
flowchart TB
subgraph Sync["同期レプリケーション"]
S1["書き込み"]
S2["プライマリ"]
S3["レプリカ"]
S4["確認応答"]
S1 --> S2
S2 --> S3
S3 --> S4
end
subgraph Async["非同期レプリケーション"]
A1["書き込み"]
A2["プライマリ"]
A3["確認応答"]
A4["レプリカ"]
A1 --> A2
A2 --> A3
A2 -.-> A4
end
style Sync fill:#22c55e,color:#fff
style Async fill:#f59e0b,color:#000
| 特性 | 同期 | 非同期 |
|---|---|---|
| データ一貫性 | 強い | 結果整合性 |
| レイテンシー | 高い | 低い |
| 可用性への影響 | あり | 少ない |
| 距離 | 近距離向け | 遠距離可能 |
RDSのレプリケーション
Multi-AZ配置
flowchart TB
subgraph VPC["VPC"]
subgraph AZ1["AZ-a"]
Primary["プライマリDB"]
end
subgraph AZ2["AZ-b"]
Standby["スタンバイDB"]
end
end
Primary --> |"同期レプリケーション"| Standby
App["アプリケーション"] --> |"エンドポイント"| Primary
App -.-> |"フェイルオーバー時"| Standby
style AZ1 fill:#3b82f6,color:#fff
style AZ2 fill:#22c55e,color:#fff
特徴:
- 同期レプリケーション: データ損失なし
- 自動フェイルオーバー: 60-120秒
- 単一エンドポイント: アプリケーション変更不要
リードレプリカ
flowchart TB
subgraph Primary["プライマリリージョン"]
Master["マスターDB"]
end
subgraph SameRegion["同一リージョン"]
RR1["リードレプリカ1"]
RR2["リードレプリカ2"]
end
subgraph CrossRegion["クロスリージョン"]
RR3["リードレプリカ3"]
end
Master --> |"非同期"| RR1
Master --> |"非同期"| RR2
Master --> |"非同期"| RR3
App["アプリ"] --> |"書き込み"| Master
App --> |"読み取り"| RR1
App --> |"読み取り"| RR2
style Primary fill:#3b82f6,color:#fff
style SameRegion fill:#22c55e,color:#fff
style CrossRegion fill:#8b5cf6,color:#fff
| 用途 | 説明 |
|---|---|
| 読み取りスケーリング | 読み取り負荷の分散 |
| DR | クロスリージョンのバックアップ |
| 移行 | 昇格によるカットオーバー |
設定例
# Multi-AZ有効化
aws rds modify-db-instance \
--db-instance-identifier mydb \
--multi-az \
--apply-immediately
# リードレプリカ作成(クロスリージョン)
aws rds create-db-instance-read-replica \
--db-instance-identifier mydb-replica \
--source-db-instance-identifier arn:aws:rds:ap-northeast-1:xxx:db:mydb \
--region us-west-2
Auroraのレプリケーション
Aurora レプリカ
flowchart TB
subgraph AuroraCluster["Aurora クラスター"]
subgraph Storage["共有ストレージ"]
Vol["クラスターボリューム<br/>(3AZに6コピー)"]
end
Writer["ライターインスタンス"]
Reader1["リーダーインスタンス1"]
Reader2["リーダーインスタンス2"]
Writer --> Vol
Reader1 --> Vol
Reader2 --> Vol
end
style Storage fill:#f59e0b,color:#000
特徴:
- 最大15リーダー: 高い読み取りスケーラビリティ
- ミリ秒単位のレプリカラグ: 共有ストレージのため
- 自動フェイルオーバー: 30秒以内
Aurora Global Database
flowchart TB
subgraph Primary["プライマリリージョン"]
PCluster["プライマリクラスター"]
PStorage["ストレージ"]
end
subgraph Secondary1["セカンダリリージョン1"]
SCluster1["セカンダリクラスター"]
SStorage1["ストレージ"]
end
subgraph Secondary2["セカンダリリージョン2"]
SCluster2["セカンダリクラスター"]
SStorage2["ストレージ"]
end
PStorage --> |"ストレージレベル<br/>レプリケーション<br/>(< 1秒)"| SStorage1
PStorage --> |"ストレージレベル<br/>レプリケーション"| SStorage2
style Primary fill:#3b82f6,color:#fff
style Secondary1 fill:#22c55e,color:#fff
style Secondary2 fill:#8b5cf6,color:#fff
| 特徴 | 詳細 |
|---|---|
| レプリケーションラグ | 通常1秒未満 |
| セカンダリリージョン | 最大5リージョン |
| フェイルオーバー | 計画的: 分単位、非計画: RPO 1秒 |
| ユースケース | グローバルDR、低レイテンシー読み取り |
設定例
# Global Databaseの作成
aws rds create-global-cluster \
--global-cluster-identifier my-global-db \
--source-db-cluster-identifier my-primary-cluster \
--region ap-northeast-1
# セカンダリリージョンにクラスターを追加
aws rds create-db-cluster \
--db-cluster-identifier my-secondary-cluster \
--global-cluster-identifier my-global-db \
--engine aurora-mysql \
--region us-west-2
# 計画的フェイルオーバー
aws rds failover-global-cluster \
--global-cluster-identifier my-global-db \
--target-db-cluster-identifier arn:aws:rds:us-west-2:xxx:cluster:my-secondary-cluster
S3のレプリケーション
レプリケーションの種類
flowchart TB
subgraph Types["S3レプリケーション"]
SRR["Same-Region<br/>Replication (SRR)"]
CRR["Cross-Region<br/>Replication (CRR)"]
end
SRR --> |"同一リージョン"| Compliance["コンプライアンス<br/>ログ集約"]
CRR --> |"クロスリージョン"| DR["DR<br/>レイテンシー低減"]
style SRR fill:#3b82f6,color:#fff
style CRR fill:#22c55e,color:#fff
レプリケーションルール
{
"Rules": [
{
"ID": "ReplicateAll",
"Status": "Enabled",
"Priority": 1,
"Filter": {},
"Destination": {
"Bucket": "arn:aws:s3:::destination-bucket",
"ReplicationTime": {
"Status": "Enabled",
"Time": {"Minutes": 15}
},
"Metrics": {
"Status": "Enabled",
"EventThreshold": {"Minutes": 15}
}
},
"DeleteMarkerReplication": {"Status": "Enabled"}
}
]
}
S3 Replication Time Control (RTC)
flowchart LR
subgraph Source["ソースバケット"]
Object["オブジェクト"]
end
subgraph RTC["Replication Time Control"]
SLA["99.99%のオブジェクトを<br/>15分以内にレプリケート"]
end
subgraph Dest["宛先バケット"]
Replica["レプリカ"]
end
Object --> RTC
RTC --> Replica
style RTC fill:#f59e0b,color:#000
バッチレプリケーション
既存オブジェクトのレプリケーション:
# S3 Batch Replicationジョブの作成
aws s3control create-job \
--account-id 123456789012 \
--operation '{"S3ReplicateObject":{}}' \
--manifest '{"Spec":{"Format":"S3BatchOperations_CSV_20180820","Fields":["Bucket","Key"]},"Location":{"ObjectArn":"arn:aws:s3:::manifest-bucket/manifest.csv","ETag":"xxx"}}' \
--report '{"Bucket":"arn:aws:s3:::report-bucket","Format":"Report_CSV_20180820","Enabled":true,"Prefix":"reports/"}' \
--priority 10 \
--role-arn arn:aws:iam::123456789012:role/S3BatchRole
DynamoDBのレプリケーション
DynamoDB Global Tables
flowchart TB
subgraph Tokyo["東京"]
Table1["テーブル"]
App1["アプリ"]
end
subgraph Singapore["シンガポール"]
Table2["テーブル"]
App2["アプリ"]
end
subgraph Virginia["バージニア"]
Table3["テーブル"]
App3["アプリ"]
end
Table1 <--> |"双方向レプリケーション"| Table2
Table2 <--> |"双方向レプリケーション"| Table3
Table1 <--> Table3
App1 --> |"読み書き"| Table1
App2 --> |"読み書き"| Table2
App3 --> |"読み書き"| Table3
style Tokyo fill:#3b82f6,color:#fff
style Singapore fill:#22c55e,color:#fff
style Virginia fill:#8b5cf6,color:#fff
特徴:
- アクティブ-アクティブ: 全リージョンで読み書き可能
- 結果整合性: 通常1秒未満で伝播
- 競合解決: 最後の書き込みが優先
- 自動: 追加設定なしでフェイルオーバー
設定例
# Global Tableの作成(既存テーブルにレプリカ追加)
aws dynamodb update-table \
--table-name MyTable \
--replica-updates \
Create={RegionName=us-west-2} \
Create={RegionName=eu-west-1}
# レプリカの確認
aws dynamodb describe-table --table-name MyTable \
--query "Table.Replicas"
DynamoDB Streams
変更データキャプチャ:
flowchart LR
subgraph DynamoDB["DynamoDB"]
Table["テーブル"]
Stream["DynamoDB Streams"]
end
subgraph Consumers["コンシューマー"]
Lambda["Lambda"]
KCL["Kinesis Client<br/>Library"]
end
Table --> |"変更イベント"| Stream
Stream --> Lambda
Stream --> KCL
style DynamoDB fill:#3b82f6,color:#fff
レプリケーション戦略の選択
選択フローチャート
flowchart TD
Q1{"データストアの種類は?"}
Q2{"リレーショナル?"}
Q3{"グローバル分散<br/>が必要?"}
Q4{"Multi-AZ<br/>で十分?"}
Q1 -->|RDB| Q2
Q1 -->|NoSQL| DynamoDB["DynamoDB<br/>Global Tables"]
Q1 -->|オブジェクト| S3["S3 CRR/SRR"]
Q2 -->|Yes| Q3
Q3 -->|Yes| Aurora["Aurora<br/>Global Database"]
Q3 -->|No| Q4
Q4 -->|Yes| MultiAZ["RDS Multi-AZ"]
Q4 -->|No| ReadReplica["RDS<br/>リードレプリカ"]
style Aurora fill:#22c55e,color:#fff
style DynamoDB fill:#f59e0b,color:#000
style S3 fill:#3b82f6,color:#fff
比較表
| サービス | レプリケーション | ラグ | フェイルオーバー |
|---|---|---|---|
| RDS Multi-AZ | 同期 | 0 | 60-120秒 |
| RDS リードレプリカ | 非同期 | 秒〜分 | 手動昇格 |
| Aurora レプリカ | 同期(ストレージ) | ミリ秒 | 30秒以内 |
| Aurora Global | 非同期 | < 1秒 | 分単位 |
| S3 CRR | 非同期 | 分〜時間 | N/A |
| S3 RTC | 非同期(SLA付き) | 15分以内 | N/A |
| DynamoDB Global | 非同期 | < 1秒 | 自動 |
ベストプラクティス
RDS/Aurora
flowchart TB
subgraph Best["Best Practices"]
B1["本番は必ずMulti-AZ"]
B2["読み取りスケーリングにリードレプリカ"]
B3["DRにはAurora Global Database"]
B4["定期的なフェイルオーバーテスト"]
end
style Best fill:#22c55e,color:#fff
S3
| 項目 | 推奨 |
|---|---|
| バージョニング | 必須(レプリケーション要件) |
| 暗号化 | ソースと宛先で一貫性を保つ |
| RTCの使用 | RPO要件がある場合 |
| 監視 | レプリケーションメトリクスを監視 |
DynamoDB
| 項目 | 推奨 |
|---|---|
| キー設計 | ホットパーティションを避ける |
| 競合 | 最終書き込み優先を理解 |
| コスト | レプリカリージョンの書き込みも課金 |
まとめ
flowchart TB
subgraph Replication["データレプリケーション"]
RDS["RDS/Aurora"]
S3["S3"]
DDB["DynamoDB"]
end
RDS --> |"HA"| MultiAZ["Multi-AZ"]
RDS --> |"スケール/DR"| Replica["リードレプリカ/<br/>Global Database"]
S3 --> |"DR/コンプライアンス"| CRR["CRR/SRR"]
DDB --> |"グローバル"| GlobalTables["Global Tables"]
style Replication fill:#3b82f6,color:#fff
| 要件 | 推奨ソリューション |
|---|---|
| RDBの高可用性 | RDS Multi-AZ |
| RDBの読み取りスケール | リードレプリカ |
| グローバルRDB DR | Aurora Global Database |
| オブジェクトDR | S3 CRR |
| グローバルNoSQL | DynamoDB Global Tables |
適切なレプリケーション戦略により、データの可用性、耐久性、パフォーマンスを最適化できます。