Добавляет ли новое значение / обновляет существующее значение на карте в кассандре, создает надгробные плиты? - PullRequest
1 голос
/ 05 августа 2020

Я следил за этой страницей данных: - https://docs.datastax.com/en/cql-oss/3.3/cql/cql_using/useInsertMap.html, чтобы узнать, как обновить карту в кассандре. Но я подозреваю, что это не приведет к созданию нежелательных надгробий в следующем сценарии ios: -

  1. UPDATE cycling.cyclist_teams SET teams = teams + {2009 : 'DSB Bank - Nederland bloeit'} WHERE id = 5b6962dd-3f90-4c93-8f61-eabfa4a803e

Будет добавлено новое значение на карту (если 2009 г. отсутствует на карте) создать надгробие?

UPDATE cycling.cyclist_teams SET teams = teams + {2009 : 'DSB Bank - Nederland bloeit'} WHERE id = 5b6962dd-3f90-4c93-8f61-eabfa4a803e2

Будет ли при обновлении старого значения для карты (если на карте существовал ключ 2009) создание надгробной плиты для старого значения или любого другого типа надгробной плиты?

Ответы [ 2 ]

2 голосов
/ 05 августа 2020

Он не создаст надгробие (без удаления или преднамеренной записи нуля), но он «устареет» предыдущее значение.

Это означает, что будут извлечены как старые, так и новые значения для 2009 года во время чтения, и Кассандра отфильтрует все, кроме самых последних. Кроме того, в зависимости от того, сколько времени прошло с момента первой записи в teams, вполне возможно, что старые и новые значения могли быть записаны в отдельные файлы SSTable, а это означает, что процесс чтения / согласования займет больше времени.

Таким образом, хотя это не приведет к созданию надгробия, это будет иметь аналогичный эффект, поскольку большой объем устаревших данных (от записи / обновления на месте) до одного и того же значения приведет к снижению производительности со временем.

0 голосов
/ 06 августа 2020

Он не создаст надгробие, потому что вы обновляете коллекцию с помощью +. Надгробие будет создано, если вместо этого вы создадите новую коллекцию (карта в данном случае) следующим образом:

UPDATE cycling.cyclist_teams SET teams = {2009 : 'DSB Bank - Nederland bloeit'} WHERE id = 5b6962dd-3f90-4c93-8f61-eabfa4a803e2

Кассандра всегда записывает данные в режиме только добавления, с той лишь разницей, что для журнала фиксации это добавляется в конец журнала, а для таблицы памяти он записывается в порядке ключа раздела и столбца (столбцов) кластеризации. Данные Memtables периодически сбрасываются в SSTable. Ваши конфликтующие данные могут быть продублированы (с конфликтующими значениями) в SSTable. Фактически все вставки являются upserts, если вы не добавляете условия с облегченными транзакциями.

Оба значения будут записаны и извлечены из a) кеша строк (RAM), b) memtable (RAM) или c) SSTable (HDD / SSD) после чтения, а затем в случае конфликта данные с последней меткой времени будут возвращены драйверу. В зависимости от вашего уровня согласованности чтения - всегда для ЛЮБОГО и в зависимости от read_repair_chance для других уровней согласованности - старые значения в репликах memtables (RAM) будут обновлены. Старые (устаревшие) значения будут в конечном итоге удалены в процессе сжатия SSTable (HDD / SSD).

Вы можете поэкспериментировать, а затем получить статистику таблицы, чтобы увидеть, есть ли какие-либо надгробные камни, выполнив:

$CASSANDRA_HOME/bin/nodetool cfstats keyspace.table
...