PCDBE 合格対策
🔬 DEEP DIVE

Cloud Spanner ディープダイブ

公式ドキュメントに基づく TrueTime / Paxos / Splits / Multi-region Quorum の徹底解説。Spanner を選ぶべき真の理由を理解する。

グローバル分散 外部整合性 99.999% 水平スケール

📑 目次

  1. 1. Spanner を選ぶ「絶対条件」
  2. 2. Instance Config(Regional / Dual / Multi)
  3. 3. Replica の種類と Paxos Quorum
  4. 4. TrueTime API — 物理時計が解く分散課題
  5. 5. Splits と自動シャーディング
  6. 6. スキーマ設計 — Interleaving とホットスポット
  7. 7. Processing Units と容量計画
  8. 8. Backup と PITR
  9. 9. 制約 / Cloud SQL との使い分け

1. Spanner を選ぶ「絶対条件」

Spanner は次の 3 つすべてを満たすときだけが正解。1 つでも欠けたら別 DB を検討。
  1. グローバル分散(複数リージョンで読み書きする必要がある)
  2. 強整合性 + ACID(金融、在庫など)
  3. 無制限の水平スケール(書き込み QPS が Cloud SQL 上限を超える)

2. Instance Config — 3 つの選択肢

ConfigSLAReplica 構成Edition用途
Regional 99.99% 3 read-write replicas (3ゾーン) Standard / Enterprise / Enterprise Plus 単一地域内で水平スケール
Dual-region 99.999% 各リージョンに 2 RW + 1 Witness = 計6 Enterprise Plus のみ 1国内 2リージョン構成
Multi-region 99.999% 2 RW region + 1 Witness region Enterprise Plus のみ グローバル分散

主要 Multi-region Config

Configリージョン構成
nam3北米:us-east4, us-east1 + 米中部 (Witness)
nam-eur-asia13大陸:北米 + 欧州 + アジア (グローバル)
eur3欧州:europe-west1, europe-west4 + 中部 (Witness)
asia1東アジア:asia-northeast1 (東京) + asia-northeast2 (大阪)
asia2asia-northeast1 (東京) + asia-east1 (台湾)

3. Replica の種類と Paxos Quorum

Spanner は Paxos プロトコル で書き込みの合意を取る。Replica は 3 種類存在する。

Read-Write Replica

  • Paxos voter
  • 書き込みに参加
  • 読み取り両方可

Read-Only Replica

  • Paxos 非参加
  • 読み取り専用
  • 低レイテンシ読み取り用

Witness Replica

  • Paxos voter
  • データ完全保持しない
  • タイブレーカー
  • コスト最小

Quorum の取り方(Multi-region 例)

Multi-region (例: nam3) ┌─────────────────────────────────────────────────┐ │ Region A (default leader) │ │ ├── RW Replica 1 (voter) ← writeのリーダー候補│ │ └── RW Replica 2 (voter) │ ├─────────────────────────────────────────────────┤ │ Region B │ │ ├── RW Replica 3 (voter) │ │ └── RW Replica 4 (voter) │ ├─────────────────────────────────────────────────┤ │ Region C (witness only) │ │ └── Witness Replica 5 (voter, data minimal) │ └─────────────────────────────────────────────────┘ Write Quorum: "1 leader replica + any 2 of the additional 4 voting replicas" 合計 5 voters → 3 票必要 (majority) → どこか 1 リージョン全滅でも write 継続可能
Write Latency: Multi-region では 最寄りの 2 voter の応答待ちが必要なため、Regional より数十 ms 遅い。読み取りは Read-Only Replica で 各リージョン内に閉じる。

4. TrueTime API — 物理時計が解く分散課題

分散システムで「どっちのトランザクションが先か」を決めるのは非常に難しい。論理時計(Vector Clock)では順序付けが「部分順序」しか取れない。Spanner は GPS + 原子時計を全データセンターに配置し、物理時刻に基づく全順序を実現。

TrueTime API: TT.now() → [earliest, latest] 例: TT.now() = [12:00:00.001, 12:00:00.007] 6 ms の不確かさ (epsilon) Spanner はコミット時刻に「epsilon を待つ」ことで どこのリージョンでも commit_ts より小さい時刻のクエリは 「絶対にこの commit より前」と保証できる。 これにより External Consistency (外部整合性) = 「人間の時間感覚と一致する順序」を実現。
外部整合性 (External Consistency) = Linearizability の強化版。「先にコミットされたトランザクションは、後のすべての読み取りで先に見える」ことを世界中で保証。これが Spanner だけが提供する独自価値

5. Splits と自動シャーディング

Spanner は テーブルを Splits(スプリット)と呼ぶ単位に自動分割する。スプリットは主キーの範囲で定義され、独立して別のサーバー(ノード)に配置される。

