トゥームストーンとは
トゥームストーンの作成方法と読み取りへの影響について説明します。
- CQL DELETEステートメントを使用する。
- Time To Live(TTL)によるデータの有効期限切れ。
- マテリアライズド・ビューの使用などの内部操作の使用。
null
値を使用したINSERT操作またはUPDATE操作。- コレクション・カラムのUPDATE操作。
トゥームストーンが作成されると、パーティションのさまざまな部分にマークを付けることができます。マーカーの位置に基づいて、トゥームストーンを次のグループのいずれかに分類できます。通常、各カテゴリーは1つの一意の種類のデータ削除操作に対応します。
トゥームストーンは、書き込みパスを通り、1つ以上のノードのSSTableに書き込まれます。トゥームストーンの主たる差別化要因は、猶予期間と呼ばれる組み込みの有効期限で、gc_grace_secondsによって設定されます。有効期限が過ぎると、別のSSTableのデータ削除でこのマークが今後使用されないのであれば、トゥームストーンは通常のコンパクション・プロセスの一部として削除されます。
テーブルにトゥームストーンの数が多すぎると、アプリケーションのパフォーマンスに悪影響を及ぼす可能性があります。多くのトゥームストーンは、多くの場合、データ・モデルまたはアプリケーションのいずれかに関する潜在的な問題を示します。
キースペースとテーブルの作成
次の例で、cycling
キースペースを使用して、さまざまなトゥームストーン・カテゴリーを示します。次の2つのテーブルを使用します。rank_by_year_and_cycling_name
とcyclist_career_teams
です。
cqlsh
とCQLの両方のコマンドを使用するため、2つの異なる端末を使用することをお勧めします。 開始する前に、次のコマンドをcqlsh
プロンプトにコピーし、cycling
キースペースを作成し、両方のテーブルを作成して、データをrank_by_year_and_cycling_name
テーブルに挿入します。
後でデータをセル・トゥームストーンとTTLトゥームストーンのcyclist_career_teams
テーブルに挿入します。
CREATE KEYSPACE cycling WITH replication =
{'class': 'SimpleStrategy', 'replication_factor': '1'} AND durable_writes = true;
CREATE TABLE cycling.rank_by_year_and_name (
race_year int,
race_name text,
rank int,
cyclist_name text,
PRIMARY KEY ((race_year, race_name), rank)
) WITH CLUSTERING ORDER BY (rank ASC);
INSERT INTO cycling.rank_by_year_and_name (race_year, race_name, cyclist_name, rank) VALUES (2015, 'Tour of Japan - Stage 4 - Minami > Shinshu', 'Benjamin PRADES', 1);
INSERT INTO cycling.rank_by_year_and_name (race_year, race_name, cyclist_name, rank) VALUES (2015, 'Tour of Japan - Stage 4 - Minami > Shinshu', 'Adam PHELAN', 2);
INSERT INTO cycling.rank_by_year_and_name (race_year, race_name, cyclist_name, rank) VALUES (2015, 'Tour of Japan - Stage 4 - Minami > Shinshu', 'Thomas LEBAS', 3);
INSERT INTO cycling.rank_by_year_and_name (race_year, race_name, cyclist_name, rank) VALUES (2015, 'Giro d''Italia - Stage 11 - Forli > Imola', 'Ilnur ZAKARIN', 1);
INSERT INTO cycling.rank_by_year_and_name (race_year, race_name, cyclist_name, rank) VALUES (2015, 'Giro d''Italia - Stage 11 - Forli > Imola', 'Carlos BETANCUR', 2);
INSERT INTO cycling.rank_by_year_and_name (race_year, race_name, cyclist_name, rank) VALUES (2014, '4th Tour of Beijing', 'Phillippe GILBERT', 1);
INSERT INTO cycling.rank_by_year_and_name (race_year, race_name, cyclist_name, rank) VALUES (2014, '4th Tour of Beijing', 'Daniel MARTIN', 2);
INSERT INTO cycling.rank_by_year_and_name (race_year, race_name, cyclist_name, rank) VALUES (2014, '4th Tour of Beijing', 'Johan Esteban CHAVES', 3);
CREATE TABLE cycling.cyclist_career_teams (
id UUID PRIMARY KEY,
lastname text,
teams set<text>
);
SSTableへのフラッシュ
テーブルを変更するたびに、cycling
キースペースでnodetool flush
コマンドを実行して、memtableからディスク上のSSTableにデータをフラッシュします。この手順は、sstabledump
を実行して出力を表示する前に必要です。
nodetool flush cycling;
cycling
キースペースをフラッシュした後、次の例に示すように、SSTableでsstabledump
コマンドを実行します。
cd /var/lib/cassandra/data/cycling/rank_by_year_and_name-bc05fba12baf11e8b4a8ad2b042f3e18 sstabledump mc-2-big-Data.db
パーティション・トゥームストーン
パーティション・トゥームストーンは、パーティション全体が明示的に削除されたときに生成されます。CQL DELETEステートメントで、WHERE句はパーティション・キーに対する等価条件です。
DELETE from cycling.rank_by_year_and_name WHERE
race_year = 2014 AND race_name = '4th Tour of Beijing';
このパーティションのsstabledump出力を見ると、deletion_info
トゥームストーン・マーカーはパーティション・レベルにあり、パーティション内の行またはセルには関連付けされていません。
{
"partition" : {
"key" : [ "2014", "4th Tour of Beijing" ],
"position" : 0,
"deletion_info" : { "marked_deleted" : "2018-05-16T19:40:06.454282Z", "local_delete_time" : "2018-05-16T19:40:06Z" }
},
"rows" : [ ]
}
行トゥームストーン
行トゥームストーンは、パーティション内の特定の行が明示的に削除されたときに生成されます。スキーマには、パーティション・キーとクラスター化キーの両方を含む複合プライマリ・キーがあります。CQL DELETEステートメントで、WHERE句はパーティション・キー・カラムとクラスター化キー・カラムの両方に対する等価条件です。
DELETE from cycling.rank_by_year_and_name WHERE
race_year = 2015 AND race_name = 'Giro d''Italia - Stage 11 - Forli > Imola' AND rank = 2;
このパーティションのsstabledump出力を見ると、deletion_info
トゥームストーン・マーカーは行レベルにあり、そのパーティションの下のクラスター化キーによって識別されます。パーティションにも行セルにも、トゥームストーン・マーカーは含まれていません。
{
"partition" : {
"key" : [ "2015", "Giro d'Italia - Stage 11 - Forli > Imola" ],
"position" : 0
},
"rows" : [
{
"type" : "row",
"position" : 74,
"clustering" : [ 2 ],
"deletion_info" : { "marked_deleted" : "2018-05-18T15:29:06.227148Z", "local_delete_time" : "2018-05-18T15:29:06Z" },
"cells" : [ ]
}
]
}
範囲トゥームストーン
範囲トゥームストーンは、範囲検索を通じて表現できるパーティション内の複数の行が明示的に削除された場合に発生します。スキーマには、パーティション・キーとクラスター化キーの両方を含む複合プライマリ・キーがあります。CQL DELETEステートメントで、WHERE句はパーティション・キーに対する等価条件であり、クラスター化キーに対する不等価条件です。
DELETE from cycling.rank_by_year_and_name WHERE
race_year = 2015 AND race_name = 'Tour of Japan - Stage 4 - Minami > Shinshu' AND rank > 1;
このパーティションのsstabledump出力を見ると、deletion_info
トゥームストーン・マーカーは行レベルにあります。特別な境界マーカー、range_tombstone_bound
は削除された行の範囲スコープ(クラスター化キー値によって識別される)をマークするものです。
{
"partition" : {
"key" : [ "2015", "Tour of Japan - Stage 4 - Minami > Shinshu" ],
"position" : 252
},
"rows" : [
{
"type" : "range_tombstone_bound",
"start" : {
"type" : "inclusive",
"deletion_info" : { "marked_deleted" : "2018-05-18T16:09:21.474713Z", "local_delete_time" : "2018-05-18T16:09:21Z" }
}
},
{
"type" : "range_tombstone_bound",
"end" : {
"type" : "exclusive",
"clustering" : [ 1 ],
"deletion_info" : { "marked_deleted" : "2018-05-18T16:09:21.474713Z", "local_delete_time" : "2018-05-18T16:09:21Z" }
}
}
]
}
ComplexColumnトゥームストーン
ComplexColumnトゥームストーンは、set、list、mapなどのコレクション・タイプ・カラムを挿入または更新するときに生成されます。
以前に私たちはcyclist_career_teams
テーブルを作成しました。次のcqlsh
コマンドを実行して、データをこのテーブルに挿入します。
INSERT INTO cycling.cyclist_career_teams (
id,
lastname,
teams)
VALUES (cb07baad-eac8-4f65-b28a-bddc06a0de23, 'ARMITSTEAD', {
'Boels-Dolmans Cycling Team','AA Drink - Leontien.nl','Team Garmin - Cervelo' } );
このパーティションのsstabledump出力を見ると、パーティションに明示的な手動削除は行われていませんが、コレクション・タイプ・カラムteams
のセル・レベルでdeletion_info
マーカーが表示されています。
{
"partition" : {
"key" : [ "cb07baad-eac8-4f65-b28a-bddc06a0de23" ],
"position" : 0
},
"rows" : [
{
"type" : "row",
"position" : 130,
"liveness_info" : { "tstamp" : "2018-05-18T16:26:23.779724Z" },
"cells" : [
{ "name" : "lastname", "value" : "ARMITSTEAD" },
{ "name" : "teams", "deletion_info" : { "marked_deleted" : "2018-05-18T16:26:23.779723Z", "local_delete_time" : "2018-05-18T16:26:23Z" } },
{ "name" : "teams", "path" : [ "AA Drink - Leontien.nl" ], "value" : "" },
{ "name" : "teams", "path" : [ "Boels-Dolmans Cycling Team" ], "value" : "" },
{ "name" : "teams", "path" : [ "Team Garmin - Cervelo" ], "value" : "" }
]
}
]
}
セル・トゥームストーン
セル・トゥームストーンは、次の例に示すように、パーティションの特定の行のカラムなどのセルから値を明示的に削除する場合、またはnull
値を持つセルを挿入または更新する場合に生成されます。
INSERT INTO cycling.rank_by_year_and_name (
race_year,
race_name,
cyclist_name,
rank)
VALUES (2018, 'Giro d''Italia - Stage 11 - Osimo > Imola', null, 1);
このパーティションの「sstabledump」出力を見ると、deletion_info
トゥームストーン・マーカーは特定のセルに関連付けされています。
{
"partition" : {
"key" : [ "2018", "Giro d'Italia - Stage 11 - Osimo > Imola" ],
"position" : 0
},
"rows" : [
{
"type" : "row",
"position" : 80,
"clustering" : [ 1 ],
"liveness_info" : { "tstamp" : "2018-05-18T17:13:42.602827Z" },
"cells" : [
{ "name" : "cyclist_name", "deletion_info" : { "local_delete_time" : "2018-05-18T17:13:42Z" }
}
]
}
]
}
TTLトゥームストーン
TTLトゥームストーンは、TTL(Time To Live)期間が有効期限切れになるときに生成されます。TTL有効期限マーカーは、行レベルまたはセル・レベルのいずれかで発生する可能性があります。ただし、DSEは、明示的に削除されたトゥームストーン・データとは異なる方法でTTLデータをマークします。パーティションに1行しかない場合(クラスター化キーがない場合)でも、TTLマークは行レベルで生成されます。
次のステートメントで、行全体のTTLを設定します。
INSERT INTO cycling.cyclist_career_teams (
id,
lastname,
teams)
VALUES (e7cd5752-bc0d-4157-a80f-7523add8dbcd, 'VAN DER BREGGEN', {
'Rabobank-Liv Woman Cycling Team','Sengers Ladies Cycling Team','Team Flexpoint' }) USING TTL 1;
次のステートメントで、単一セルのTTLを設定します。
UPDATE cycling.rank_by_year_and_name USING TTL 1
SET cyclist_name = 'Cloudy Archipelago' WHERE race_year = 2018 AND
race_name = 'Giro d''Italia - Stage 11 - Osimo > Imola' AND rank = 1;
これらのパーティションのsstabledump出力を見ると、最初のCQLステートメントは、liveness_info
セクションで行(パーティション・キー:e7cd5752-bc0d-4157-a80f-7523add8dbcd)を"expired" : true
TTL有効期限切れマーカーでマークしています。
{
"partition" : {
"key" : [ "e7cd5752-bc0d-4157-a80f-7523add8dbcd" ],
"position" : 0
},
"rows" : [
{
"type" : "row",
"position" : 134,
"liveness_info" : { "tstamp" : "2018-05-18T17:38:13.135226Z", "ttl" : 1, "expires_at" : "2018-05-18T17:38:14Z", "expired" : true },
"cells" : [
{ "name" : "lastname", "value" : "VAN DER BREGGEN" },
{ "name" : "teams", "deletion_info" : { "marked_deleted" : "2018-05-18T17:38:13.135225Z", "local_delete_time" : "2018-05-18T17:38:13Z" } },
{ "name" : "teams", "path" : [ "Rabobank-Liv Woman Cycling Team" ], "value" : "" },
{ "name" : "teams", "path" : [ "Sengers Ladies Cycling Team" ], "value" : "" },
{ "name" : "teams", "path" : [ "Team Flexpoint" ], "value" : "" }
]
}
]
}
2番目のCQLステートメントは、セル(パーティション・キー:2018、クラスター化キー:1、カラム名:cyclist_name)を特定のセルに対する"expired" : true
TTL有効期限マーカーでマークしています。
{
"partition" : {
"key" : [ "2018", "Giro d'Italia - Stage 11 - Osimo > Imola" ],
"position" : 0
},
"rows" : [
{
"type" : "row",
"position" : 95,
"clustering" : [ 1 ],
"cells" : [
{ "name" : "cyclist_name", "value" : "Cloudy Archipelago", "tstamp" : "2018-05-18T18:22:52.532855Z", "ttl" : 1, "expires_at" : "2018-05-18T18:22:53Z", "expired" : true }
]
}
]
}