Как обеспечить согласованность данных в Cassandra в разных таблицах?

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

У меня есть ключевое пространство с четырьмя таблицами: A, B, C и D.

CREATE TABLE A (
  tableID int,
  column1 int,
  column2 varchar,
  column3 varchar,
  column4 varchar,
  column5 varchar,
  PRIMARY KEY (column1, tableID)
);

Давайте представим, что другие таблицы (B,C,D) имеют ту же структуру и те же данные, что и таблица A, только с другим первичным ключом, чтобы отвечать на другие запросы.

Если я обновлю строку в таблице А, как я могу обеспечить согласованность данных в других таблицах с такими же данными?


person Pedro Cunha    schedule 11.12.2015    source источник


Ответы (2)


Кассандра предоставляет BATCH для этой цели. Из документации:

Оператор BATCH объединяет несколько операторов языка модификации данных (DML) (INSERT, UPDATE, DELETE) в одну логическую операцию и устанавливает предоставленную клиентом отметку времени для всех столбцов, записанных операторами в пакете. Пакетирование нескольких операторов может сократить сетевой обмен между клиентом/сервером и координатором/репликами сервера. Однако из-за распределенного характера Cassandra максимально распределяйте запросы по ближайшим узлам, чтобы оптимизировать производительность. Использование пакетов для оптимизации производительности обычно не приводит к успеху, как описано в разделе «Использование и неправильное использование пакетов». Сведения о самом быстром способе загрузки данных см. в разделе Cassandra: пакетная загрузка без ключевого слова «Пакетная обработка».

Пакеты являются атомарными по умолчанию. В контексте пакетной операции Cassandra атомарность означает, что если какой-либо из пакетов завершится успешно, то будут выполнены все. Для достижения атомарности Cassandra сначала записывает сериализованный пакет в системную таблицу журнала пакетов, которая использует сериализованный пакет как данные большого двоичного объекта. Когда строки в пакете успешно записаны и сохранены (или сохранены), данные журнала пакетов удаляются. Существует штраф за производительность за атомарность. Если вы не хотите подвергаться этому штрафу, запретите Cassandra писать в систему пакетного журнала, используя параметр UNLOGGED: BEGIN UNLOGGED BATCH

UNLOGGED BATCH почти всегда нежелательна, и я думаю, что она будет удалена в будущих версиях. Обычные пакеты обеспечивают желаемую функциональность.

person Jeff Jirsa    schedule 12.12.2015

Вы также можете изучить новую функцию Cassandra 3.0 под названием материализованные представления:

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

В версии 3.0 Cassandra представит новую функцию под названием Materialized Views. Материализованные представления обрабатывают автоматическую денормализацию на стороне сервера, устраняя необходимость обработки этой денормализации на стороне клиента и обеспечивая возможную согласованность между базовыми данными и данными представления. Эта денормализация позволяет очень быстро искать данные в каждом представлении, используя обычный путь чтения Cassandra.

Идея точно такая же, как предложена Джеффом Джирсой, но вам не потребуется обрабатывать всю логику согласованности с несколькими таблицами внутри вашего приложения, Cassandra сделает это за вас автоматически.

person shutty    schedule 15.12.2015
comment
Будьте осторожны, когда идете по этому пути, потому что материализованные представления обновляются асинхронно, а это означает, что ваше приложение должно быть способно обрабатывать возможную согласованность. Пакетный подход может позволить вам обеспечить лучшую согласованность для этого типа задач за счет сложности приложения. - person awinder; 21.03.2016
comment
MV кажется не очень хорошей идеей mail-archive.com/dev@ cassandra.apache.org/msg11511.html - person Alex Punnen; 23.07.2018