Users テーブル (UserId が主キー) ┌────────────────────┐ ┌────────────────────┐ ┌────────────────────┐ │ Split 1: UserId 1-1000│ │ Split 2: 1001-5000 │ │ Split 3: 5001-∞ │ │ サーバー A │ │ サーバー B │ │ サーバー C │ └────────────────────┘ └────────────────────┘ └────────────────────┘ 自動分割条件: - サイズ閾値 (例: 8 GB) - 負荷集中 (1 split に書き込み集中) 問題: 連番主キー (Sequence / 昇順タイムスタンプ) は 常に最後の split に書き込みが集中 → ホットスポット → 性能劣化

6. スキーマ設計 — Interleaving とホットスポット

6-1. Interleaving (親子テーブル)

Spanner では 親子関係のあるテーブルを物理的に同じスプリットに配置できる。これにより JOIN が「同一サーバー内」で完結し、超高速化。

CREATE TABLE Customer (
  CustomerId INT64 NOT NULL,
  Name STRING(MAX)
) PRIMARY KEY (CustomerId);

CREATE TABLE Order (
  CustomerId INT64 NOT NULL,
  OrderId    INT64 NOT NULL,
  Total      NUMERIC
) PRIMARY KEY (CustomerId, OrderId),
  INTERLEAVE IN PARENT Customer ON DELETE CASCADE;
親子のキーは 子の主キーが親の主キーで始まる必要がある。(CustomerId, OrderId) のように親キー CustomerId が先頭。

6-2. ホットスポット回避

連番・昇順タイムスタンプの主キーは禁忌。書き込みが末尾スプリットに集中し、Spanner の水平スケールが効かなくなる。Cloud SQL/Postgres の常識を持ち込むと不正解。

主キー設計パターン

パターン評価
連番 (BAD)1, 2, 3, ...ホットスポット
昇順タイムスタンプ (BAD)2026-05-30T10:00:01, ...ホットスポット
UUID v4 (GOOD)ランダム均等分散
反転タイムスタンプ (GOOD)9999999999 - ts時系列も均等分散
ハッシュプレフィックス (GOOD)shard_n# + 業務キー範囲スキャンしたい時

7. Processing Units と容量計画

最小単位
100 PU
= 1/10 node
Node 換算
1000 PU
= 1 node
推奨 CPU 上限
65%
超えたらスケール
スケール時のダウンタイム
0
オンライン変更

サイジングの考え方

  1. ベースラインの推定 最も負荷のあるユースケース(ピーク QPS)を想定し、ロードテスト
  2. 初期 PU 設定 テスト結果から CPU 65% 以下に収まる PU 数を設定
  3. オートスケーリング有効化 spanner-autoscaler で High CPU 利用率時に自動拡張
  4. 監視 Latency p95/p99、Storage、High Priority CPU の 3 指標を継続監視
過小プロビジョニング: 「コスト最適化のために 100 PU から始める」というシナリオで、ピーク時に CPU 80% を超えるとレイテンシ急増。初期は余裕を持って設定、Auto-scaler で縮小も自動化

8. Backup と PITR

項目
PITR 最大保持期間7日
Backup 最大保持期間1年 (365日)
Backup タイプFull backup (Spanner 内部形式)
Cross-region Backup コピー可能(Backup Schedules)
Restore 先同インスタンス or 別インスタンス
Export to GCSAvro 形式(Dataflow テンプレート)

9. 制約 / Cloud SQL との使い分け

Spanner はオーバーキルになりやすい。「念のため Multi-region」を選ぶと、Regional の 10 倍コストになる可能性。要件を厳密に確認。
Spanner SQL は標準 SQL に近いが完全互換ではない。Stored Procedure 非対応(最近 PL/pgSQL 対応開始)、JSON 操作の方言、Foreign Key の動作差異。既存 PostgreSQL アプリの単純移行は不可。

使い分けマトリクス

要件選択
単一リージョン + 中規模 OLTPCloud SQL / AlloyDB
単一リージョン + 100K QPS 超Spanner Regional
グローバル + 強整合 + 99.99%Spanner Regional 数本 + Cross-region Backup
グローバル + 強整合 + 99.999%Spanner Multi-region
分析 (OLAP) 中心BigQuery
PostgreSQL Stored Procedure 重依存AlloyDB (Spanner PG Interface でも一部可)

試験頻出のひっかけ

「グローバル ECサイト」だけで Spanner を選ぶと罠。「強整合性」「99.999%」「水平スケール」のキーワードが揃わなければ、Cloud SQL + クロスリージョン リードレプリカでも要件を満たす場合がある(コスト差大)。
公式参考リソース