データはどのようにして削除されるか

DataStax Enterpriseはどのようにデータを削除するのか、また削除されたデータがなぜ復活する可能性があるのか。

データを削除するプロセスは、パフォーマンスを向上させ、データ分散およびフォールト・トレランスのためのデータベースの組み込みプロパティを操作するように設計されています。

データベースは削除を挿入またはupsertとして扱います。DELETEコマンドのパーティションに追加されるデータは、トゥームストーンと呼ばれる削除マーカーです。トゥームストーンは、書き込みパスを通り、1つ以上のノードのSSTableに書き込まれます。トゥームストーンの主な特徴は、有効期限日時が組み込まれていることです。有効期限が終了すると(詳細は以下を参照)、トゥームストーンは、通常のコンパクション・プロセスの一部として削除されます。

Time To Live値を使用して、レコード(行またはカラム)にマークすることもできます。この時間が経過すると、データベースはレコードにトゥームストーンのマークを付け、トゥームストーンのマークが付いている他のレコードと同様に扱います。

分散システムでの削除

マルチノード・クラスターでは、DataStax Enterpriseデータベースは複数のノードに同じデータのレプリカを格納できます。これによりデータ喪失は防止できますが、削除プロセスが複雑になってしまいます。ノードは、ローカルに格納したデータの削除を受け取ると、指定されたレコードにトゥームストーンのマークを付け、そのレコードのレプリカが含まれている他のノードにトゥームストーンを渡します。ただし、その時点で1つのレプリカ・ノードが応答しない場合は、トゥームストーンをすぐに受け取らないため、削除前のバージョンのレコードがまだ含まれていることになります。トゥームストーンのマークを付けたレコードが、ノードの回復前に他のクラスターからすでに削除されている場合、データベースは回復したノードのレコードを新しいデータとして扱い、残りのクラスターに伝搬します。このような、削除したにもかかわらず残っているレコードは、ゾンビと呼ばれます。

ゾンビの再発を防ぐために、データベースは各トゥームストーンに猶予期間を与えます。猶予期間を設ける目的は、応答しないノードに対し、トゥームストーンを回復して正常に処理する時間を与えることです。猶予期間中に、クライアントがトゥームストーンのマークの付いたレコードに最新の情報を書き込むと、データベースはトゥームストーンを上書きします。猶予期間中に、クライアントがそのレコードの読み取りを送信すると、データベースはトゥームストーンを無視し、可能であれば、その他のレプリカからレコードを取得します。

応答しないノードが回復したら、DataStax Enterpriseは、ヒンテッド・ハンドオフを使用して、ノードが停止中に見落としたデータベース・ミューテーションをリプレイします。猶予期間中、DataStax Enterpriseは、トゥームストーンのマークが付いたレコードのミューテーションをリプレイしません。ただし、猶予期間の終了までにノードが回復しないと、削除に失敗する可能性があります。

トゥームストーンの猶予期間が終了すると、DataStax Enterpriseは、コンパクション中にトゥームストーンを削除します。

トゥームストーンの猶予期間は、プロパティgc_grace_secondsで設定します。デフォルト値は864000秒(10日間)です。テーブルごとに、このプロパティに独自の値を設定することもできます。

削除の詳細について

詳細:

  • トゥームストーンの有効期限日時は、その作成日時にテーブル・プロパティgc_grace_secondsの値を足したものになります。
  • DataStax Enterpriseは、データの挿入と更新のバッチ処理もサポートしています。また、この手順を行うと、レコードを残りのクラスターから削除した後に、レコード挿入がリプレイされる危険性があります。DataStax Enterpriseは、猶予期間中であるトゥームストーンのマーク付きレコードについては、バッチ処理されたミューテーションをリプレイしません。
  • シングル・ノード・クラスターでは、gc_grace_secondsを「0」(ゼロ)に設定できます。
  • ゾンビ・レコードの再発を完全に防ぐには、回復後のノードでnodetool repairを実行したら、gc_grace_secondsごとに各テーブルで実行します。
  • 作成時にテーブル内のすべてのレコードにTTLが指定されており、すべて期限切れになっているため手動で削除できない場合は、そのテーブルで定期的にnodetool repairを実行する必要はありません。
  • SizeTieredCompactionStrategyを使用すると、コンパクション・プロセスを手動で起動することでトゥームストーンをすぐに削除できます。
    注意: コンパクションを強制的に実行すると、データベースは、すべてのデータから非常に大きなSSTableを1つ作成し、別のコンパクションを長期間トリガーしない可能性があります。強制コンパクション中に作成されたSSTable内のデータは、この長期間コンパクションされない間に非常に古くなる可能性があります。
  • DataStax Enterpriseでは、テーブル全体のdefault_time_to_liveプロパティを設定できます。定期的なTTLでマークされたカラムや行は前述のように処理されますが、レコードがテーブルレベルのTTLを超えると、データベースは、トゥームストーンのマーク付けやコンパクションを行わずに、すぐにレコードを削除します。
  • DataStax Enterpriseは、DROP KEYSPACEおよびDROP TABLEステートメントによる即時削除をサポートしています。