墓石の種類
墓石はいくつかの方法で作成できますが、クラスターに影響を与えるもっともらしい問題として浮上するまで、プログラマの視点から隠されたままである墓石の暗黙的な作成につながる可能性のある落とし穴を理解することが重要です。 したがって、Cassandraで作成できる墓石のタイプを理解することが重要です。
Cell tombstones
Insertステートメントは、特定のセル値がクエリでnullに設定されている場合に墓石 これは、データベース抽象化レイヤーまたはORMフレームワークがオブジェクトレベルの表現でクエリを抽象化し、null値が実際のクエリで暗黙的にCassandraに送信され たとえば、次のCQLクエリを考えてみましょう:
INSERT INTO item_price ( store_number, item_id, price, replacements, product_code ) VALUES ( 'CA104', 'item104', 2.50, null , 'p104');
これにより、store_number CA104のレコードのreplacements列のセル墓石が作成されます。
ここで、次のdeleteクエリを考えてみましょう:
DELETE replacements FROM item_price WHERE store_number = 'CA104';
これにより、対応するレコードのセル墓石も作成されます。
Row tombstones
行を識別するdeleteクエリの結果、行全体がtombstoneとしてマークされます。 例えば:
DELETE FROM item_price WHERE store_number = 'CA101' and item_id='item101' and price = 1.80;
Sstabledumpは、パーティション内のクラスタリング列の行レベルでdeletion_infoを表示します。
,
"position" : 0
},
"rows" : ,
"deletion_info" : {
"marked_deleted" : "2020-07-05T07:26:52.233374Z",
"local_delete_time" : "2020-07-05T07:26:52Z"
},
"cells" :
}
]
}
]
行の墓石の数が多いことは、アプリケーションがテーブルからレコードを頻繁に削除しているという貧弱なデータモデルを示す可能性があります。 このような場合は、データモデルを再検討し、クエリパターンと基数に基づいてテーブルを再設計することを検討してください。
Range tombstones
パーティションキーとクラスタリング列で表される範囲を持つWHERE句を使用して、行の範囲全体を削除します。 例えば:
DELETE FROM item_price WHERE store_number = 'CA101' AND item_id='item101' AND price > 2.0;
SSTabledumpは次のように表示されます,
,"position" : 0
},
"rows" : ,
"deletion_info" : { "marked_deleted" : "2020-07-05T06:53:50.671654Z", "local_delete_time" : "2020-07-05T06:53:50Z" }
}
},
{
"type" : "range_tombstone_bound",
"end" : {
"type" : "inclusive",
"clustering" : ,
"deletion_info" : { "marked_deleted" : "2020-07-05T06:53:50.671654Z", "local_delete_time" : "2020-07-05T06:53:50Z" }
}
}
]
}
}}
SSTabledumpは、パーティション内でtombstonedされた行の範囲を示すために使用されるクラスタリングキーの開始と終了を使用して、range_tombstone_boundのタイプを持つrange tombstonesを出力します。 範囲の墓石は、コレクション全体が挿入クエリまたは更新クエリに置き換えられたときにも作成されます。 コレクション全体を置き換えるのではなく、コレクションの特定の要素を置き換えることを常にお勧めします。
Partition tombstones
このタイプのTombstonesは、WHERE句のパーティションキーのみを使用してdeleteクエリが起動されたときに作成されます。 例えば:
DELETE FROM item_price WHERE store_number = 'CA102';
間違いなく推測しているように、これはパーティションCA102全体を削除し、sstabledumpはパーティションにmarked_deletedタイムスタンプを持つdeletion_info属性を表示します。
,
"position" : 0,
"deletion_info" : {
"marked_deleted" : "2020-07-05T22:11:48.367057Z",
"local_delete_time" : "2020-07-05T22:11:48Z"
}
},
"rows" :
}
]
TTL tombstones
これらは、特定の行またはセルの有効期限が切れたときに自動的に作成されるtombstonesです。 しかし、それらは通常の墓石とは異なるマークされています。
次のinsertステートメントは、20秒後にTTL tombstoneを作成します。
INSERT INTO item_price ( store_number, item_id, price, replacements, product_code) VALUES ( 'CA103', 'item103', 3.0, {'item101-r', 'item101'}, 'p103') using TTL 20;
sstabledumpは次のように表示されます:
,
"position" : 78
},
"rows" : ,
"liveness_info" : { "tstamp" : "2020-07-05T06:47:51.458099Z", "ttl" : 20, "expires_at" : "2020-07-05T06:48:11Z", "expired" : true },
"cells" : }
]
}
]
}
]
概要
- Cassandraは、削除クエリを内部的に更新操作として扱い、削除するデータにtombstoneというマーカーを追加します。
- 墓石は有効期限(gc_grace_seconds)で設定することができ、圧縮プロセス中にクリーンアップされます。
- sstabledumpユーティリティを使用すると、SSTableファイルの内容を人間が判読可能な形式で表示できます。
- 墓石が作成される可能性があるため、テーブルにNull値を書き込むことは避けてください。 ORMレイヤーによって抽象化されたクエリを作成する際には注意してください。
- 範囲の墓碑は、範囲の境界を保存するだけでディスク領域を節約するため、セルまたは行の墓碑よりも優先されます。
- set、list、mapなどのコレクションの要素全体をINSERTおよびUPDATEクエリで置き換えることは避けてください。