卡桑德拉的轻量级交易& Paxos一致性算法

时间:2015-04-02 08:12:45

标签: cassandra paxos consensus

我对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 question中描述)

2 个答案:

答案 0 :(得分:4)

Paxos的效果是查询得到“线性化”:在2个不同节点上的同一行上同时执行的2个查询将导致其中一个在另一个节点之后执行。而第二个将不适用。显然,两个查询都必须使用CAS才能工作。更多信息herehere

答案 1 :(得分:1)

两个查询不可能同时执行。对于每个查询,都会创建一个提案,用于根据paxos达成共识。这将基于与提案相关联的时间戳发生,其中相同的时间戳仍然会使两个提案失败。