【问题标题】:Can I detect conflicts when writing to Cassandra?我可以在写入 Cassandra 时检测到冲突吗?
【发布时间】:2012-03-28 18:43:56
【问题描述】:

是否有一些时间戳/计数器可用于验证在读取-修改-写入周期中,行中的数据在读取和修改之间没有变化?

换句话说,我可以在读取行的同时读取某种 ID,当我写回它时告诉 Cassandra 那个 ID 是什么,如果从那时起 ID 改变了,那么写入会失败吗? (这相当于说在我读取数据后发生了其他一些写入)

【问题讨论】:

    标签: cassandra


    【解决方案1】:

    cassandra 中的每一列都是一个包含名称、值和时间戳的元组(或三元组)。列的时间戳表示上次修改的时间。如果您有 100 个节点,则具有最新时间戳的更新的节点将获胜。这就是Eventual Consistency 的实现方式。

    zznate 有一个很好的介绍:Introduction to Apache Cassandra for Java Developers 引用了这个主题(幻灯片 37)

    Accessing timestamp of a Cassandra column

    总之,当您能够检索表示上次修改时间的给定列的时间戳时,您不需要“某种 ID”。但是,在规模上有 100 个节点的情况下,您如何确定要连接的节点具有最新的列? (参考 zznate 演示文稿)

    重点是,如果不启用交易,您就不能:

    1. Cassandra - transaction support
    2. Cassandra Transaction with ZooKeeper - Does this work?
    3. how to integrate cassandra with zookeeper to support transactions
    4. 还有更多:cassandra & transactions

    【讨论】:

    • 我不确定我是否理解。您是说每列都存在“ID”(时间戳)。因此,如果读取数据,将涉及的所有“列”的时间戳记为 input 并且当我将修改后的数据写回时,请 Cassandra 检查这些时间戳是否没有改变,那么我将拥有我想要的想要,假设 API 允许这样做。但你说这行不通。是不是因为即使节点具有来自相同插入/更新的相同数据,不同的节点也会有不同的时间戳?恕我直言,这是唯一使它不可能的事情。否则,它只是一个“缺失的功能”。
    • (点击最大评论大小)我知道修改是事务性的在一行内。这就是我所要求的。读取一个行,修改它,然后更新同一行,确保它没有改变,如果有则失败。这是否会使一半人接受更改而其他人不接受,从而导致数据变得不一致?这可能是您所期待的问题。
    • 是的。你是对的。节点 A 的列 A 的时间戳可能为 xxxxyyyy,当您查询它时,它是正确的 - 但是,节点 Z 也有列 A 的时间戳为 xxxxyyyz(较新),但该更改尚未完全传播到其他节点根据指定的复制因子需要它
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-19
    • 1970-01-01
    • 2021-10-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-07
    • 2012-03-23
    相关资源
    最近更新 更多