AWSデータベースの可用性について整理する

# 背景・目的
- データベースごとの可用性について整理する。

## 前提
- 一部埋められていない(調べられていない)箇所がある。後ほど更新する。

# 内容
## 一覧
- ここで説明する可用性は、システムが停止することなくサービスを提供し続けることを指す。
- 可用性を高めるための考え方として、以下を整理する。
    - AWSインフラの機能として、マルチAZ、マルチリージョン
    - データベースサービス機能として、プライマリ、セカンダリインスタンス
- なお、仕組みが異なるものは、同一データベースサービス内でもエンジン別に切り出して整理している。
- ここでいうレプリカは、スタンバイレプリカを指しており **リードレプリカ**とは異なる。(Auroraだけは異なる。)
- 以下に整理した内容を記載する。

<table>
  <tr>
    <th rowspan="2">データベース</th>
    <th colspan="2">配置可能なロケーション</th>
    <th rowspan="2">コンピュートとストレージの分離</th>
    <th colspan="3">データベース機能</th>
    <th rowspan="2"> 備考 </th>
  </tr>
  <tr>
    <th　>マルチAZ</th>
    <th>マルチリージョン</th>
    <th>マルチマスタ</th>
    <th>レプリカ</th>
    <th>Fail Over(F/O)<BR>（※2）</th>
  </tr>
  <tr>
     <td>RDS(Aurora)</td>
     <td> ◯ </td>
     <td> ◯ <BR>(※3) </td>
     <td> ◯ <BR>(※1) </td>
     <td> ◯ <BR>(※4)</td>
     <td> リードレプリカ、スタンバイレプリカ兼用（※10）<BR>（最大15ノード）  </td>
     <td> ◯ <BR><a href="https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/Concepts.AuroraHighAvailability.html#Concepts.AuroraHighAvailability.GlobalDB">120秒未満（多くは60秒）でF/O（※11）</a> </td>
     <td> </td>
  </tr>
  <tr>
     <td>RDS（MySQL、MariaDB、PostgreSQL、Oracle）</td>
     <td> ◯ </td>
     <td> ✕ </td>
     <td> ✕ </td>
     <td> ✕ </td>
     <td> スタンバイレプリカ </td>
     <td> ◯ <BR> <a href="https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/Concepts.MultiAZ.html#Concepts.MultiAZ.Failover">60秒〜120秒でF/O</a><BR>F/OはAWS独自の仕組みを利用。</td>
     <td> </td>
  </tr>
  <tr>
     <td>RDS（SQL Server）</td>
     <td> ◯ </td>
     <td> ✕ </td>
     <td> ✕ </td>
     <td> ✕ </td>
     <td> ◯ </td>
     <td> スタンバイレプリカ <BR>(※5) <a href="https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/Concepts.MultiAZ.html#Concepts.MultiAZ.Failover">60秒〜120秒でF/O</a> </td>
     <td> </td>
  </tr>
  <tr>
     <td>DynamoDB</td>
     <td> ◯ </td>
     <td> ◯ </td>
     <td> ？<BR>おそらくされている。 </td>
     <td> ◯<BR>(※6) </td>
     <td> ◯<BR>（※7） </td>
     <td> ？<BR>ドキュメント見つけられず </td>
     <td>  </td>
  </tr>
  <tr>
     <td>DocumentDB</td>
     <td> ◯ </td>
     <td> ✕ </td>
     <td> ◯ </td>
     <td> ✕ </td>
     <td> リードレプリカ <BR>（最大15ノード） </td>
     <td> ◯<BR>リードレプリカがプライマリに昇格</td>
     <td> 
  </tr>
  <tr>
     <td>ElastiCache for Memcached</td>
     <td> ◯ </td>
     <td> ✕ </td>
     <td> ✕<BR>(※8) </td>
     <td> ◯ </td>
     <td> リードレプリカ <BR>（最大20ノード） </td>
     <td> ✕ </td>
     <td>  </td>
  </tr>
  <tr>
     <td>ElastiCache for Redis</td>
     <td> ◯ </td>
     <td> ◯ <BR>(※9 最大2つのリード専用クラスタ) </td>
     <td> ◯ </td>
     <td> ✕ </td>
     <td> リードレプリカ <BR>（最大5ノード） </td>
     <td> ◯<BR>リードレプリカがプライマリに昇格</td>
     <td>  </td>
  </tr>
  <tr>
     <td>Neptune</td>
     <td> ◯ </td>
     <td> ✕ </td>
     <td> ◯ </td>
     <td> ✕ </td>
     <td> リードレプリカ <BR>（最大15ノード） </td>
     <td> ◯<BR>リードレプリカがプライマリに昇格</td>
     <td>  </td>
  </tr>
  <tr>
     <td>Timestream</td>
     <td> ◯ </td>
     <td> ✕ </td>
     <td> ◯（※12） </td>
     <td> ✕ </td>
     <td> ?  </td>
     <td> ? </td>
     <td>  </td>
  </tr>

  <tr>
     <td>QLDB</td>
     <td> ◯ </td>
     <td> ✕ </td>
     <td> ? </td>
     <td> ✕ </td>
     <td> ? </td>
     <td> <a href="https://docs.aws.amazon.com/ja_jp/qldb/latest/developerguide/disaster-recovery-resiliency.html#resiliency.storage-durability">◯ </a></td>
     <td>  </td>
  </tr>

