AWSとAzureとGCPを比較してみる - DB編

DBについて、AWSとAzureとGCPを比較してみました。

# 1. 新世代DB

| | AWS              |Azure              | GCP                |
|:-------------------|:-------------------|:-------------------|:-------------------|
|新世代DB|Aurora|Cosmos DB|Cloud Spanner|
|DBの種類|MySQL,<br/>Postgresql|SQL (document DB),<br/>MongoDB (document DB),<br/>Gremlin (graph DB),<br/>Azure Table(KVS),<br/>Cassandra|オリジナルのリレーショナルDB|
|サーバレスか否か|サーバあり|サーバレス|サーバレス|
|高可用性構成 / 負荷分散|Auroraレプリカ,<br/>クロスリージョンレプリカ(MySQLのみ)|リージョン間フェイルオーバー,<br/>予約済みスループット|リージョン内レプリケーション,<br/>マルチリージョンレプリケーション |
|地理的範囲|リージョン(MySQLは別リージョンにレプリケーション可)|グローバル|グローバル|
|マルチマスター|シングルマスター,<br/>マルチマスター*|マスターになるリージョンは1個|マルチマスター|

\*プレビュー

DBの種類ですが、Auroraは手堅くMySQLとPostgresql、Cosmos DBはバラエティーにとんでいてドキュメントDB・KVS・グラフDBとCassandra、Cloud SpannerはオリジナルのリレーショナルDBとなっています。
Cloud Spannerはクライアントライブラリが各言語(C#,GO,Java\*\*, node.js\*\*,PHP\*\*, Python\*\*, Ruby)に対し用意されていますが、ORMの対応が気になるところです。
\*\*ベータ

Cosmos DBとCloud Spannerはサーバレスですが、Auroraはインスタンスタイプを指定してインスタンスを構築します。また、拡張機能というよりは別物として、サーバレスタイプの[Aurora serverless\*](https://aws.amazon.com/jp/rds/aurora/serverless/)がプレビュー中です。

高可用性構成と負荷分散ですが、Auroraはリージョン内ではリードレプリカが障害時にマスターに昇格することで対応しています。MySQL版はクロスリージョンレプリケーション構成を取ることができますが、リージョン間で自動フェイルオーバーする仕組みはありません。
また、Auroraはマルチマスター機能である[Aurora Multi-Master\*](https://aws.amazon.com/jp/about-aws/whats-new/2017/11/sign-up-for-the-preview-of-amazon-aurora-multi-master/)が現在プレビュー中ですが、リージョン間でも利用可能になる予定があるとアナウンスされています。リリースされればグローバルで高可用性と負荷分散が簡単に実現できそうです。
Cosmos DBは、1個の書き込みリージョンを持つリージョン間フェイルオーバー\*\*\*の仕組みで高可用性を実現しています。
Cloud Spannerはリージョン内レプリケーションとマルチリージョンレプリケーションの仕組みで高可用性を実現しています。1つのリージョンで構築する場合は、3個のread-writeレプリカを保持します。複数リージョンで構築する場合は、2個のread-writeレプリカを保持する2個のread-writeリージョン(と場合によってread-onlyリージョン)で構成されます。

\*\*\**Microsoftのドキュメントではregional failoverを[リージョン内フェイルオーバー](https://docs.microsoft.com/ja-jp/azure/cosmos-db/regional-failover)と訳していますが、意味合いはリージョン間フェイルオーバーなので、ここではそのように表記しています。*


# 2. リレーショナルDB

| | AWS              |Azure              | GCP                |
|:-------------------|:-------------------|:-------------------|:-------------------|
|MYSQL互換|MySQL <br/>/ MariaDB|Azure Database for MySQL\*|Google Cloud SQL for MySQL|
|高可用性構成|Multi-AZ,<br/>クロスリージョンリードレプリカ|-|フェイルオーバーレプリカ|
|負荷分散|リードレプリカ,<br/>クロスリージョンリードレプリカ|-|リードレプリカ|
||||
|Postgresql|Postgresql|Azure Database for PostgreSQL*|Google Cloud SQL for PostgreSQL\*\*|
|高可用性構成|Multi-AZ,<br/>クロスリージョンリードレプリカ|-|リージョナルインスタンス\*\*|
|負荷分散|リードレプリカ,<br/>クロスリージョンリードレプリカ|-|リードレプリカ\*\*|
||||
|SQL Server|SQL Server|Azure SQL Database|-|
|高可用性構成|Multi-AZ|アクティブgeoレプリケーション|-|
|負荷分散|-|アクティブgeoレプリケーション|-|
||||
|Oracle|Oracle|-|-|
|高可用性構成|Multi-AZ|-|-|
|負荷分散|-|-|-|

\*プレビュー
\*\*ベータ

### ・各クラウド間での違い-その1
AWSのMulti-AZとGCPのリージョナルインスタンス(PostgreSQL)は、スタンバイ側はリードの機能がないので負荷分散には利用できませんが、GCPのフェイルオーバーレプリカ(MySQL)はリードの機能があるので負荷分散にも利用できます。

# 3. NOSQL

| | AWS              |Azure              | GCP                |
|:-------------------|:-------------------|:-------------------|:-------------------|
|KVS・ドキュメント|ElastiCache(Memcached, Redis),<br/>DynamoDB|Redis Cache,<br/>Cosmos DB(Azure Table, SQL, MongoDB)|Cloud Datastore,<br/>Cloud Bigtable|
|グラフ|Neptune\*|Cosmos DB(Gremlin)|-|
|他|-|Cosmos DB(Cassandra)|-|
\*プレビュー

[Neptune](https://aws.amazon.com/jp/neptune/)の現時点のプレビューのAWSマネジメントコンソール画面はAmazon RDSとよく似ています。また裏でAuroraと同じ仕組みを利用しているそうなので、ひょっとしたらCosmos DBみたいに、Auroraの一機能としてリリースされるかも知れません。

# 4. まとめ

現在は、MySQL・Postgresqlを利用したければAWSのAuroraかRDS、SQL Serverを利用したければAzureでしょうか。
ただ各クラウドのプレビュー・ベータ提供状況を見ていると、そのうち機能差は無くなるように思えます。