☁️
概念 #データ設計 #クラウドDB #Aurora #Neon #PlanetScale #DDIA 📚 データ志向アプリケーション設計(DDIA)

クラウドDBサービスの設計思想と選択基準

Aurora Serverless・Neon・PlanetScale・AlloyDB・Turso等のマネージドDBの設計思想の違いと選択基準。「コンピュートとストレージの分離」というトレンドを理解する

定義

クラウドマネージドDBとは、インフラの管理(パッチ適用・バックアップ・フェイルオーバー)をクラウドベンダーに委託するDBサービス。自己ホストのPostgreSQLと比べてオペレーションコストが低いが、アーキテクチャの理解が選択を左右する。

最大のトレンド:コンピュートとストレージの分離

従来のDB(PostgreSQL自己ホスト):
  1台のサーバーにコンピュート(CPU・メモリ)と
  ストレージ(ディスク)が同居
  
  → スケールアップが必要(CPUとストレージを一緒に増やすしかない)
  → フェイルオーバーにはデータのコピーが必要(時間がかかる)

モダンクラウドDB:
  コンピュート(CPU・メモリ) ←→ ストレージ(分散・高可用)
  
  → コンピュートだけ瞬時にスケール(ストレージはそのまま)
  → ゼロへのスケールダウンが可能(使わないときは無料)
  → フェイルオーバーが高速(データの移動なし)

AWS Aurora

PostgreSQL/MySQL互換。Amazonが独自設計したストレージエンジンを持つ。

設計の特徴:
  6つのストレージノードに分散書き込み(3AZ × 2コピー)
  4/6のクォーラムで書き込み確認
  
  WALの書き込みだけネットワーク経由 → 通常のPostgreSQLより高速
  読み取りレプリカは最大15台(Aurora Replicaはラグがほぼゼロ)

Aurora Serverless v2:
  0.5〜128 ACU(Aurora Capacity Unit)の間で自動スケール
  秒単位での課金
  コールドスタートがほぼなし(接続プールを維持)
  
向いている用途:
  可用性が最優先のエンタープライズ
  読み取りスケールが必要(レプリカを多数)
  既存のMySQL/PostgreSQLアプリの移行

Neon

PostgreSQL互換のサーバーレスDB。コンピュートとストレージの分離を最も徹底。

設計の特徴:
  コンピュートノード(Compute)とページサーバー(Pageserver)を完全分離
  
  ページサーバー: Rustで書かれた分散ストレージ
    → S3に変更差分を書き込む
    → PostgreSQLのWALをそのまま受け取る
  
  コンピュートノード:
    → ページサーバーからページをオンデマンドで取得
    → 使用しないと5秒でスリープ(ゼロへスケール)
    → スリープから復帰は〜500ms
  
ブランチ機能(最大の特徴):
  DBをGitのようにブランチできる
  main ブランチのコピーをミリ秒で作成
  → プルリクエストごとにDBブランチを作れる
  → ステージング環境のDBを瞬時に複製
  
向いている用途:
  開発・テスト環境(ブランチが便利)
  トラフィックが不規則なサービス
  サーバーレス(Vercel Edge Functions等)

PlanetScale

MySQL互換。VitessをベースにしたサーバーレスDB。

Vitessとは:
  YouTubeがMySQLのシャーディングのために開発したプロキシ
  MySQLの前に置いてシャーディングを透過的に行う

PlanetScaleの特徴:
  スキーマ変更をブランチで管理(DBのGitワークフロー)
    main ← feature/add-column のようなマージリクエスト
    バックグラウンドで無停止マイグレーション
  
  外部キー制約をサポートしない
    → アプリ層で整合性を保証する必要がある
    → その代わり超高速シャーディングが可能
  
向いている用途:
  大規模書き込みが必要なMySQL互換サービス
  スキーマ変更が頻繁なチーム
  (外部キー不要の設計ができるチーム)

Google AlloyDB

PostgreSQL互換。Spannerの技術を転用。

設計の特徴:
  PostgreSQLのクエリエンジン + Googleの分散ストレージ
  
  ログ処理サービス(Log Processing Service):
    WALをPostgreSQLから受け取り、
    列指向のフォーマットに変換してキャッシュ
    → OLTPとOLAPを同一DBで処理(HTAP)
  
  機械学習によるバキューム最適化
  自動チューニング(human-in-the-loop)
  
向いている用途:
  GCPユーザーで高パフォーマンスが必要
  OLTPとOLAPを統合したい

Supabase

PostgreSQLをベースにしたBaaS(Backend as a Service)。

提供機能:
  PostgreSQL(本体)
  PostgREST(自動REST API生成)
  Realtime(変更ストリームのWebSocket配信)
  Storage(ファイルストレージ)
  Auth(認証)
  Edge Functions(Deno)
  
特徴:
  Row Level Securityを前面に出した設計
  クライアントからDBに直接アクセスできる(APIサーバー不要)
  
