元ドキュメント: TTL
TTL
概要
本ドキュメントでは、TDSQL Boundless の HBase 互換モードにおけるデータバージョン管理とライフサイクル管理について説明します。最大バージョン数の設定、TTL(Time To Live)によるデータの自動有効期限管理について解説します。
バージョン管理
HBase 互換モードでは、各セルに対して複数のバージョンのデータを保持できます。バージョンはタイムスタンプで管理されます。
最大バージョン数の設定
テーブル作成時にカラムファミリーごとの最大バージョン数を設定できます。
java
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.Admin;
import org.apache.hadoop.hbase.client.ColumnFamilyDescriptorBuilder;
import org.apache.hadoop.hbase.client.TableDescriptorBuilder;
public class VersionExample {
public static void createTableWithVersions(Connection connection) throws Exception {
try (Admin admin = connection.getAdmin()) {
TableDescriptorBuilder tableBuilder = TableDescriptorBuilder
.newBuilder(TableName.valueOf("my_table"));
ColumnFamilyDescriptorBuilder cfBuilder = ColumnFamilyDescriptorBuilder
.newBuilder("cf".getBytes());
// 最大バージョン数を 5 に設定
cfBuilder.setMaxVersions(5);
// 最小バージョン数を 1 に設定(TTL 有効時に保持する最低バージョン数)
cfBuilder.setMinVersions(1);
tableBuilder.setColumnFamily(cfBuilder.build());
admin.createTable(tableBuilder.build());
System.out.println("テーブルを作成しました(最大バージョン数: 5)。");
}
}
}バージョンの読み取り
java
import org.apache.hadoop.hbase.client.Get;
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.Cell;
Get get = new Get("row_key_001".getBytes());
get.readVersions(3); // 最新 3 バージョンを取得
Result result = table.get(get);
for (Cell cell : result.rawCells()) {
System.out.printf("タイムスタンプ: %d, 値: %s%n",
cell.getTimestamp(),
Bytes.toString(cell.getValueArray(), cell.getValueOffset(), cell.getValueLength()));
}TTL(Time To Live)
TTL を設定すると、指定した期間を経過したデータが自動的に削除(有効期限切れ)されます。
テーブル作成時の TTL 設定
java
ColumnFamilyDescriptorBuilder cfBuilder = ColumnFamilyDescriptorBuilder
.newBuilder("cf".getBytes());
// TTL を 86400 秒(24 時間)に設定
cfBuilder.setTimeToLive(86400);
// 最大バージョン数
cfBuilder.setMaxVersions(3);既存テーブルの TTL 変更
java
public static void updateTTL(Connection connection) throws Exception {
try (Admin admin = connection.getAdmin()) {
TableName tableName = TableName.valueOf("my_table");
// テーブルを無効化
admin.disableTable(tableName);
// カラムファミリーの TTL を更新
ColumnFamilyDescriptorBuilder cfBuilder = ColumnFamilyDescriptorBuilder
.newBuilder("cf".getBytes());
cfBuilder.setTimeToLive(604800); // 7 日間
admin.modifyColumnFamily(tableName, cfBuilder.build());
// テーブルを有効化
admin.enableTable(tableName);
System.out.println("TTL を更新しました。");
}
}TTL の動作
有効期限切れデータの処理
- TTL を超過したデータは、読み取り操作時にフィルタリングされ、返却されません。
- 物理的な削除は、コンパクション処理時に行われます。
TTL とバージョン数の組み合わせ
TTL と最大バージョン数は同時に設定できます。両方の条件が適用されます。
| 設定 | 動作 |
|---|---|
| TTL のみ | 指定期間を超過したバージョンは有効期限切れ |
| 最大バージョン数のみ | 超過したバージョンは古いものから削除 |
| TTL + 最大バージョン数 | 両方の条件が適用。ただし最小バージョン数の設定がある場合、TTL による削除後も最低限のバージョンが保持される |
最小バージョン数と TTL の関係
minVersions を設定すると、TTL による有効期限切れが発生しても、設定した最小バージョン数は保持されます。
java
cfBuilder.setMaxVersions(5);
cfBuilder.setMinVersions(2); // TTL 有効時でも最低 2 バージョンを保持
cfBuilder.setTimeToLive(3600); // TTL: 1 時間注意事項
- TTL の単位は秒です。
- TTL を 0 に設定すると、データの自動削除は行われません(無期限)。
- TTL の変更にはテーブルの無効化・有効化が必要です。
- 有効期限切れデータの物理削除はコンパクション時に行われるため、ストレージの即時解放にはなりません。