PCDBE 合格対策
🔬 DEEP DIVE

Cloud Bigtable ディープダイブ

公式ドキュメントに基づく クラスタ・App Profile・行キー設計・Key Visualizer の徹底解説。スキーマ設計が「100% を決める」NoSQL。

時系列 IoT 10,000 QPS/Node HBase API 互換

📑 目次

  1. 1. Bigtable を選ぶシグナル
  2. 2. Instance / Cluster / Node / Tablet
  3. 3. レプリケーションと App Profile
  4. 4. 整合性モデル(read-your-writes vs eventual)
  5. 5. 行キー設計 — Bigtable の生命線
  6. 6. 列ファミリと列修飾子
  7. 7. SSD vs HDD と料金
  8. 8. Key Visualizer でホットスポット検出
  9. 9. 落とし穴と試験頻出

1. Bigtable を選ぶシグナル

次のうち 2 つ以上該当すれば Bigtable が最適解の可能性大。
Bigtable NG なシナリオ:

2. Instance / Cluster / Node / Tablet

┌─────────────────────────────────────────────────────────┐ │ Bigtable Instance │ │ ├─ Cluster A (us-central1-a) │ │ │ ├─ Node 1, 2, 3 ... N (各 ≒ 10,000 QPS) │ │ │ └─ Tablets (実データ。行キー範囲で分割) │ │ ├─ Cluster B (us-east1-b) (replication ターゲット) │ │ └─ Cluster C (asia-northeast1-a) │ │ │ │ ┌─ App Profile (ルーティング設定) │ │ │ default-profile: multi-cluster routing │ │ │ batch-profile: single-cluster routing (cluster-A) │ │ └────────────────────────────────────────────────────────│ └─────────────────────────────────────────────────────────┘
Instance の最大構成: 最大 8 リージョン、各リージョンに 1 クラスタ/ゾーン(つまり最大 8 リージョン × 3 ゾーン = 24 クラスタ)。
Node 性能: 1 ノード ≒ 10,000 QPS(SSD, KV アクセス)。実際は行サイズや並列度で変動。

Tablet の動作

Bigtable はテーブルを 行キーの範囲(ロウ範囲)Tablet に自動分割する。Tablet は 1 つの Node が責任を持ち、サイズ拡大や負荷集中で自動的に分割・再配置される。

3. レプリケーションと App Profile

マルチクラスタ構成では、Bigtable は 非同期で各クラスタにデータを伝播する。これはマスターレス設計で、どのクラスタも書き込みを受け付ける。

レプリケーション遅延(公式):「If your instance is responsive, the latency for replication is typically a few seconds or minutes.」
→ 通常は数秒、遅くても数分。完全な同期は保証されない。

Routing Policy

Policy動作整合性SLA用途
Single-cluster routing 1 クラスタ固定 read-your-writes 99.9% バッチ処理、整合性必須
Multi-cluster routing 最寄り/任意のクラスタ eventual 99.999% HA + 低レイテンシ
Cluster group routing 指定グループ内で振り分け eventual 99.999% 地域別ターゲット
Row-affinity routing 行キーハッシュで分散 特定行は同 cluster へ 99.999% read-after-write を保ちつつ HA
App Profile の使い分け: アプリ毎に App Profile を分けると、同じ Bigtable インスタンスで「分析バッチは single-cluster routing、リアルタイム配信は multi-cluster routing」のような ワークロード分離が可能。

4. 整合性モデル

マルチクラスタ ルーティング = eventual consistency。書いた直後に別クラスタから読むと「まだ古いデータが返る」可能性。
: ユーザーが東京クラスタに書き込み → 直後に台湾クラスタから読み取り → 数秒間は反映されない。

Write Conflict Resolution

異なるクラスタに同じセル(4-tuple: row key, column family, column qualifier, timestamp)への書き込みが衝突した場合、Bigtable は "Last Write Wins"(サーバー時刻ベース)で自動解決する。

5. 行キー設計 — Bigtable の生命線

Bigtable の性能は 行キーの設計で 90% 決まる。テーブルにはインデックスが 行キーしかないため、行キー = 唯一のクエリパス。

