データはどのようにして削除されるか
DataStax Enterpriseはどのようにデータを削除するのか、また削除されたデータがなぜ復活する可能性があるのか。
データを削除するプロセスは、パフォーマンスを向上させ、DataStax Enterprise(DSE)データベースのデータ分散およびフォールト・トレランス用の組み込みプロパティと連携して機能するように設計されています。
データベースは削除を挿入またはupsertとして扱います。DELETEコマンドのパーティションに追加されるデータは、tombstoneと呼ばれる削除マーカーです。トゥームストーンは、書き込みパスを通り、1つ以上のノードのSSTableに書き込まれます。トゥームストーンの主たる差別化要因は、猶予期間と呼ばれる組み込みの有効期限で、gc_grace_secondsによって設定されます。有効期限が過ぎると、別のSSTableのデータ削除でこのマークが今後使用されないのであれば、トゥームストーンは通常のコンパクション・プロセスの一部として削除されます。
Time To Live(TTL)値を持つレコード(行またはカラム)にマークを付けると、指定した時間が終了すると、データベースはそのレコードにトゥームストーンを付け、他のトゥームストーンの付いたレコードと同様に処理します。
分散システムでの削除
マルチノード・クラスターでは、DSEデータベースは複数のノードに同じデータのレプリカを格納できます。これによりデータ喪失は防止できますが、削除プロセスが複雑になります。ノードは、ローカルに格納したデータの削除を受け取ると、指定されたレコードに削除のマークを付け、そのレコードのレプリカが含まれている他のノードにトゥームストーンを渡します。その時点で1つのレプリカ・ノードが応答しない場合は、トゥームストーンをすぐに受け取らないため、削除前のバージョンのレコードがまだ含まれていることになります。
そのトゥームストーンが、ノードの回復前に他のクラスターからすでに削除されている場合、データベースは回復したノードのレコードを新しいデータとして扱い、残りのクラスターに伝搬します。このような、削除したにもかかわらず残っているレコードは、zombieと呼ばれます。
ゾンビの再発を防ぐために、データベースは各トゥームストーンに猶予期間を与えます。猶予期間を設ける目的は、応答しないノードに対し、トゥームストーンを回復して正常に処理する時間を与えることです。レプリカの複数の回答が読み取り要求の一部であり、それらの応答が異なる場合は、最も新しい値が優先されます。たとえば、あるノードにトゥームストーンの付いたレコードがあり、別のノードがその後に変更されている場合、最終的な結果には最新の変更が含まれます。
あるノードにトゥームストーンの付いたレコードがあり、別のノードがそのレコードのより古い値のみを持つ場合、最終的な結果にはトゥームストーンの付いレコードが保持されます。猶予期間中に、クライアントがトゥームストーンの付いたレコードに最新の情報を書き込むと、データベースはトゥームストーンを上書きします。
応答しないノードが回復したら、DataStax Enterpriseは、ヒンテッド・ハンドオフを使用して、ノードが停止中に見落としたデータベース・ミューテーションをリプレイします。猶予期間中、DSEは、トゥームストーンの付いたレコードのミューテーションをリプレイしません。猶予期間の終了までにノードが回復しないと、削除に失敗する可能性があります。
トゥームストーンの猶予期間が終了すると、DSEは、コンパクション中にトゥームストーンを削除します。
有効期限切れデータ
トゥームストーンの猶予期間は、gc_grace_secondsプロパティで設定されます。デフォルト値は864,000秒(10日間)で、各テーブルはこのプロパティに対して独自の値を持つことができます。単一ノード・クラスターの場合、このプロパティを安全に0に設定できます。
- トゥームストーンの有効期限日時は、その作成日時にgc_grace_secondsプロパティの値を足したものになります。
- ゾンビ・レコードの再発を完全に防ぐには、nodetool repairを回復後のノードで実行し、さらに、gc_grace_secondsで設定された間隔ごとに各テーブルで実行します。
作成時にテーブル内のすべてのレコードにTTLが指定されており、期限切れになっているため手動で削除できない場合は、そのテーブルで定期的にnodetool repairを実行する必要はありません。TTLを使用したデータの有効期限切れの詳細については、「TTLを使用したデータの期限の設定」を参照してください。
DSEは、データの挿入と更新のバッチ処理もサポートしています。この手順を行うと、レコードを残りのクラスターから削除した後に、レコード挿入がリプレイされる危険性があります。DSEは、猶予期間中であるトゥームストーンのマーク付きレコードについては、バッチ処理されたミューテーションをリプレイしません。
DSEは、DROP KEYSPACEステートメントとDROP TABLEステートメントによる即時削除をサポートしています。
ダイアグラムの凡例
アイコン | 説明 |
---|---|
ノード上のデータ。 | |
使用できないレプリカ・ノード上のデータ。 | |
ノードから削除されたデータ。 | |
データが削除されたことを示すトゥームストーン。 | |
ノードから削除されたトゥームストーン。 |