Database 具有幂等增长算子的最终一致分布式数据库?

Database 具有幂等增长算子的最终一致分布式数据库?,database,nosql,cassandra,high-availability,eventual-consistency,Database,Nosql,Cassandra,High Availability,Eventual Consistency,是否有一个分布式的高可用性、最终一致的数据库支持对标量值的幂等运算 如果我们使用普通更新,那么有可能在不同的节点上有两个不同的值,并且没有一个值是正确的,因为我们需要通过两个事务值来增加金额 是否有一个分布式数据库,我可以在其中发送命令增加(key,attribute[column],diff),这样当我收到响应时,我就可以确保在其他副本上执行该操作,而不管帐户的当前值如何?这样,即使两个不同的节点增加了一个不同的值,我也将最终保持增量操作的一致性,因为增量将传播到其他副本 我不是说有条件的更新

是否有一个分布式的高可用性、最终一致的数据库支持对标量值的幂等运算

如果我们使用普通更新,那么有可能在不同的节点上有两个不同的值,并且没有一个值是正确的,因为我们需要通过两个事务值来增加金额

是否有一个分布式数据库,我可以在其中发送命令增加(key,attribute[column],diff),这样当我收到响应时,我就可以确保在其他副本上执行该操作,而不管帐户的当前值如何?这样,即使两个不同的节点增加了一个不同的值,我也将最终保持增量操作的一致性,因为增量将传播到其他副本

我不是说有条件的更新,因为它在像cassandra这样的高可用性数据库上不起作用(这就是为什么他们没有那个功能),我对原子增加操作感兴趣

谢谢

附言。 在幂等递增的情况下,我会有一个命令递增(key,attribute,diff,lock_key),这样如果db已经收到了使用相同lock_key的相同命令,它就不会递增

tl;医生:

有没有办法在分布式AP类数据库中制作精确计数器? 2个问题: 1) 如果我发送操作以增加计数器,但没有收到响应,我将再次发送该请求,但不希望将计数器增加两次。 2) 如果在另一个复制副本上同时更新该计数器,我希望最终将其合并,而不是覆盖这些值。
所以有一个像REGRESS(“John’s balance”、+5.67、“sdfsdfas”)这样的命令,其中sdfsdfas是一个用于放弃重复更新的字符串。是否有一个数据库可以复制这种命令?

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

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

你能澄清你的问题吗

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

至于答案,如果您想使用MongoDB来维护增量操作符,请使用以下模式(从他们的网站,例如
[$inc operator][1]
):


在您的例子中,它将是
db.collection.update({$inc:{mycounter:1}})

好的,我看到问题2已经在cassandra中解决了 分布式计数器将结合递增操作,因此最终所有操作都将保持一致

问题1(幂等性)是一个悬而未决的问题:

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


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

我不确定我是否理解这样做是否有用。如果所有副本必须始终保持相同的值这一点至关重要,那么它们必须保持同步。“幂等更新”对此有何帮助?如果只使用任何具有复制功能的数据库,然后等效地
插入递增操作(target\u id、递增量、operation\u id)
,然后求和()您的胜利之路如何?操作id是识别重复操作的方式。它最终肯定是一致的。是的,我希望有类似更新的东西({name:“John”},{$inc:{balance:58.4}});我是否在MongoDB中得到确认,这样我就不会运行同一个查询两次?这是一种方式。完成相同操作的另一种方法是使用一种幂等增长,这样相同的操作就不会运行两次。例如,如果命令需要提供某种类型的锁定密钥,以便它知道我是否已尝试更新。我希望在AP数据库中看到这样的特性(MongoDB是CP,对吗?)添加tl;请回答我的问题。
db.collection.update( { age: 20 }, { $inc: { age: 1 } } );
db.collection.update( { name: "John" }, { $inc: { age: 1 } } );