向いている用途:
  スタートアップ・個人開発(フルスタックを速く作りたい)
  PostgreSQLの機能をフルに使いたい

Turso(libSQL / SQLite)

SQLiteをエッジに分散させたDB。

libSQLとは:
  SQLiteのフォーク。レプリケーションを追加。
  
Tursoの特徴:
  プライマリ1台 + エッジレプリカ(世界中のCloudflare PoP)
  書き込みはプライマリへ、読み取りはエッジから(低レイテンシ)
  マルチテナント向け(テナントごとに独立したDB)
  
向いている用途:
  エッジコンピューティング(Cloudflare Workers)
  マルチテナントSaaSで数万テナント規模
  読み取り多い・地理分散が必要

選択マトリクス

要件推奨サービス
PostgreSQL互換・高可用性Aurora / AlloyDB
サーバーレス・ゼロスケールNeon / Aurora Serverless v2
開発体験・ブランチ機能Neon / PlanetScale
大規模書き込みスケールPlanetScale(MySQL) / CockroachDB
フルスタック・高速開発Supabase
エッジ・地理分散Turso
HTAP(OLTP+OLAP)TiDB / AlloyDB
自己ホストで完全コントロールPostgreSQL + pgBackRest

コスト構造の違い

プロビジョンドモデル(Aurora Provisioned, RDS):
  常時起動 → 使っていなくても課金
  スペックを事前に決める → 過不足が生じる

サーバーレスモデル(Neon, Aurora Serverless, PlanetScale):
  使った分だけ課金
  ゼロスケールで待機コストなし
  バースト時に自動スケール
  
注意:
  トラフィックが安定・高負荷なら
  プロビジョンドの方が安くなることも多い

関連概念

出典・参考文献

  • Amazon Aurora Documentation — docs.aws.amazon.com/aurora
  • Neon Documentation — neon.tech/docs
  • PlanetScale Documentation — planetscale.com/docs
  • Google AlloyDB Documentation — cloud.google.com/alloydb/docs
  1. 1. 🗄️データ志向アプリケーション設計:概要
  2. 2. 🧩データモデルとクエリ言語
  3. 3. 💾ストレージエンジンとインデックス
  4. 4. 🔁レプリケーション
  5. 5. 🍕パーティショニング(シャーディング)
  6. 6. 🔒トランザクションとACID
  7. 7. 分散システムの本質的な問題
  8. 8. 🤝一貫性と分散合意
  9. 9. 📦バッチ処理
  10. 10. 🌊ストリーム処理
  11. 11. 📋エンコーディングとスキーマ進化
  12. 12. 🔗Sagaパターンと分散トランザクション
  13. 13. 🏗️データシステムの統合設計
  14. 14. 📸MVCC(多版型同時実行制御)
  15. 15. 📊列指向ストレージとOLAP設計
  16. 16. 🕰️ベクタークロックと因果順序
  17. 17. 🔀CRDT(競合なし複製データ型)
  18. 18. 🔍クエリオプティマイザーと実行計画
  19. 19. キャッシュ戦略とRedis設計
  20. 20. 🔎全文検索と転置インデックス
  21. 21. 🌐NewSQL(分散ACIDデータベース)
  22. 22. 📝WALと論理レプリケーション
  23. 23. 🔌コネクションプーリング
  24. 24. 🚧ゼロダウンタイムマイグレーション
  25. 25. 🆔分散ID生成
  26. 26. 🔄N+1問題とDataLoaderパターン
  27. 27. 📈タイムシリーズDB
  28. 28. 🛡️Row Level Security(行レベルセキュリティ)
  29. 29. 📤Outboxパターン(トランザクショナルアウトボックス)
  30. 30. 💾DBバックアップとPITR
  31. 31. ⚠️データベース設計アンチパターン
  32. 32. 🕸️グラフDB深掘り
  33. 33. 🔋バックプレッシャーとサーキットブレーカー
  34. 34. 🔵コンシステントハッシング
  35. 35. 📋マテリアライズドビュー
  36. 36. 📡DBモニタリングとオブザーバビリティ
  37. 37. 🔐データプライバシーとCrypto-Shredding
  38. 38. ✂️垂直分割(Vertical Partitioning)
  39. 39. 🪟ウィンドウ関数
  40. 40. 🧲ベクトルDBとpgvector
  41. 41. 🔧dbtとデータ変換パイプライン
  42. 42. 📬ジョブキューの設計
  43. 43. 📐正規化理論(1NF〜BCNF)
  44. 44. ☁️クラウドDBサービスの設計思想と選択基準
  45. 45. 🗺️地理空間データとPostGIS
  46. 46. 🔑DBセキュリティと権限管理
  47. 47. 🏔️Lakehouse(Apache Iceberg / Delta Lake)
  48. 48. 📜データコントラクト
  49. 49. 🔭OpenTelemetryとDBトレーシング

出典: Martin Kleppmann, 'Designing Data-Intensive Applications' (2017) / 各サービス公式ドキュメント