Кассандра: противоречивые семейства столбцов
Взято из примера в http://www.ibm.com/developerworks/library/os-apache-cassandra/. Предположим, мы имеем дело с двумя объектами: книгами и тегами. Книга имеет несколько тегов, поэтому соотношение между ними составляет 1:M.
Согласно статье, мы должны создать два семейства столбцов: Books
а также Tags2BooksIndex
, Первый хранит всю информацию о книге (включая все ее теги), в то время как последний является индексом, который отображает теги в книги, так что для данного тега мы можем быстро найти все книги, имеющие этот тег. Все это выглядит хорошо. Но у меня есть вопрос:
Учитывая, как добавить новую книгу в базу данных: (1) добавить новую строку в семейство столбцов Books
(2) обновить Tags2BooksIndex
добавить новую книгу ко всем строкам тегов, связанных с этой книгой.
Скажем, через 2 секунды после выполнения шага (1) новая строка книги была реплицирована на все узлы, на которые она должна идти, и шаг (2) все еще выполняется. Теперь, если я читаю эту новую строку книги из books
чтобы получить тег, а затем использовать этот тег для проверки Tags2BooksIndex
может случиться так, что я не могу найти новую книгу от Tags2BooksIndex
поскольку либо оно еще не полностью обновлено, либо обновление еще не реплицировано на все узлы реплики.
Как справиться с такой ситуацией? Замените 2 секунды на 2 миллисекунды, у нас все еще есть временное окно несоответствия. Я хотел бы знать "правильный / практический" способ справиться с такой ситуацией.
1 ответ
Кассандра падает в сторону AP от CAP. Он жертвует последовательностью. Существуют способы, которые могут помочь с пакетными операторами в Cassandra 2.x: http://www.datastax.com/documentation/cql/3.1/cql/cql_reference/batch_r.html
Хотя реальный вопрос здесь в том, каковы будут последствия такой несогласованности? Это 2-минутное окно, в течение которого ваш поиск не вернет новую книгу по тегу? Это катастрофично? В отказоустойчивой распределенной системе вам часто приходится принимать карманы несогласованности или жертвовать доступностью, поскольку разделы могут и будут иметь место. Если ваша модель данных нуждается в двух отдельных атомарных мутациях, то пакетные операторы могут помочь, но это отнимает немного доступности. Если вы согласны с небольшим количеством несоответствий, то вы остаетесь доступным. Это зависит от ваших конкретных бизнес-требований относительно того, что является и не является приемлемым.