TTL 2038年問題による期限切れデータの回復

サポートされている最大TTL日より後のTTLタイムスタンプが原因で削除されたデータを回復します。

5.1.XシリーズのDataStax Enterpriseバージョン5.1.7および5.0.Xシリーズの5.0.12以前では、TTL有効期限のタイムスタンプがストレージエンジンが表すことができる最大日付(2038-01-19T03:14:06+00:00)より後である場合、INSERTSに対する保護はありませんでした。5.1.7または5.0.12以前では、有効期限タイムスタンプとしてそれより後の日付が挿入された場合、日付計算がオーバーフローしてデータが即時に期限切れになりました。オーバーフローによって期限切れになったレコードは照会できず、コンパクション後に恒久的に削除されます。この問題は、TTL値の期間が最大値630720000秒(20年)に近いような長いINSERTでのみ発生します。有効期限タイムスタンプの最も早い日付オーバーフローは、2018-01-19T03:14:06+00:00です。時間が経過して、日付2038-01-19T03:14:06+00:00に近づくにつれて、最大サポートTTLは徐々に減少します。

バックアップされた、または圧縮されていないSSTableからオーバーフローしたタイムスタンプを使用してデータを回復するには、--reinsert-overflowed-ttlオプションを使用します。

ヒント: SSTableに有効期限がオーバーフローしたエントリーがあるかどうかを調べるには、sstablemetadataツールを使用して、min local deletion timeフィールドの値が負のエントリーを探します。この状態のSSTableのデータはコンパクション中に失われる可能性があるため、直ちにバックアップしてください。

cassandra.yaml

cassandra.yamlファイルの場所は、インストールのタイプによって異なります。
パッケージ・インストール /etc/dse/cassandra/cassandra.yaml
tarボール・インストール installation_location/resources/cassandra/conf/cassandra.yaml
必ず、以下のいずれかの方法を使用してください。

オフラインscrub

オフラインscrubの場合は、バックアップされたSSTableからデータを回復するために、sstablescrubコマンドに--reinsert-overflowed-ttlパラメーターを指定します。

DSEバージョン リンク
DSE 6.7 sstablescrub --reinsert-overflowed-ttl
DSE 6.0 sstablescrub --reinsert-overflowed-ttl
DSE 5.1.7以降 sstablescrub --reinsert-overflowed-ttl
DSE 5.0.12以降 sstablescrub --reinsert-overflowed-ttl
DSE 4.8.16 sstablescrub --reinsert-overflowed-ttl

オンラインscrub

オンラインscrubの場合は、コンパクションが完了していないテーブルからデータを回復するために、nodetool scrubコマンドに--reinsert-overflowed-ttlパラメーターを指定します。

DSEバージョン リンク
DSE 6.7 nodetool --reinsert-overflowed-ttl
DSE 6.0 nodetool --reinsert-overflowed-ttl
DSE 5.1.7以降 nodetool --reinsert-overflowed-ttl
DSE 5.0.12以降 nodetool --reinsert-overflowed-ttl
DSE 4.8.16 nodetool --reinsert-overflowed-ttl

手順

  • バックアップされたSSTableからデータを回復するには、オフラインscrubオプションを使用します。
    1. データ・ディレクトリー・ツリーを別の場所に複製します。フォルダーとシステム・テーブルの内容だけを保管してください。
    2. 構成ディレクトリーを別の場所に複製します。複製したcassandra.yaml内でdata_file_directoriesプロパティを、複製したデータ・ディレクトリーに設定します。
    3. 影響を受けるSSTableを、影響を受けるテーブルの複製されたデータ場所にコピーします。
    4. 環境変数CASSANDRA_CONF=cloned_configuration_directoryを設定します。
    5. 次のコマンドを実行してテーブルを更新します。
      sstablescrub --reinsert-overflowed-ttl keyspace_name table_name
    6. スクラブが完了したら、作成したSSTableを元のデータ・ディレクトリーにコピーします。
    7. 稼働中のノードでnodetool refreshを使用して、回復したSSTableを読み込みます。
  • コンパクションが完了していないテーブルからデータを回復するには、オンラインscrubオプションを使用します。
    1. ノードのコンパクションを無効にします。
      nodetool disableautocompaction
      警告: このステップは、非常に重要です。データはコンパクション中に恒久的に削除される可能性があります。
    2. 有効期限がオーバーフローしたエントリーのあるSSTableをデータ・ディレクトリーにコピーします。
    3. SSTableを読み込みます。
      nodetool refresh
    4. オーバーフロー再挿入オプションを指定して、テーブルにscrubコマンドを実行します。
      nodetool scrub --reinsert-overflowed-ttl keyspace_name table_name
    5. インデックス付きテーブルの場合、再挿入する値を読み込み、インデックスを再作成するには、Searchノードで次のようにdsetool reload_coreコマンドを使用します。
      dsetool reload_core reindex=true keyspace_name.table_name
    6. 足りないエントリがスクラブにより回復したことを確認してから、再度コンパクションを有効にします。