【AWS SAP】RDSリードレプリカとは

# RDSリードレプリカとは
RDSリードレプリカは、Amazon RDSインスタンスからの読み取り操作をオフロードするための仕組みです。**非同期レプリケーション**を使用してプライマリインスタンスのデータを複製します。

**主な利点**:
- **読み取りトラフィックの分散**: 複数のリードレプリカを作成し、アプリケーションの負荷を軽減できる
- **災害復旧**: リードレプリカを昇格させてプライマリとして使用することで、高可用性を実現可能
- **地理的なレイテンシ削減**: 異なるリージョンにリードレプリカを配置することで、ユーザーとの物理的な距離を縮小

## 何個まで作成できる？
1つのプライマリインスタンスにつき**最大5個**のリードレプリカを作成可能です。

## どこに配置される？
デフォルトではプライマリインスタンスの配置されたAZに配置されます。異なるAZへの配置も可能です。

**クロスリージョンレプリカ**を利用すれば別リージョンへ配置が可能です。

https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/USER_ReadRepl.XRgn.html

## 費用は？高い？
基本的に1個のリードレプリカを作成する毎に**プライマリインスタンスと同額の費用が発生**。なので、価格は単純に作成する毎に2倍、3倍・・・になります。
さらに異なるAZやリージョンに作成すれば**データ転送料金**も発生します。

## リードレプリカに障害が発生したら？
1個しかリードレプリカがない場合、読み取り専用のクエリを処理できなくなります。
なので、異なるAZに複数配置することが推奨されます。

## プライマリインスタンスに障害が発生したら？
リードレプリカを手動で昇格させることでプライマリインスタンスにすることができます。

**なお、マルチAZ構成の場合は自動でスタンバイインスタンスがプライマリインスタンスに昇格されます。**

### マルチAZ構成？スタンバイインスタンス？
プライマリインスタンスはその名の通りプライマリとなるDBインスタンスです。これがないと始まりません。
スタンバイインスタンスはプライマリインスタンスの冗長性を高めるためのインスタンスです。リードレプリカとは異なります。
そのため、プライマリインスタンスの冗長性を高めるアーキテクチャは以下の通りであり、
- マルチAZ配置
- マルチリージョン配置

リードレプリカは読み取り専用のインスタンスです。

| 項目                         | マルチAZ配置                                   | マルチリージョン配置                           | リードレプリカ                                   |
|------------------------------|----------------------------------------------|----------------------------------------------|----------------------------------------------|
| **主な目的**                 | 高可用性です                                   | 災害復旧とローカルパフォーマンスです             | スケーラビリティです                             |
| **レプリケーション方式**     | Aurora以外: 同期レプリケーション、Aurora: 同期レプリケーション | 非同期レプリケーション                         | 非同期レプリケーション                         |
| **可用性**                   | Aurora以外: プライマリインスタンスのみがアクティブ、Aurora: すべてのインスタンスがアクティブ | すべてのリージョンにアクセスでき、読み取りに使用可能 | すべてのリードレプリカにアクセス可能で、読み取りのスケーリングに使用可能 |
| **バックアップ**             | Aurora以外: 自動バックアップはスタンバイから取得、Aurora: 自動バックアップは共有ストレージレイヤーから取得 | 各リージョンで自動バックアップを取得可能         | デフォルトではバックアップは構成されない         |
| **配置場所**                 | 1つのリージョン内に常に2つ以上のアベイラビリティゾーンを展開 | 各リージョンに対してマルチAZ配置可能             | アベイラビリティゾーン内、AZ間、またはリージョン間に配置可能 |
| **アップグレード**           | Aurora以外: データベースエンジンのバージョンアップグレードはプライマリで実施、Aurora: すべてのインスタンスが一緒に更新 | Aurora以外: データベースエンジンのバージョンアップグレードは各リージョンで独立して実施 | Aurora以外: ソースインスタンスから分離して実施 |
| **障害時の動作**             | 障害が発生した場合のスタンバイ(Aurora以外)またはリードレプリカ(Aurora)への自動フェイルオーバー | Auroraは、セカンダリリージョンのプロモーションをプライマリにすることが可能 | 手動でスタンドアロンのデータベースインスタンス(Aurora以外)またはプライマリインスタンス(Aurora)に昇格可能 |

https://aws.amazon.com/jp/rds/features/read-replicas/


## RDSリードレプリカの設定方法

### マネジメントコンソールを使用する手順
1. RDSコンソールを開き、対象のDBインスタンスを選択する
2. **「アクション」**メニューから**「リードレプリカの作成」**を選択
3. 必要な設定（インスタンスクラス、ストレージタイプ、リージョンなど）を指定
4. **「リードレプリカの作成」**ボタンをクリックして設定を完了

