5

是否有分佈式高可用性,最終是一致的數據庫,支持對標量值進行冪等運算?最終一致的分佈式數據庫與冪等增加運算符?

如果我們用正常的更新,再有就是,我們會有不同的節點上2個不同的值,因爲我們需要雙方交易價值增加量沒有值將是正確的可能性。

是否有一個分佈式數據庫,我可以發送一個命令增加(key,attribute [column],diff),這樣當我收到一個響應時,我可以確定該操作將在其他副本上執行,而不管當前賬戶的價值?通過這種方式,即使2個不同的節點增加了不同的值,我也將具有增加操作的最終一致性,因爲增加會傳播到其他副本。

我不是在談論有條件的更新,因爲它不會對高可用性數據庫像Cassandra的工作(這就是爲什麼他們不具備該功能),我感興趣的原子增加操作。

謝謝。

P.S. 在冪等增加的情況下我會一個命令增加(鍵,屬性,DIFF,lock_key),所以如果它已經收到具有相同lock_key

TL相同的命令分貝不會做增加; DR:

有沒有辦法在分佈式AP類數據庫中做一個精確的計數器? 2問題: 1)如果我發送操作來增加一個計數器,但我沒有得到響應,我會再次發送該請求,但不希望增加計數器兩次。 2)如果該計數器在另一個副本上同時更新,我想最終將這個增加結合起來,而不是覆蓋這些值。 所以有一個像增加命令(「約翰的平衡」,+5.67,「sdfsdfas」),其中sdfsdfas是一個字符串用於丟棄重複更新。是否有一個數據庫複製這種類型的命令?

+0

我不確定我是否理解這方面的用處。如果所有副本必須始終保持相同的值是至關重要的,那麼它們必須保持同步。 「冪等更新」如何爲此提供幫助? –

+0

剛剛使用任何數據庫與複製,然後等價地'insert into increase_operations(target_id,increase_amount,operation_id)'然後求和()你的勝利方式? operation_id是您如何識別重複操作。它當然最終一致。 – goat

回答

1

在我看來,你在談論兩件不同的事情。冪等性意味着您可以發送多次increase指令,但計數器只會增加一次。原子性對單個操作沒有意義(對於多個操作是有意義的,例如,增加計數器和原子級增加的日期;或者兩者都修改,或者兩者都不)。但是顯然增量運算符不是冪等的(按照定義!否則你會如何增加計數器?)。

你能澄清你的問題嗎?

而且,你不能有一個「最終一致」的數據庫,所有的節點將在每次給定鍵的值相同。這就是爲什麼它「最終一致」的原因,因爲它不能保證它們現在是「一樣的」。

作爲一個答案,如果你想使用MongoDB的維護的遞增運算符,使用以下模式(從他們的網站,例如[$inc operator][1]的):

db.collection.update({ age: 20 }, { $inc: { age: 1 } }); 
db.collection.update({ name: "John" }, { $inc: { age: 1 } }); 

在你的情況,這將是db.collection.update({$inc:{mycounter:1}});

+0

是的,我想有更新({name:「John」},{$ inc:{balance:58.4}}); 我是否在MongoDB中得到確認,以便我不運行相同的查詢兩次? 這是一種方法。另一種完成同樣事情的方式是通過一種冪等的增加,以使相同的操作不會運行兩次。例如,如果命令需要提供某種locking_key,以便它知道我是否已經嘗試更新。 我想在AP數據庫中看到這樣的功能(MongoDB是CP,對嗎?) – user1944408

+0

在我的問題中添加了tl; dr。 – user1944408