Cassandra = атомарность / изоляция обновлений столбцов на одной строке на одном узле? - PullRequest
3 голосов
/ 17 мая 2011

извините, что снова попросил что-то у Кассандры, и я был бы очень признателен за ваше возвращение:

Я прочитал это: http://wiki.apache.org/cassandra/FAQ#batch_mutate_atomic и совершенно потерян и удивлен:

Действительно ли это так, что в Кассандре ПИСЬМА на ОДНОМ УГЛОВОМ ОДНОМ КНОПКЕ (с МНОГИМИ КОЛОННАМИ, которые будут обновлены в ОДНОМ КОЛОННАМ, с использованием batch_mutate) НЕ ИЗОЛИРОВАНЫ против ЧИТАНИЯ на ОДНОМ УЗЛЕ ОДНОМУ КЛЮЧУ-КЛЮЧУКОЛОННЫ, гарантирующие, что чтение не готово «частично измененные данные»?Пример:

Current Status:     [KEY=1 , ColumnName=A with Value=A , ColumnName=B with Value=B] on Node 1
Client A => Writes: [KEY=1 , ColumnName=A with Value=C , ColumnName=B with Value=D] on Node 1

ATOMICITY:

Согласно документам cassandra, записи являются атомарными для клиента, выполняющего запись: приведенная выше запись либо будет полностью успешной, либо завершится неудачей полностью !?Что-то вроде [KEY=1 , ColumnName=A with Value=C , ColumnName=B with Value=B] (= половина обновлений столбцов завершилась успешно, но другая половина еще не была применена / не выполнена) не может быть РЕЗУЛЬТАТОМ записи в случае ошибки?Это правильно?

ИЗОЛЯЦИЯ:

Правда ли, что даже на ОДНОМ ОДНОМ УЗЛЕ (здесь Узле 1) записи не изолированы для того, кто читает ту же строку на том же Узле?Как описано выше, если Клиент A обновил половину своих столбцов, которые должны быть изменены (здесь ColumnName = A со значением = C), действительно ли верно, что другое соединение Client B с узлом 1 будет действительно видеть запись как

Client B => Reads:  [KEY=1 , ColumnName=A with Value=C , ColumnName=B with Value=B] on Node 1

И через несколько миллисекунд, читая снова, он увидит?

Client B => Reads:  [KEY=1 , ColumnName=A with Value=C , ColumnName=B with Value=D] on Node 1

.

Почему обновления не изолированы на основе узла?

Для меня это кажется довольно простым и дешевым?Почему в узле 1 блокировки памяти нет, что KEY = 1 в настоящее время находится в процессе обновления, поэтому чтение может ждать завершения этой записи?(Это было бы очень маленькими накладными расходами, поскольку блокировка локально удерживается в памяти на Node1 и может быть настроена так, чтобы клиент чтения мог принять «блокировку» или просто прочитать грязное значение? Так что это что-то вроде «»Настраиваемый уровень изоляции "? Если мне нужна высокая производительность, я игнорирую блокировки / отключаю их, и если мне нужна изоляция для каждого узла и я принимаю отрицательное влияние на производительность, то я жду, когда будет снята блокировка памяти (на узле 1)?(Заметьте, я не говорю о скрытых / распределенных блокировках, но блокировках, которые гарантируют на одной обработке, что запись изолирована для каждого ключа строки!)

Или изоляция отличается от "изменение существующих столбцов "по сравнению с операциями, которые" добавляют / добавляют столбцы ". Таким образом, цепочка columsn (как в примере выше является изолированной), но добавление новых columsn не изолирована. С моей точки зрения, изменение существующих столбцов должно быть изолированным / атомарным.... Добавление columsn не так уж много необходимо для изоляции ...

Вопроспочему я спрашиваю: если что-то, как показано выше, может произойти, что читает действительно прочитанные частично измененные записи, то какие варианты использования тогда законны для nosql / cassandra?Это означает, что любой случайный столбец данных может существовать для каждой строки, так как columsn может находиться в произвольном состоянии чтения / записи?Я почти не знаю каких-либо данных и прецедентов, которые могут быть изменены "произвольно" для каждой строки.

Большое спасибо !!!Jens

Ответы [ 3 ]

5 голосов
/ 18 мая 2011

Почему в узле 1 блокировки памяти нет, что KEY = 1 в настоящее время находится в процессе обновления, поэтому чтение может ожидать завершения этой записи?

Потому чтоКассандра особо подчеркивает денормализацию для производительности (распределенные объединения не масштабируются, и да, здесь я правильно использую «масштабирование» - распределенные объединения имеют O (N) в количестве машин в кластере), записывают объем в «материализованный»Вид "строки может быть ОЧЕНЬ высоким".Поэтому блокировка на уровне строк привела бы к неприемлемому конфликту для многих реальных рабочих нагрузок.

3 голосов
/ 18 мая 2011

На странице, на которую вы ссылаетесь , написано:

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

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

Несколько случаев использования, когда это не имеет значения:

  • Системы, в которые данные записываются, возможно, добавляются, но не обновляются
  • Системы, в которых считывания, как известно, разделены во времениfrom write
  • Системы, в которых значения столбцов не тесно связаны (и вы можете сделать так, чтобы любое из ваших значений могло быть объединено взначение одного столбца)
  • Системы, в которых согласованность данных в любом случае не критична, и где пользователи часто обновляют свои представления
0 голосов
/ 27 января 2012

чат из журнала IRC:

itissid: Итак, http://wiki.apache.org/cassandra/FAQ#batch_mutate_atomic говорит, что это особый случай Но если мы делаем нормальную запись, они изолированы?

thobbs: столбец - это единица изоляции ничто над этим не изолировано (пока)

itissid: Хорошо, понял

thobbs: есть работа по выделению записей в одну строку

driftx: сделано за 1.1

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...