前回の記事では、RDSの基本概念からデータベースインスタンスの作成方法までを解説しました。本記事では、本番環境で欠かせないRDSの高可用性構成とバックアップ戦略について解説します。マルチAZ配置、リードレプリカ、自動バックアップ、ポイントインタイムリカバリを理解し、信頼性の高いデータベース運用を実現しましょう。
RDSの高可用性オプション
RDSでは、本番環境の要件に応じて複数の高可用性オプションを提供しています。それぞれの特徴を理解し、適切な構成を選択することが重要です。
高可用性オプションの比較
RDSで利用できる高可用性オプションを比較します。
| オプション | 主な目的 | レプリケーション | フェイルオーバー | 読み取り負荷分散 |
|---|---|---|---|---|
| シングルAZ | 開発・テスト | なし | 手動復旧 | 不可 |
| マルチAZ(1スタンバイ) | 高可用性 | 同期 | 自動(60秒) | 不可 |
| マルチAZ(2読み取り可能スタンバイ) | 高可用性+読み取り | 同期 | 自動(35秒) | 可能 |
| リードレプリカ | 読み取りスケーリング | 非同期 | 手動昇格 | 可能 |
graph TB
subgraph "高可用性構成の選択"
Start[要件の確認] --> Q1{高可用性が<br/>必要か?}
Q1 -->|いいえ| SingleAZ[シングルAZ<br/>開発・テスト向け]
Q1 -->|はい| Q2{読み取り負荷<br/>分散も必要か?}
Q2 -->|いいえ| MultiAZ1[マルチAZ<br/>1スタンバイ]
Q2 -->|はい| Q3{MySQL/PostgreSQL<br/>を使用?}
Q3 -->|はい| MultiAZ2[マルチAZ<br/>2読み取り可能スタンバイ]
Q3 -->|いいえ| MultiAZRead[マルチAZ +<br/>リードレプリカ]
endマルチAZ配置
マルチAZ配置は、RDSで最も重要な高可用性機能です。プライマリインスタンスに障害が発生した場合、スタンバイインスタンスに自動的にフェイルオーバーすることで、ダウンタイムを最小限に抑えます。
マルチAZ配置の仕組み
マルチAZ配置では、プライマリDBインスタンスのデータが同期的にスタンバイインスタンスにレプリケーションされます。
graph TB
subgraph "AWS Cloud"
subgraph "VPC"
subgraph "AZ-a"
Primary[(プライマリ<br/>DBインスタンス)]
end
subgraph "AZ-c"
Standby[(スタンバイ<br/>DBインスタンス)]
end
end
DNS[RDSエンドポイント<br/>DNS名]
end
App[アプリケーション] --> DNS
DNS --> Primary
Primary -->|同期レプリケーション| StandbyマルチAZ配置の主な特徴は以下のとおりです。
| 特徴 | 説明 |
|---|---|
| 同期レプリケーション | プライマリへの書き込みは、スタンバイにも同期的に複製される |
| 自動フェイルオーバー | プライマリの障害を検出すると自動的にスタンバイに切り替え |
| 単一エンドポイント | アプリケーションは同じDNS名で接続を継続可能 |
| スタンバイへの直接アクセス不可 | スタンバイは高可用性専用で、読み取りには使用できない |
フェイルオーバーの動作
フェイルオーバーが発生する条件と、その際の動作を説明します。
フェイルオーバーが発生する条件
- プライマリインスタンスのホスト障害
- プライマリインスタンスのAZ障害
- プライマリインスタンスのネットワーク接続喪失
- プライマリインスタンスの変更(インスタンスクラス変更など)
- 手動でのフェイルオーバー実行
sequenceDiagram
participant App as アプリケーション
participant DNS as RDS DNS
participant Primary as プライマリ
participant Standby as スタンバイ
App->>DNS: 接続
DNS->>Primary: ルーティング
Primary->>App: 応答
Note over Primary: 障害発生
Primary--xApp: 接続断
Note over Standby: フェイルオーバー開始
Standby->>Standby: プライマリに昇格
DNS->>DNS: エンドポイント更新
App->>DNS: 再接続
DNS->>Standby: ルーティング(新プライマリ)
Standby->>App: 応答フェイルオーバーにかかる時間は、通常60秒から120秒程度です。この間、アプリケーションは一時的にデータベースに接続できなくなります。
マルチAZ配置の有効化
既存のシングルAZインスタンスをマルチAZに変更する方法を示します。
|
|
マルチAZへの変更時には、以下の点に注意が必要です。
- スナップショットが作成され、スタンバイインスタンスが構築される
- 変更中はI/Oの一時的な停止が発生する可能性がある
- メンテナンスウィンドウ内での適用を推奨(
--apply-immediatelyを指定しない場合)
2つの読み取り可能スタンバイを備えたマルチAZ
2023年に登場した新しいマルチAZ配置オプションとして、「2つの読み取り可能スタンバイを備えたマルチAZ」があります。これはMySQL用RDSとPostgreSQL用RDSで利用可能です。
graph TB
subgraph "AWS Cloud"
subgraph "VPC"
subgraph "AZ-a"
Writer[(ライター<br/>インスタンス)]
end
subgraph "AZ-c"
Reader1[(リーダー<br/>インスタンス 1)]
end
subgraph "AZ-d"
Reader2[(リーダー<br/>インスタンス 2)]
end
end
WriterEP[ライターエンドポイント]
ReaderEP[リーダーエンドポイント]
end
AppWrite[書き込みアプリ] --> WriterEP
WriterEP --> Writer
AppRead[読み取りアプリ] --> ReaderEP
ReaderEP --> Reader1
ReaderEP --> Reader2
Writer -->|同期レプリケーション| Reader1
Writer -->|同期レプリケーション| Reader2従来のマルチAZとの主な違いは以下のとおりです。
| 項目 | 1スタンバイ | 2読み取り可能スタンバイ |
|---|---|---|
| スタンバイ数 | 1 | 2 |
| 読み取りアクセス | 不可 | 可能 |
| フェイルオーバー時間 | 約60秒 | 通常35秒以内 |
| トランザクションコミット | 標準 | 最大2倍高速 |
| マイナーバージョンアップグレード | 分単位のダウンタイム | 通常1秒未満 |
| 対応エンジン | 全エンジン | MySQL、PostgreSQL |
2つの読み取り可能スタンバイを使用する場合、専用のクラスターエンドポイントが提供されます。
|
|
リードレプリカ
リードレプリカは、読み取りトラフィックを分散させるための機能です。マルチAZとは目的が異なり、スケーラビリティの向上を主な目的としています。
リードレプリカの仕組み
リードレプリカは、ソースDBインスタンスから非同期でデータをレプリケーションします。
graph TB
subgraph "AWS Cloud"
subgraph "リージョン: ap-northeast-1"
Source[(ソースDB<br/>インスタンス)]
Replica1[(リードレプリカ 1)]
Replica2[(リードレプリカ 2)]
end
end
AppWrite[書き込みアプリ] -->|書き込み| Source
Source -->|非同期レプリケーション| Replica1
Source -->|非同期レプリケーション| Replica2
AppRead1[読み取りアプリ 1] -->|読み取り| Replica1
AppRead2[読み取りアプリ 2] -->|読み取り| Replica2リードレプリカの主な特徴は以下のとおりです。
| 特徴 | 説明 |
|---|---|
| 非同期レプリケーション | ソースへの書き込み後、わずかな遅延でレプリカに反映 |
| 読み取り専用 | レプリカへの書き込みは不可(MySQLを除く) |
| 独立したエンドポイント | 各レプリカに固有のエンドポイントが付与される |
| スタンドアロンへの昇格 | 必要に応じて独立したDBインスタンスに昇格可能 |
リードレプリカの作成
リードレプリカを作成する手順を示します。
|
|
各エンジンで作成可能なリードレプリカの最大数は以下のとおりです。
| エンジン | 最大リードレプリカ数 |
|---|---|
| MySQL | 15 |
| PostgreSQL | 15 |
| MariaDB | 15 |
| SQL Server | 15 |
| Oracle | 5 |
リードレプリカのユースケース
リードレプリカは以下のようなユースケースで活用されます。
1. 読み取り負荷の分散
graph LR
subgraph "アプリケーション層"
Web[Webアプリ]
end
subgraph "データベース層"
Source[(ソース<br/>書き込み用)]
Replica1[(レプリカ1)]
Replica2[(レプリカ2)]
end
Web -->|INSERT/UPDATE| Source
Web -->|SELECT| Replica1
Web -->|SELECT| Replica22. レポーティング・分析用途
graph LR
subgraph "本番環境"
Source[(ソースDB)]
end
subgraph "分析環境"
Replica[(レプリカ)]
BI[BIツール]
end
Source --> Replica
Replica --> BI3. クロスリージョンレプリケーション
graph LR
subgraph "東京リージョン"
Tokyo[(ソースDB)]
end
subgraph "バージニアリージョン"
Virginia[(レプリカ)]
USApp[米国向けアプリ]
end
Tokyo -->|クロスリージョン<br/>レプリケーション| Virginia
USApp --> VirginiaマルチAZとリードレプリカの併用
本番環境では、マルチAZとリードレプリカを組み合わせることで、高可用性とスケーラビリティの両方を実現できます。
graph TB
subgraph "AWS Cloud"
subgraph "AZ-a"
Primary[(プライマリ)]
end
subgraph "AZ-c"
Standby[(スタンバイ<br/>マルチAZ)]
Replica1[(リードレプリカ1)]
end
subgraph "AZ-d"
Replica2[(リードレプリカ2)]
end
end
Primary -->|同期レプリケーション| Standby
Primary -->|非同期レプリケーション| Replica1
Primary -->|非同期レプリケーション| Replica2この構成のメリットは以下のとおりです。
- プライマリ障害時はスタンバイに自動フェイルオーバー
- 読み取りトラフィックはリードレプリカに分散
- リードレプリカ自体もマルチAZ構成にすることが可能
自動バックアップ
RDSは、DBインスタンスの自動バックアップ機能を標準で提供しています。これにより、データ損失のリスクを軽減し、障害発生時の復旧を容易にします。
自動バックアップの仕組み
自動バックアップは、以下の2つの要素で構成されます。
graph TB
subgraph "自動バックアップの構成要素"
DB[(DBインスタンス)]
Snapshot[日次スナップショット]
TxLog[トランザクションログ<br/>5分ごと]
S3[(Amazon S3<br/>自動保存)]
end
DB -->|1日1回| Snapshot
DB -->|5分ごと| TxLog
Snapshot --> S3
TxLog --> S3| 要素 | 説明 | 保存先 |
|---|---|---|
| 日次スナップショット | DBインスタンス全体のバックアップ | S3(自動管理) |
| トランザクションログ | 5分ごとにバックアップ | S3(自動管理) |
バックアップの設定
自動バックアップの設定項目を説明します。
|
|
主要なバックアップ設定は以下のとおりです。
| 設定項目 | 説明 | デフォルト値 |
|---|---|---|
| バックアップ保持期間 | 自動バックアップを保持する日数(0-35日) | 7日 |
| バックアップウィンドウ | 日次バックアップを実行する時間帯(UTC) | リージョンによる |
| 最終復元可能時刻 | ポイントインタイムリカバリで復元可能な最新時刻 | 自動計算 |
バックアップ保持期間を0に設定すると、自動バックアップが無効になります。本番環境では、最低でも7日以上の保持期間を設定することを推奨します。
バックアップウィンドウの選択
バックアップウィンドウは、システムの負荷が低い時間帯を選択することが重要です。
gantt
title 推奨バックアップスケジュール(日本時間)
dateFormat HH:mm
axisFormat %H:%M
section トラフィック
低負荷時間帯 :done, 02:00, 4h
section バックアップ
バックアップウィンドウ :active, 03:00, 1h
section メンテナンス
メンテナンスウィンドウ :04:00, 1hバックアップ中はI/Oが一時的に停止する可能性があるため、以下の点に注意してください。
- シングルAZの場合:バックアップ中にI/Oの一時停止が発生する可能性がある
- マルチAZの場合:スタンバイからバックアップを取得するため、プライマリへの影響は最小限
手動スナップショット
自動バックアップに加えて、任意のタイミングで手動スナップショットを作成できます。手動スナップショットは、明示的に削除するまで保持されます。
手動スナップショットの作成
|
|
自動バックアップと手動スナップショットの違い
| 項目 | 自動バックアップ | 手動スナップショット |
|---|---|---|
| 作成タイミング | バックアップウィンドウ内で自動 | 任意のタイミング |
| 保持期間 | 0-35日(設定可能) | 明示的に削除するまで永続 |
| DBインスタンス削除時 | 自動削除 | 保持される |
| ポイントインタイムリカバリ | 対応 | スナップショット時点のみ |
| コスト | バックアップストレージ料金 | スナップショットストレージ料金 |
スナップショットのユースケース
手動スナップショットは以下のようなシーンで活用します。
1. 重要な変更前のバックアップ
|
|
2. 本番環境のコピーを開発環境に作成
|
|
3. クロスリージョンへのコピー
|
|
ポイントインタイムリカバリ
ポイントインタイムリカバリ(PITR)は、バックアップ保持期間内の任意の時点にデータベースを復元できる機能です。誤ったデータ削除や更新からの復旧に非常に有効です。
ポイントインタイムリカバリの仕組み
PITRは、日次スナップショットとトランザクションログを組み合わせて、指定した時点の状態を再現します。
graph LR
subgraph "バックアップデータ"
Snap1[日次スナップショット<br/>1/23 03:00]
TxLog1[トランザクションログ<br/>1/23 03:00-]
Snap2[日次スナップショット<br/>1/24 03:00]
TxLog2[トランザクションログ<br/>1/24 03:00-]
Snap3[日次スナップショット<br/>1/25 03:00]
TxLog3[トランザクションログ<br/>1/25 03:00-現在]
end
Snap1 --> TxLog1
TxLog1 --> Snap2
Snap2 --> TxLog2
TxLog2 --> Snap3
Snap3 --> TxLog3指定時点(例:1/25 10:30)への復元手順は以下のとおりです。
- 直近のスナップショット(1/25 03:00)を復元
- トランザクションログを適用して10:30まで再生
- 新しいDBインスタンスとして作成
復元可能な時間範囲
復元可能な時間範囲は、LatestRestorableTimeで確認できます。
|
|
復元可能な範囲は以下のとおりです。
- 最古の復元可能時点: バックアップ保持期間の開始時点
- 最新の復元可能時点: 通常、現在時刻の5分前まで
ポイントインタイムリカバリの実行
PITRを実行する手順を示します。
|
|
PITRの注意点は以下のとおりです。
- 復元先は新しいDBインスタンスとして作成される(元のインスタンスは影響を受けない)
- セキュリティグループ、パラメータグループは別途設定が必要
- 復元にかかる時間はデータ量に依存する
障害復旧のシナリオ
PITRを使用した障害復旧の典型的なシナリオを示します。
sequenceDiagram
participant User as ユーザー
participant App as アプリケーション
participant DB as 本番DB
participant Restored as 復元DB
User->>App: 誤ったDELETE文を実行
App->>DB: DELETE FROM users WHERE ...
Note over DB: データ消失(10:30)
User->>User: 障害を検知
Note over Restored: PITR実行(10:29に復元)
User->>Restored: データを確認
Restored->>User: 消失データを発見
User->>DB: データを手動で復旧
Note over Restored: 復元DBを削除バックアップとリカバリのベストプラクティス
本番環境で信頼性の高いバックアップ戦略を実現するためのベストプラクティスを紹介します。
バックアップ戦略の設計
graph TB
subgraph "多層バックアップ戦略"
Auto[自動バックアップ<br/>保持期間: 14日]
Daily[日次スナップショット<br/>自動]
Weekly[週次スナップショット<br/>手動・4週間保持]
Monthly[月次スナップショット<br/>手動・12ヶ月保持]
CrossRegion[クロスリージョン<br/>コピー]
end
Auto --> Daily
Daily --> Weekly
Weekly --> Monthly
Monthly --> CrossRegion推奨設定は以下のとおりです。
| 項目 | 推奨設定 | 理由 |
|---|---|---|
| 自動バックアップ保持期間 | 14日以上 | 2週間前までのPITRを可能に |
| 週次スナップショット | 4週間保持 | 1ヶ月以内の任意時点に復元可能 |
| 月次スナップショット | 12ヶ月保持 | 年間を通じた監査・コンプライアンス対応 |
| クロスリージョンコピー | 災害対策 | リージョン障害時の復旧 |
リカバリ手順の文書化
障害発生時に迅速に対応するため、リカバリ手順を文書化しておくことが重要です。
|
|
RTO/RPOの設計
復旧目標を明確に設定し、それに適した構成を選択します。
| 指標 | 定義 | RDSでの実現方法 |
|---|---|---|
| RTO(目標復旧時間) | 障害発生から復旧までの許容時間 | マルチAZ: 数分、PITR: 数十分〜数時間 |
| RPO(目標復旧時点) | 許容されるデータ損失の時間 | 自動バックアップ: 最大5分 |
graph LR
subgraph "RTO/RPOと構成の関係"
High[高可用性要件<br/>RTO: 分単位<br/>RPO: 0]
Medium[標準要件<br/>RTO: 時間単位<br/>RPO: 5分]
Low[コスト重視<br/>RTO: 日単位<br/>RPO: 24時間]
end
High --> MultiAZ[マルチAZ +<br/>同期レプリケーション]
Medium --> PITR[シングルAZ +<br/>自動バックアップ]
Low --> Snapshot[シングルAZ +<br/>日次スナップショット]コストの最適化
高可用性とバックアップにはコストがかかります。要件に応じて適切な構成を選択し、コストを最適化します。
コスト要素
| 項目 | 課金方式 | 備考 |
|---|---|---|
| マルチAZインスタンス | シングルAZの約2倍 | スタンバイインスタンス分 |
| リードレプリカ | 追加インスタンス分 | ストレージは別途 |
| 自動バックアップ | DBインスタンスサイズまで無料 | 超過分は$0.095/GB/月 |
| 手動スナップショット | $0.095/GB/月 | 全サイズ課金 |
| クロスリージョンコピー | データ転送料金 + ストレージ | 転送: $0.09/GB |
コスト削減のヒント
- 開発環境: シングルAZ、自動バックアップ保持期間を最小限に
- ステージング環境: シングルAZ、本番のスナップショットから定期的に再作成
- 本番環境: マルチAZは必須、バックアップ保持期間は要件に応じて設定
まとめ
本記事では、RDSの高可用性構成とバックアップ戦略について解説しました。
主なポイントをまとめます。
- マルチAZ配置により、プライマリ障害時に自動フェイルオーバーで高可用性を実現
- 2つの読み取り可能スタンバイは、高可用性と読み取りスケーリングを同時に提供
- リードレプリカは読み取り負荷分散とクロスリージョンレプリケーションに活用
- 自動バックアップとトランザクションログにより、5分以内のRPOを実現
- ポイントインタイムリカバリで、バックアップ保持期間内の任意の時点に復元可能
- RTO/RPOの要件に応じて、適切な構成を選択することが重要
これでRDSの基礎シリーズは完了です。次回からは、ELB(Elastic Load Balancing)とAuto Scalingについて解説し、負荷分散とスケーリングの実現方法を学びます。