Cloud SpannerのTTLを利用したデータの自動削除

この記事は「GCP(Google Cloud Platform) Advent Calendar 2022」の23日目のエントリーです。

Cloud SpannerはGoogle Cloud Platformで提供されている、フルマネージドなリレーショナルデータベースです。
Cloud SpannerにはTTL(データの有効期限)を設定して、自動でデータ削除する仕組みが備わっています。

なぜTTLが必要なのか?

サービスは運営を続けるとデータ量は右肩上がりに増加していきます。
大量のデータを抱えたデータベースには以下のような問題が発生してきます。

  • ストレージ/バックアップ費用が増大する
  • ストレージ確保のためにCloud Spannerのノード数を増やす必要がある
  • クエリでスキャンする行数が増え、クエリのパフォーマンスが悪化する
  • 法律遵守のために特定期間しか保持してはいけないデータがある場合、データ削除のバッチ処理を定期的に実行するなどの対応が必要になる

大規模なサービスになればなるほど、これらの問題には直面する可能性は高くなります。
従来のデータベースでは、特定時期より前に生成されたデータを定期的に削除するような仕組みを自前で用意する必要がありました。

Cloud Spannerには標準でTTLの機能が備わっており簡単に自動データ削除を実現することができます。

TTLを設定する

例えば以下のようなテーブルがあるとします。

CREATE TABLE ShopOrders (
    ShopOrderId STRING(32) NOT NULL, -- 主キー
    CustomerId STRING(32) NOT NULL, -- 顧客ID
    Detail STRING(MAX) NOT NULL, -- 詳細
    CreatedAt TIMESTAMP NOT NULL, -- 注文作成日時
    UpdatedAt TIMESTAMP NOT NULL -- 注文更新日時
) PRIMARY KEY (ShopOrderId);

これは注文データを保存するテーブルで、顧客が注文をするとデータが1つ増加します。
最初は大きな問題にはならないですが、何年も利用しているとデータが増えすぎてしまいます。

何年も前の注文データは残しておく必要はあるでしょうか?
少なくともデータベース上には必要はないケースがほとんどだと思います。

では、直近3ヶ月(90日)のデータだけを残してデータが自動削除されるように設定してみたいと思います。

ALTER TABLE ShopOrders ADD ROW DELETION POLICY (OLDER_THAN(CreatedAt, INTERVAL 90 DAY));

ALTER文を実行するだけです。
こうすることで、CreatedAtから90日経過したデータを自動削除してくれるようになります。
※ CREATE TABLEで指定する方法もあります。

データに存在するTIMESTAMPを指定して「○日経過したデータを削除する」というような設定がおこなえるため、テーブルの設計時に基準となるカラムを追加しておけば後々楽ができます。

まとめ

Cloud SpannerにはTTLを設定して簡単に自動データ削除が実現できます。 自動データ削除には以下のようなメリットがあります。

  • ストレージ/バックアップ費用が削減できる
  • クエリでスキャンする行数が減り、クエリのパフォーマンスが向上する
  • 法律遵守のために特定期間しか保持してはいけないデータがある場合、簡単に削除ができる

また、TTLの設定はROW DELETION POLICYを実行するだけとお手軽に導入ができます。

この記事では簡単な条件指定だけでしたが、「注文を処理したものだけを削除する」というような高度な条件指定もできますので、公式ドキュメントなどを参考にしてください。

cloud.google.com

cloud.google.com