【実務・中級編】 行削除ポリシー – Cloud Spanner

Cloud SpannerのTTL(Time To Live)という「諸刃の剣」を正しく使いこなすための設計哲学

エンジニア諸君、設計レビューお疲れ様。今回は「Cloud SpannerのTTL(Time To Live)」についてだ。

「古いデータを自動で消してくれるなら、運用負荷が下がってハッピー」——そう短絡的に考えているなら、一度立ち止まってほしい。Cloud SpannerのTTLは、ただの「自動削除機能」ではない。これは、分散データベースの整合性とパフォーマンスのバランスを、物理的な期限で強制的にコントロールする高度な仕組みだ。

今回は、この機能を単なる「お掃除」として終わらせず、システム全体の堅牢性を担保するための設計指針を授ける。

—

1. TTLのメカニズム:バックグラウンドで何が起きているか

TTLを有効にすると、Spannerは行単位で「削除期限」を追跡し、バックグラウンドのプロセスで該当行を物理削除する。ここで重要なのは、「削除処理がリソース(CPU/IO)を消費する」という事実だ。

  • 非同期処理の代償: 削除は直ちに実行されるわけではない。ストレージ層でガベージコレクション(GC)が走るため、削除が集中すれば当然、当該ノードの負荷は跳ね上がる。
  • ストレージの解放: 削除されたからといって、即座にノードのストレージ使用率が下がるわけではない。Spannerのマルチバージョン並行制御(MVCC)の特性を理解していれば分かる通り、古いタイムスタンプのデータが保持されている間は物理容量を占有し続ける。

2. 実践的設計パターン:TTLを「正しく」設定せよ

TTLを設定する際、以下の3点を徹底してくれ。

① 分割キー(Primary Key)との整合性

TTLの有効期限は、`ROW_DELETION_POLICY`としてテーブル定義に記述する。

— テーブル作成時のTTL設定例
CREATE TABLE AccessLogs (
LogId INT64 NOT NULL,
Timestamp TIMESTAMP NOT NULL,
Payload STRING(MAX),
) PRIMARY KEY (LogId)
TTL INTERVAL 30 DAY ON (Timestamp); — 30日経過した行を自動削除

教訓: `ON (Timestamp)` に指定するカラムは、可能な限り「データ生成時に決定し、更新されないカラム」を選ぶこと。更新頻度が高いカラムをTTLの起点にすると、メタデータの更新負荷が削除処理と競合し、パフォーマンスのボトルネックになる。

② 削除頻度のチューニング

大量のデータが一気に期限を迎える設計は避けるべきだ。「毎月1日に1億行消える」ような設定は、スパイクを引き起こす。可能な限り「データの生成時刻」に基づくTTLを設定し、削除処理が時間的に平滑化されるように設計せよ。

③ 過去読み取り(Staleness Read)への影響

Spannerの真骨頂である「過去の特定の時点を読み取る(Staleness Read)」機能とTTLは密接に関係している。TTLを短くしすぎると、分析クエリやバッチ処理で「必要な過去のデータ」を参照できなくなる。「TTLの保持期間 > ビジネス上の参照可能期間」という不等式は、絶対的な設計ルールだ。

—

3. パフォーマンス上の注意点:レビューでここを突け

私がレビューで必ず確認するポイントを共有する。

  • セカンダリインデックスの断片化:

TTLで主キー行が削除されても、セカンダリインデックスの削除も自動で行われる。しかし、インデックスが大量にあるテーブルで頻繁にTTL削除が発生すると、インデックスの「インデックス更新(削除)」が多発し、書き込みスループットを食いつぶす。

  • 対策: インデックスは必要最小限に。TTL対象テーブルにインデックスを貼る際は、その維持コストを許容できるか再計算すること。
  • 削除レートの監視:

Cloud Monitoringの「Spanner Storage」メトリクスを注視しろ。TTLによる削除が追いついているか、ノードのCPU負荷と相関関係を可視化しておく必要がある。もし「削除が追いつかない」というアラートが出たら、それはTTLの設計ミスではなく、キャパシティプランニングの失敗だ。

—

4. 最後に:アーキテクトとしての提言

「TTLがあるからデータ削除の実装が不要になった」と考えるのはジュニアレベルの思考だ。シニアエンジニアはこう考える。

「TTLはあくまで『最後の砦』であり、基本はアプリケーション層での論理削除か、あるいは生存期間を考慮したテーブル分割(Partitioning)を行うべきではないか?」

例えば、日次や週次で物理テーブルを切り替える運用の方が、TTLによる削除負荷を制御しやすく、またDrop Tableによる即時解放ができる場合もある。TTLは非常に強力だが、その「見えない負荷」を制御できて初めて、君たちは真のSpannerマスターと言える。

さあ、コードを開いてくれ。君たちの設計が、この「制御された負荷」を正しく扱えているか、今一度確認しよう。質問があればいつでも聞くぞ。

コメント

タイトルとURLをコピーしました