Кассандра одновременно пишет

Как Cassandra гарантирует возможную согласованность при одновременной записи?

Например, клиент А записывает в tableA.rowA.colA, а клиент B в то же время записывает в tableA.rowA.colA.

Узлы-координаторы распределяют запрос на узлы-реплики, скажем, NodeA, NodeB и NodeC.

На NodeA запрос ClientA поступает первым. На NodeB первым приходит запрос ClientB. Тогда будет ли это вечно непоследовательным?


person user1947415    schedule 14.06.2017    source источник


Ответы (2)


Кассандра придерживается политики «последняя запись выигрывает». Используемая временная метка может быть установлена ​​вручную, но по умолчанию она устанавливается запрашивающей стороной на стороне клиента см. документацию по Java-драйверу Datastax. Порядок поступления записей значения не имеет. Если запись A имеет более раннюю временную метку, чем запись B, то она всегда будет перезаписана записью B. Единственный неоднозначный случай — это когда временные метки точно совпадают. В этом случае выигрывает большее значение.

В конечном итоге последовательная часть этого:

  • Предполагая, что A имеет более раннюю временную метку, чем B
  • Если A поступает на реплику 1, а B — на реплику 2, правильное состояние — B.
  • Реплика 1 будет отвечать A до тех пор, пока не получит информацию о B от реплики 2.
  • Когда B реплицируется, реплика 1 также ответит B.

В большинстве случаев использования состояние в Cassandra не сохраняется, поэтому подобных проблем не возникает.

person RussS    schedule 14.06.2017
comment
Хорошо, поэтому временная метка устанавливается до того, как она достигнет каких-либо машин-реплик. Поэтому убедитесь, что все запросы на обновление имеют одинаковую временную метку для одного и того же клиента. - person user1947415; 15.06.2017
comment
Как клиенты синхронизируют свои метки времени? например, у разных серверов разное местное время. - person user1947415; 15.06.2017
comment
Обычно NTP, но более важно построить модель данных, в которой разные клиенты, имеющие несинхронизированное время, не уничтожат данные. - person RussS; 15.06.2017

При каждой записи (вставке/обновлении/удалении) в cassandra также вставляется отметка времени, связанная с каждым столбцом. когда вы выполняете запрос на чтение, временные метки используются для выбора «победившего» обновления в одном столбце или элементе коллекции

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

Таким образом, для вашего случая "На узле A первым приходит запрос ClientA. На узле B первым поступает запрос ClientB"

  • Если отметка времени запроса ClientA старше, тогда ClientA выиграет

  • Если отметка времени запроса ClientB старше, то ClientB выиграет.

  • Если ClientA и ClientB имеют одинаковую временную метку, то победитель выбирается путем лексического сравнения значений по байтам, так что возвращаемое значение является детерминированным.

person Ashraful Islam    schedule 14.06.2017