Надгробный камень - это маркер, помещенный в строку, указывающую на удаление. Они могут существовать в разных местах, в столбце или в диапазоне столбцов или на целой строке. В приведенном ниже примере показан нормальный тип надгробных камней (тип диапазона здесь не рассматривается).
При планировании вашей схемы вы моделируете свои таблицы по типам запросов, которые вы делаете, а не по одной таблице, вы можете обнаружить, что данные дублируются во многих таблицах. Таблицы оптимизированы для обслуживания поступающих чтений и записей. Ссылка ниже должна дать вам хороший фон по моделированию данных с Кассандрой:
http://www.datastax.com/resources/data-modeling
Моего примером: Я создал таблицу и вставить некоторые данные, а затем использовал nodetool flush
для создания некоторого sstables.С помощью инструмента sstable2json
вы можете увидеть удаленные строки, если его весь ряд, он выглядит немного отличается от одной колонки, но по существу его еще только маркер:
Heres за столом со всеми его данными:
$ ~/dse-4.5.1/resources/cassandra/bin/sstable2json ./dse-data/results/ts1/results-ts1-jb-1-Data.db
[
{"key": "3136","columns": [["","",1417814256390000], ["col2","26",1417814256390000], ["col3","36",1417814256390000], ["id","id16",1417814256390000]]},
{"key": "3133","columns": [["","",1417814218246000], ["col2","23",1417814218246000], ["col3","33",1417814218246000], ["id","id13",1417814218246000]]},
{"key": "3135","columns": [["","",1417814244766000], ["col2","25",1417814244766000], ["col3","35",1417814244766000], ["id","id15",1417814244766000]]},
{"key": "3134","columns": [["","",1417814230711000], ["col2","24",1417814230711000], ["col3","34",1417814230711000], ["id","id14",1417814230711000]]},
{"key": "3132","columns": [["","",1417814207910000], ["col2","22",1417814207910000], ["col3","32",1417814207910000], ["id","id12",1417814207910000]]},
{"key": "3131","columns": [["","",1417814197094000], ["col2","21",1417814197094000], ["col3","31",1417814197094000], ["id","id11",1417814197094000]]},
{"key": "31","columns": [["","",1417814185270000], ["col2","2",1417814185270000], ["col3","3",1417814185270000], ["id","id1",1417814185270000]]}
]
Heres первое удаление в cqlsh:
cqlsh:results> delete from ts1 WHERE col1 = '1';
cqlsh:results> delete id from ts1 WHERE col1 = '11';
Heres, полученный sstable после промывки:
[[email protected] ~]$ ~/dse-4.5.1/resources/cassandra/bin/sstable2json ./dse-data/results/ts1/results-ts1-jb-2-Data.db
[
{"key": "3131","columns": [["id","54822130",1417814320400000,"d"]]},
{"key": "31","metadata": {"deletionInfo": {"markedForDeleteAt":1417814302304000,"localDeletionTime":1417814302}},"columns": []}
]
Heres следующий удалить в cqlsh:
cqlsh:results> delete col2 from ts1 WHERE col1 = '12';
Heres, полученный sstable после промывки:
[[email protected] ~]$ ~/dse-4.5.1/resources/cassandra/bin/sstable2json ./dse-data/results/ts1/results-ts1-jb-3-Data.db
[
{"key": "3132","columns": [["col2","5482220b",1417814539434000,"d"]]}
]
Когда уплотнение происходит все эти sstables объединены в один sstable, а затем удаляются строки все еще там, но помечены для удаления, мы можем увидеть это снова после выполнения уплотнения (ищите флаги d
с меткой времени):
[[email protected] ~]$ ./dse-4.5.1/bin/nodetool compact
[[email protected] ~]$ ~/dse-4.5.1/resources/cassandra/bin/sstable2json ./dse-data/results/ts1/results-ts1-jb-4-Data.db
[
{"key": "3136","columns": [["","",1417814256390000], ["col2","26",1417814256390000], ["col3","36",1417814256390000], ["id","id16",1417814256390000]]},
{"key": "3133","columns": [["","",1417814218246000], ["col2","23",1417814218246000], ["col3","33",1417814218246000], ["id","id13",1417814218246000]]},
{"key": "3135","columns": [["","",1417814244766000], ["col2","25",1417814244766000], ["col3","35",1417814244766000], ["id","id15",1417814244766000]]},
{"key": "3134","columns": [["","",1417814230711000], ["col2","24",1417814230711000], ["col3","34",1417814230711000], ["id","id14",1417814230711000]]},
{"key": "3132","columns": [["","",1417814207910000], ["col2","5482220b",1417814539434000,"d"], ["col3","32",1417814207910000], ["id","id12",1417814207910000]]},
{"key": "3131","columns": [["","",1417814197094000], ["col2","21",1417814197094000], ["col3","31",1417814197094000], ["id","54822130",1417814320400000,"d"]]},
{"key": "31","metadata": {"deletionInfo": {"markedForDeleteAt":1417814302304000,"localDeletionTime":1417814302}},"columns": []}
]
Теперь эта таблица будет оставаться так, пока мы не достигнем нашей gc_grace_seconds
, а затем на следующем уплотнении строка фактически исчезает, смотреть, как мы опускаем gc_grace_seconds
, а затем запустить уплотнение:
cqlsh> ALTER TABLE results.ts1 WITH gc_grace_seconds=500;
cqlsh> exit
[[email protected] ~]$ ./dse-4.5.1/bin/nodetool compact results;
[[email protected] ~]$ ./dse-4.5.1/resources/cassandra/bin/sstable2json ./dse-data/results/ts1/results-ts1-jb-5-Data.db
[
{"key": "3136","columns": [["","",1417814256390000], ["col2","26",1417814256390000], ["col3","36",1417814256390000], ["id","id16",1417814256390000]]},
{"key": "3133","columns": [["","",1417814218246000], ["col2","23",1417814218246000], ["col3","33",1417814218246000], ["id","id13",1417814218246000]]},
{"key": "3135","columns": [["","",1417814244766000], ["col2","25",1417814244766000], ["col3","35",1417814244766000], ["id","id15",1417814244766000]]},
{"key": "3134","columns": [["","",1417814230711000], ["col2","24",1417814230711000], ["col3","34",1417814230711000], ["id","id14",1417814230711000]]},
{"key": "3132","columns": [["","",1417814207910000], ["col3","32",1417814207910000], ["id","id12",1417814207910000]]},
{"key": "3131","columns": [["","",1417814197094000], ["col2","21",1417814197094000], ["col3","31",1417814197094000]]}
]
Обратите внимание, как строка для ключа 31
пошел, а также col1
в строке с ключом 3132
и id
в строке с ключом 3131
Моя таблица схемы для ясности:
cqlsh:results> DESCRIBE TABLE ts1 ;
CREATE TABLE ts1 (
col1 text,
col2 text,
col3 text,
id text,
PRIMARY KEY ((col1))
) WITH
bloom_filter_fp_chance=0.010000 AND
caching='KEYS_ONLY' AND
comment='' AND
dclocal_read_repair_chance=0.100000 AND
gc_grace_seconds=864000 AND
index_interval=128 AND
read_repair_chance=0.000000 AND
replicate_on_write='true' AND
populate_io_cache_on_flush='false' AND
default_time_to_live=0 AND
speculative_retry='99.0PERCENTILE' AND
memtable_flush_period_in_ms=0 AND
compaction={'class': 'SizeTieredCompactionStrategy'} AND
compression={'sstable_compression': 'LZ4Compressor'};
в качестве сноски, маркеры надгробия в sstable2json
выходе заключаются в следующем:
e
- истек TTL
d
- удалено значение (захоронения)
t
- удален диапазон значений (диапазон надгробная плита)
Это отличное объяснение того, как надгробия выглядят «под капотом». Красиво сделано! – Aaron
Интересно. Не могли бы вы также опубликовать схему таблицы для ясности? – Ztyx
Кроме того, после ваших первых удалений (и флеш), не следует ли мне ожидать ссылки на «1» и/или «11» в сгенерированных надгробиях? Я смущен. – Ztyx