Skip to content

元ドキュメント: 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 の変更にはテーブルの無効化・有効化が必要です。
  • 有効期限切れデータの物理削除はコンパクション時に行われるため、ストレージの即時解放にはなりません。

Tencent Cloud プロダクトドキュメント