</table>


- ※1.書き込みには[クォーラムモデル](https://qiita.com/drafts#%E3%82%AF%E3%82%A9%E3%83%BC%E3%83%A9%E3%83%A0%E3%83%A2%E3%83%87%E3%83%AB)を採用している。
- ※2. F/O時の挙動
    - レプリカには優先度が設定可能
    - 設定しない場合は、インスタンスタイプが大きいレプリカが優先。
- ※3. [Auroraグローバルデータベース](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/aurora-global-database.html)により、マルチリージョンに渡るグローバルデータベースが構築可能。1つのプライマリAWSリージョンと最大5つのセカンダリAWSリージョン。書き込みはプライマリのみ。リージョン間コピーは**通常1秒未満。**
    - 類似した機能でクロスリージョンレプリケーションもある。
        - 他のリージョンにAuroraクラスタを作成し、そのクラスタをRO専用クラスタとして利用する。
        - リージョン間コピーに時間がかかるので、グローバルデータベースを利用したほうが良いらしい。
- ※4. [Auroraマルチマスタ](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/aurora-multi-master.html)を構成する場合、マルチリージョンは利用できない。また、使用できるリージョンやデータベースエンジンおよびバージョンに制限がある、インスタンスは最大2つなど使用するには注意が必要。
    - F/Oの概念がない。
    - MySQLのみサポート
    - インスタンスの停止は不可
    - 書き込みパフォーマンスは落ちる場合あり
    - バックトラックは利用不可
- ※5. [ServerのDBM、またはAGsが使われる。](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/Concepts.MultiAZ.html)
- ※6. [DynamoDBグローバルテーブル](https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/GlobalTables.html)。マルチリージョン、マルチマスタを展開する。
- ※7. [DynamoDBグローバルテーブル](https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/GlobalTables.html)で、レプリカとしてリージョンを指定する。
- ※8. そもそも永続化できない。
- ※9. [グローバルデータストア](https://docs.aws.amazon.com/ja_jp/AmazonElastiCache/latest/red-ug/Redis-Global-Datastore.html)と呼ばれる。
- ※10.レプリカは、リードレプリカとスタンバイレプリカを兼ねており、障害発生時にはプライマリに昇格してF/Oする。
    - クラスターエンドポイントにアプリケーションは接続することで、切り替え作業は不要にある。
- ※11.Aurora for PostgreSQLにはクラスターキャッシュ管理機能がある。
    - プライマリインスタンスで使用していたキャッシュをレプリカに同期することで、F/O時のパフォーマンス影響を最低限に抑える狙いがある。

- ※12 [Architecture](https://docs.aws.amazon.com/ja_jp/timestream/latest/developerguide/architecture.html)に記載されているように、Ingestion layerとStorage layaerということで分離されている。さらに、ストレージは、[メモリとマグネティック]()の2つレイヤに分かれている




#### クォーラムモデル
- AWSデータベースで採用されているクォーラムモデルは以下の仕様（6コピー）で統一されているようだ。
- ストレージは、クラスターボリュームという機構で管理されている。
    - ３つのAZに2つずつ、合計6つのコピーが行われるクォラームシステムを導入している。（確か、ZooKeeperやCassandraなどでも採用していた。）
    - 6つのうち、同時に2つの障害が発生した場合（AZ１つがダウンなど）でも、書き込み、読み込み可能。
    - 6つのうち、同時に３つの障害が発生した場合でも、読み込み可能
- クォーラムモデルとは別に、10GBのブロック単位にコピーが行われ、ディスク障害時には自己修復機能により自動的に修復される。

# 考察
- Auroraは、クォーラムモデルを採用している。
- リードレプリカの上限数は、最大15が多い。DBによって異なるのはエンジンの制約か、それとも方針の違いか。
- まだ、早くや理解できてないところ（特にDynamoDB、QLDB、Timstream）もあるので、後ほど更新する。

# 参考

https://aws.amazon.com/jp/blogs/news/amazon-dynamodb-auto-scaling-performance-and-cost-optimization-at-any-scale/

https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/V2globaltables.tutorial.html

https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/disaster-recovery-resiliency.html

https://aws.amazon.com/jp/blogs/news/how-to-use-amazon-dynamodb-global-tables-to-power-multiregion-architectures/

https://docs.aws.amazon.com/ja_jp/timestream/latest/developerguide/architecture.html