2015-01-05 2 views
4

Какие типы надгробных камней поддерживают Cassandra (версия 2)? Согласно статье this она поддерживает (в терминах CQL):Какие типы надгробных камней поддерживают Cassandra?

  • определенный столбец для строки.
  • статические столбцы.
  • все строки для ключа раздела.

Я пропустил любые другие типы надгробий? Удаление определенной (CQL) строки? Существуют ли специальные надгробные плиты для поддержки удалений диапазонов кластерных ключей или подобных? Эта информация полезна для того, чтобы знать, когда планируете схемы, чтобы избежать слишком много надгробий.

ответ

7

Надгробный камень - это маркер, помещенный в строку, указывающую на удаление. Они могут существовать в разных местах, в столбце или в диапазоне столбцов или на целой строке. В приведенном ниже примере показан нормальный тип надгробных камней (тип диапазона здесь не рассматривается).

При планировании вашей схемы вы моделируете свои таблицы по типам запросов, которые вы делаете, а не по одной таблице, вы можете обнаружить, что данные дублируются во многих таблицах. Таблицы оптимизированы для обслуживания поступающих чтений и записей. Ссылка ниже должна дать вам хороший фон по моделированию данных с Кассандрой:

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 - удален диапазон значений (диапазон надгробная плита)

+0

Это отличное объяснение того, как надгробия выглядят «под капотом». Красиво сделано! – Aaron

+0

Интересно. Не могли бы вы также опубликовать схему таблицы для ясности? – Ztyx

+0

Кроме того, после ваших первых удалений (и флеш), не следует ли мне ожидать ссылки на «1» и/или «11» в сгенерированных надгробиях? Я смущен. – Ztyx

2

Добавив к ответу @ markc, есть также надгробная плита столбца, которая появляется всякий раз, когда вы используете коллекции. У нас есть set<text> колонки под названием «метка», и всякий раз, когда мы вставляем строку мы получаем один из них (даже если мы просто установить его в нуль, как в данном случае):

["1381316637599609:45787829:tags:_","1381316637599609:45787829:tags:!",1438264650252000,"t",1438264650], 

Мы считаем, что «т "означает надгробную плиту. This blog post подробнее другой пример такого рода надгробных камней.

+0

Hi @ 8форт 't' на самом деле представляет собой надгробную плиту диапазона. См. Эту ссылку: http://www.wentnet.com/blog/?p=38 – markc

+0

Я добавил некоторые изменения в свой ответ выше – markc

Смежные вопросы