database - 具有幂等增长运算符的最终一致性分布式数据库?

标签 database nosql cassandra high-availability eventual-consistency

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

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

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

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

谢谢。

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

tl;dr:

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

最佳答案

在我看来,您在谈论两件不同的事情。幂等性意味着您可以多次发送 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}});

关于database - 具有幂等增长运算符的最终一致性分布式数据库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14132199/

相关文章:

couchdb - 如何仅为某些用户和角色显示和复制文档?

Cassandra TimeUUID 字段的 Solr 映射

mongodb - 分析 - mongodb 或 cassandra

java - PoolingOptions 和 Cassandra - java

sql - 如何在 Sql 中设计 oauth 2.0 访问 token 字段?

nosql - 有没有办法像 Hibernate 一样在 Neo4J 上记录查询?

database - Aerospike 错误 : (9) Client timeout: timeout=1000 iterations=1 failedNodes=0 failedConns=0

php - MySql Tinytext vs Varchar vs Char

java - 我们真的需要在ThreadLocal中设置Transaction吗?

java - MySQL 和 Java - 插入表时抛出异常