### CloudFormationを使用する場合
以下はCloudFormationテンプレートの例です:
```yaml
Resources:
  MyReadReplica:
    Type: AWS::RDS::DBInstance
    Properties:
      DBInstanceIdentifier: my-replica-instance
      SourceDBInstanceIdentifier: my-source-instance
      DBInstanceClass: db.m5.large
      AvailabilityZone: us-west-2a
```

## RDSリードレプリカの主要な特徴

- **対応するデータベースエンジン**: MySQL、PostgreSQL、MariaDB、SQL Server、Oracleがサポートされる  
- **非同期レプリケーション**: 書き込み操作はプライマリインスタンスのみ可能で、レプリケーションには遅延（レプリケーションラグ）が発生する場合がある  
- **自動昇格の不可**: リードレプリカはデフォルトで自動的にプライマリに昇格しない（手動操作が必要）

## 実践例: 読み取り負荷分散の設計

以下のシナリオを想定したアーキテクチャ例です:

**シナリオ**: EC2インスタンスから大量の読み取りリクエストが発生するウェブアプリケーション。読み取り性能を改善するため、リードレプリカを活用します。

- **構成図**:  
  - プライマリRDSインスタンス → リードレプリカ（2つ以上）  
  - EC2 Auto Scalingグループ → Application Load Balancer（ALB）  

```plaintext
       [ALB]
         |
    -------------
   |             |
[Replica1]    [Replica2]
         \
       [Primary]
```

- **ポイント**:  
  - ALBでターゲットグループを設定し、リードレプリカのみを登録  
  - プライマリへの書き込みリクエストは直接APIで処理する

## RDSリードレプリカと類似サービスの比較

| 特徴                         | RDSリードレプリカ            | RDSマルチAZ構成           | Amazon Auroraリードレプリカ |
|------------------------------|-----------------------------|--------------------------|----------------------------|
| レプリケーション方式         | 非同期                     | 同期                     | 非同期                     |
| 主な目的                     | 読み取り負荷分散           | 高可用性                 | 読み取り負荷分散+高可用性  |
| 複数リージョンでの配置       | サポート                  | 非サポート              | サポート                   |
| 自動フェイルオーバー         | 非サポート                | サポート                | サポート                   |

## クロスリージョンリードレプリカは類似サービスではない？
クロスリージョンリードレプリカはRDSリードレプリカやAuroraリードレプリカの一部機能として提供されるものであり、独自の類似サービスとは言えません。

- **RDSリードレプリカ**:
  - MySQL、PostgreSQLにおいてクロスリージョンレプリカを作成可能。
  - 主にディザスタリカバリやグローバルリードトラフィック分散に利用。
  - レプリケーション遅延はネットワーク距離に依存。
- **Auroraリードレプリカ**:
  - クラスタ全体でクロスリージョンをサポート。
  - 他のAWSリージョンにリアルタイムでデータを同期し、リード操作が可能。
  - Aurora Global Databaseとして、低遅延での複数リージョン運用を実現。


## 読み取りリクエストを複数の Amazon RDS リードレプリカに分散するにはどうすればよいですか?

https://repost.aws/ja/knowledge-center/requests-rds-read-replicas

フロー図にすると以下の通りです。
```mermaid
graph TD
    A[クライアントアプリケーション] -->|DNSクエリ| B[Route 53]
    B -->|加重ルーティング| C[リードレプリカ1]
    B -->|加重ルーティング| D[リードレプリカ2]
    B -->|加重ルーティング| E[リードレプリカ3]

    subgraph RDS環境
        C[リードレプリカ1] --> F[プライマリインスタンス]
        D[リードレプリカ2] --> F
        E[リードレプリカ3] --> F
    end

    F --> G[同期データ保存]
```

Amazon RDS のリードレプリカに対する読み取りリクエストを複数のリードレプリカに分散させる手順は以下の通りです。

### 1. リードレプリカのエンドポイントを取得：
- AWS マネジメントコンソールで RDS のデータベース一覧から各リードレプリカを選択し、エンドポイント情報を確認します。

### 2. Route 53 ホストゾーンの作成（未作成の場合）：
- Route 53 コンソールで新規ホストゾーンを作成します。
- ドメイン名を指定し、必要に応じてプライベートホストゾーンを選択します。

### 3. レコードセットの作成：
- ホストゾーン内で、各リードレプリカのエンドポイントに対応する CNAME レコードを作成します。
- 各レコードセットに同じ名前を付け、**加重ルーティングポリシー**を選択し、重みを均等に設定します。
- 必要に応じて、ヘルスチェックを設定し、利用不可のリードレプリカへのトラフィックを避けるようにします。

これらの設定により、Route 53 を通じて読み取りリクエストが複数のリードレプリカに均等に分散され、負荷分散が実現されます。