3

Cassandra の軽量トランザクションに実装されている Paxos アルゴリズムに関して、非常に具体的な質問があります。

2 つのノードが同じプロポーザルを同時に発行するとどうなりますか? どちらも ' [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}]

私の質問は、このクエリを 2 つのノードから並行して実行するとどうなるかということです。どちらも受かる可能性はありますか?

(私のユースケースは、このスタックオーバーフローの質問で説明されています)

4

2 に答える 2

4

Paxos の効果は、クエリが「線形化」されることです。2 つの異なるノードの同じ行で同時に実行される 2 つのクエリは、一方が他方の後に実行されるという結果になります。そして2番目は適用されません。明らかに、これが機能するには、両方のクエリで CAS を使用する必要があります。詳細はこちらこちら

于 2015-04-02T11:36:18.047 に答える
1

両方のクエリを同時に実行することはできません。クエリごとに、paxos に基づいて合意に達するために使用される提案が作成されます。これは、提案に関連付けられたタイムスタンプに基づいて発生し、同じタイムスタンプが 2 つの提案の失敗につながります。

于 2015-04-02T11:32:33.517 に答える