トゥームストーンとは

トゥームストーンの作成方法と読み取りへの影響について説明します。

DataStax Enterprise(DSE)では、レプリケーション係数(RF)が1より大きいキースペースからデータが削除されると、トゥームストーンが作成されます。次の例の一覧は徹底したものではありませんが、トゥームストーンを生成するいくつかの操作を示しています。

トゥームストーンが作成されると、パーティションのさまざまな部分にマークを付けることができます。マーカーの位置に基づいて、トゥームストーンを次のグループのいずれかに分類できます。通常、各カテゴリーは1つの一意の種類のデータ削除操作に対応します。

トゥームストーンは、書き込みパスを通り、1つ以上のノードのSSTableに書き込まれます。トゥームストーンの主たる差別化要因は、猶予期間と呼ばれる組み込みの有効期限で、gc_grace_secondsによって設定されます。有効期限が過ぎると、別のSSTableのデータ削除でこのマークが今後使用されないのであれば、トゥームストーンは通常のコンパクション・プロセスの一部として削除されます。

テーブルにトゥームストーンの数が多すぎると、アプリケーションのパフォーマンスに悪影響を及ぼす可能性があります。多くのトゥームストーンは、多くの場合、データ・モデルまたはアプリケーションのいずれかに関する潜在的な問題を示します。

キースペースとテーブルの作成

次の例で、cyclingキースペースを使用して、さまざまなトゥームストーン・カテゴリーを示します。次の2つのテーブルを使用します。rank_by_year_and_cycling_namecyclist_career_teamsです。

ヒント: 次の例ではcqlshとCQLの両方のコマンドを使用するため、2つの異なる端末を使用することをお勧めします。

または、1つの端末をcqlsh用に使用し、DataStax Studioを使用してCQLコマンドを発行します。

開始する前に、次のコマンドを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
注: sstabledumpユーティリティは、Apache Cassandra 3.0以降、DSE 5.0以降で利用できます。これら以前のバージョンでは、代わりにsstable2jsonユーティリティを使用してください。

パーティション・トゥームストーン

パーティション・トゥームストーンは、パーティション全体が明示的に削除されたときに生成されます。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句はパーティション・キーに対する等価条件であり、クラスター化キーに対する不等価条件です。

ヒント: 最初からこのチュートリアルに従っている場合は、rank_by_year_and_nameテーブルを削除し、次にそれを再作成して、テーブルに必要なデータを入力します。
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 }
        ]
      }
    ]
  }