セルレベル TTL のシミュレーション
Bigtable では、ガベージ コレクション ポリシーは列ファミリー レベルで設定され、セルレベルのガベージ コレクション ポリシーを指定することはできません。ただし、ガベージ コレクションの設定を変更することで、セルレベルで有効期間(TTL)ポリシーをシミュレートできます。このページでは、使用できる方法をいくつか説明します。
このページをお読みいただく前に、ガベージ コレクションの概要をご覧ください。タイムスタンプを含む書き込みリクエストを送信する方法については、Bigtable の書き込みをご覧ください。
1 秒の有効期限
この方法では、データが 1 秒後に期限切れになるようにガベージ コレクション ルールを設定します。データを書き込むときはいつでも、セルのタイムスタンプを、値を期限切れにしたい時刻に設定します。圧縮中、Bigtable は 1 秒以上前のタイムスタンプを持つセルを削除します。たとえば、セルのタイムスタンプを 4 月 30 日午前 9 時 00 分 00 秒に設定した場合、そのセルは 4 月 30 日午前 9 時 00 分 01 秒以降のある時点で削除されます。この方法では、同じ列ファミリーの異なるセルに異なる有効期限値を設定できます。
1 秒の有効期限のメリット
- タイムスタンプには「有効期限」という真の意味があります。
1 秒の有効期限のデメリット
この Bigtable の列ファミリーにデータを書き込むアプリケーションはすべて、このルールに従うように構成する必要があります。書き込み時にデフォルトのサーバーのタイムスタンプを忘れて使用した場合、そのデータはすぐに期限切れになり、次回のコンパクション時に削除されます。
タイムスタンプは「実際のもの」ではないため、値がいつ書き込まれたかを判断するなど、他のユースケースにタイムスタンプを使用することはできません。回避策として、実際のタイムスタンプを別の列に書き込めますが、そうすると格納するデータ量が増えます。
実際のタイムスタンプを持つデータがすでにある列ファミリーには、この方法を行うことはできません。既存のデータに実際のタイムスタンプがある場合、または実際のタイムスタンプを持つ新しいデータを誤って書き込んだ場合、そのデータは次回のコンパクション時に削除されます。
特定の行と列のセルを複数同時に期限切れにするように指定することはできません。新しいデータが、同じタイムスタンプを持つ古いデータを上書きします。
ガベージ コレクションには最長で 1 週間かかることがあるので、データを読み取るときは常にフィルタを使用する必要があります。
デフォルトの有効期限
ほとんどのデータにはデフォルトの TTL を設定したいが、一部のデータにセルごとに異なる有効期限値を設定したいとします。
たとえば、お客様 10 社のクリック イベントを 1 つのテーブルに格納するとします。ほとんどのクリック イベントは 2 日後に期限切れになりますが、クリック イベントが 1 時間後に期限切れになるお客様が 1 社、クリック イベントが 3 日後に期限切れになるお客様が 1 社あります。
この方法では、ガベージ コレクションの有効期間をデフォルトの TTL に設定して列ファミリーを作成します。デフォルトより早く期限切れにしたいデータの場合は、データが実際に書き込まれる時刻より早くなるようにタイムスタンプを設定します。デフォルトより遅く期限切れにしたいデータの場合は、データが実際に書き込まれる時刻より遅くなるようにタイムスタンプを設定します。
デフォルトの有効期限のメリット
カスタムの TTL がない書き込みには、デフォルトの TTL が用意されています。
このアプローチは、既存のテーブルに支障なく適用できます。
デフォルトの有効期限のデメリット
セルのタイムスタンプは実際のものか人工的なものかわからないので、タイムスタンプは意味的には重要ではありません。つまり、値がいつ書き込まれたかを判断するなど、他のユースケースにセルのタイムスタンプを使用することはできません。回避策として、実際のタイムスタンプを別の列に書き込めますが、そうすると格納するデータ量が増えます。
特定の列にある実際のタイムスタンプと一致するカスタムのタイムスタンプを誤って書き込むことがあります。
ガベージ コレクションは非同期なので、この方法を使用する際にデータを読み取るときは、常にフィルタを使用する必要があります。
次のステップ
- 連番のタイムスタンプの場合のガベージ コレクションについて読む。
- 常に列の最新の値を読み取る方法を学ぶ。
- ガベージ コレクションの構成方法を示すコードサンプルを確認する。
- ストレージ料金の詳細を確認する。