5

是否存在支持对标量值进行幂等操作的分布式高可用性、最终一致的数据库?

如果我们使用正常更新,那么我们有可能在不同的节点上有 2 个不同的值,并且没有一个值是正确的,因为我们需要增加两个交易值的金额。

是否有一个分布式数据库,我可以在其中发送命令 increase(key, attribute[column], diff) 以便当我收到响应时,我可以确定无论帐户的当前值如何,该操作都会在其他副本上执行? 这样,即使 2 个不同的节点增加了不同的值,我也会对增加操作具有最终一致性,因为这种增加会传播到其他副本。

我不是在谈论条件更新,因为它不适用于像 cassandra 这样的高可用性数据库(这就是他们没有该功能的原因),我对原子增加操作感兴趣。

谢谢。

PS在幂等增加的情况下,我将有一个命令增加(key,attribute,diff,lock_key),这样如果db已经收到具有相同lock_key的相同命令,它就不会增加

tl;博士:

有没有办法在分布式 AP 类数据库中进行精确计数器?2 个问题: 1)如果我发送操作以增加计数器但我没有得到响应,我会再次发送该请求但不想增加计数器两次。2)如果该计数器在另一个副本上同时更新,我想最终结合这个增加,而不是覆盖这些值。那么是否有像 increase("John's balance", +5.67, "sdfsdfas") 这样的命令,其中 sdfsdfas 是一个用于丢弃重复更新的字符串。有没有复制这种命令的数据库?

4

2 回答 2

1

在我看来,您在谈论两件不同的事情。幂等性意味着您可以发送多次increase指令,但计数器只会增加一次。原子性对单个操作没有意义(它对多个操作有意义,例如,以原子方式增加计数器和增加的日期;要么都被修改,要么都不修改)。

MongoDB 支持“文档”级别的原子操作(我不确定您是否需要),但显然增量运算符不是幂等的(根据定义!否则您将如何增加计数器?)。

你能澄清你的问题吗?

此外,您不能拥有一个“最终一致”的数据库,其中所有节点每次都具有相同的给定键值。这就是它“最终一致”的原因,因为它不能保证它们“现在”是相同的。

至于答案,如果您想使用 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}});

于 2013-01-03T02:24:38.573 回答
1

好的,我看到问题 2 已经在 cassandra 中解决了https://issues.apache.org/jira/browse/CASSANDRA-1072 分布式计数器将结合增加操作,因此最后一切都会保持一致。

问题 1(幂等性)是一个未解决的问题:https ://issues.apache.org/jira/browse/CASSANDRA-4775

至少我知道人们会考虑这一点,这对我的场景非常重要,所以我会尽力帮助解决这个问题。

我希望这有助于澄清我的问题。

于 2013-01-04T05:05:32.457 回答