Облегченные транзакции Cassandra и алгоритм консенсуса Paxos

У меня есть очень конкретный вопрос об алгоритме Paxos, который реализован в облегченных транзакциях Cassandra:

Что произойдет, если два узла выдадут одно и то же предложение одновременно? Они оба получают '[applied]: true'?

Например, рассмотрим эту таблицу:

ids:
+-------------------+---------------+
| id_name (varchar) | next_id (int) |
+-------------------+---------------+
| person_id         |             1 |
+-------------------+---------------+

И этот запрос:

UPDATE ids
SET next_id = 2
WHERE id_name = 'person_id'
IF next_id = 1

Если я выполняю этот запрос, я получаю в ответ:

[{[applied]: True}]

Если я выполню его снова, что тогда не будет принято, так как next_id != 1, я получаю:

[{[applied]: False, next_id: 2}]

Мой вопрос: что произойдет, если я выполню этот запрос с двух узлов параллельно. Есть ли шанс, что они оба будут приняты?

(Мой вариант использования описан в этом вопросе stackoverflow)


person AlonL    schedule 02.04.2015    source источник


Ответы (2)


Невозможно, чтобы оба запроса выполнялись одновременно. Для каждого запроса создается предложение, которое будет использоваться для достижения консенсуса на основе paxos. Это произойдет на основе временной метки, связанной с предложением, где идентичная временная метка по-прежнему приведет к сбою одного из двух предложений.

person Stefan Podkowinski    schedule 02.04.2015

Эффект Paxos заключается в том, что запросы становятся «линеаризованными»: 2 запроса, выполняемые одновременно в одной и той же строке на 2 разных узлах, приведут к тому, что один из них будет выполнен после другого. И второй применяться не будет. Очевидно, что оба запроса должны использовать CAS, чтобы это работало. Дополнительная информация здесь и здесь.

person G Quintana    schedule 02.04.2015