5-1. ホットスポット問題

時系列センサーデータ (悪い例) 行キー = "sensor1_2026-05-30T10:00:00.000" "sensor1_2026-05-30T10:00:00.001" "sensor1_2026-05-30T10:00:00.002" ... → 同センサーの書き込みが順次同じ Tablet に集中 → 1 Node に負荷集中 → 性能劣化 (ホットスポット) 対策1: タイムスタンプ反転 (Reverse Timestamp) 行キー = "sensor1_" + (LONG_MAX - ts) → 新しい書き込みは行範囲の "頭" 寄り → 直近データ取得時はスキャンも自然な順序 対策2: ハッシュプレフィックス (Salting) 行キー = hash(sensor_id) % 16 + "#" + sensor_id + "_" + ts → 16 個の Tablet に均等分散 → ただしセンサー単位の範囲スキャンが分散され遅くなるトレードオフ

5-2. クエリパターンと行キー設計

クエリ推奨行キー
「センサー X の直近 1 時間」sensor_X#reverse_ts
「全センサー、特定時刻のスナップショット」ts#sensor_id
「ユーザー Y のアクション履歴」user_Y#reverse_ts
「直近 1 時間の全アクション」※ 苦手。BigQuery の方が向く
SQL の感覚で複数インデックスを期待しない。Bigtable はセカンダリインデックス非対応。複数のクエリパターンが必要なら同じデータを別の行キーで 2 テーブルに保持(denormalization)するのが正解。

6. 列ファミリと列修飾子

Bigtable のセルアドレス = (Row Key, Column Family, Column Qualifier, Timestamp) Row Key: "sensor1#reverse_ts" ├── Column Family: "telemetry" │ ├── temperature: 22.3 │ ├── humidity: 65 │ └── pressure: 1013 └── Column Family: "metadata" ├── location: "Tokyo" └── model: "v2"
列ファミリ数の制限: 通常 最大 100 個を超えないこと。多すぎると性能劣化。
列修飾子: 1 セルあたり最大 100MB(推奨 < 10MB)。1 行全体で最大 256MB(推奨 < 100MB)。

列ファミリの設計指針

7. SSD vs HDD と料金

項目SSDHDD
レイテンシ数ミリ秒数十〜数百ミリ秒
QPS / Node~ 10,000 (read+write)~ 500 (read), ~ 10,000 (write)
料金標準約 1/4
容量上限16 TB / Node64 TB / Node
用途本番、低レイテンシ参照バックアップ、アーカイブ、低頻度アクセス
SSD/HDD は後から変更不可。クラスタ作成時に決定する必要があり、変更したい場合は新クラスタを作って レプリケーションで移行する必要がある。

8. Key Visualizer でホットスポット検出

Key Visualizer は 行キー範囲(Y軸) × 時間(X軸) のヒートマップ。色の明るさが負荷を示す。

ホットスポットの典型パターン Y軸 = 行キー範囲 | X軸 = 時間 → ↓ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ← 末尾行に書き込み集中 → 連番主キーの典型症状 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 対策: タイムスタンプ反転 or ハッシュプレフィックスで分散
Key Visualizer の制約:

9. 落とし穴と試験頻出

セカンダリインデックスがない: SQL の感覚で「created_at にインデックス追加」はできない。クエリパターンを先に決め、それを行キーとして設計する。
クラスタ数とノード数の上限: クォータ上、デフォルトでは 1 インスタンスあたり ~30 ノード。大規模ならクォータ申請が必要。
マルチクラスタ ルーティング = 必ず eventual consistency。「Multi-cluster routing で強整合」を選ぶと不正解。強整合が必要なら Single-cluster routing または Row-affinity routing

試験頻出のひっかけ

問題文NG 回答正解
センサー時系列、高 QPS、低レイテンシ Firestore Bigtable + reverse_ts
マルチリージョン分散 + 強整合 Bigtable Multi-cluster Spanner Multi-region
Bigtable で複雑な範囲クエリ セカンダリインデックス追加 別の行キーで 2 テーブル + 同期書き込み
ホットスポット解消 ノード追加 行キー再設計
公式参考リソース