【问题标题】:How to know affected rows in Cassandra(CQL)?如何知道 Cassandra(CQL) 中受影响的行?
【发布时间】:2015-04-21 02:20:49
【问题描述】:

似乎没有任何直接的方法可以知道 cassandra 中受影响的行以进行更新和删除语句。

例如,如果我有这样的查询:

DELETE FROM xyztable WHERE PKEY IN (1,2,3,4,5,6);

现在,当然,因为我已经传递了 6 个键,很明显 6 行会受到影响。

但是,就像在 RDBMS 世界中一样,有没有办法知道 datastax-driver 中更新/删除语句中受影响的行?

我读过 cassandra 对写操作没有任何反馈 here

除了我无法通过 google 看到有关此主题的任何其他讨论。

如果这不可能,我能否确定使用上面给出的查询类型,它会全部删除或无法全部删除?

【问题讨论】:

    标签: java sql cassandra cql datastax-java-driver


    【解决方案1】:

    在最终一致的世界中,您可以将这些操作视为保存删除请求,并根据请求的一致性级别等待多个节点确认该请求已被接受。然后将请求异步传递到其他节点。 由于不依赖外键等任何内容,因此如果请求被集群成功接受,则不会阻止数据被删除。

    但是,有很多如果。例如,删除一致性级别为 1、被一个节点成功接受的数据,然后立即发生节点硬故障,如果在故障之前没有复制,则可能导致该删除丢失。

    另一个例子 - 在删除过程中,一个节点停机,并且停留了相当长的时间,超过 gc_grace_period,即超过删除数据删除墓碑所需的时间。那么如果这个节点被恢复,那么所有突然从集群的其余部分中删除的所有数据,而不是从这个节点中删除的数据,都将被带回集群。

    因此,为了避免这些情况,并认为操作成功且最终,cassandra 管理员需要实施一些措施,包括定期修复作业(以确保所有节点都是最新的)。此外,应用程序需要决定什么更好 - 一致性级别 1 的性能更快,但可能会丢失数据,而一致性级别越高,性能越低,但数据丢失的可能性越小。

    【讨论】:

    • 所以抛开负面情况,我可以假设数据将被删除?
    • 是的——如果集群没有拒绝你的请求——它将被成功执行。请记住,cassandra 是按照 last write wins 的原则操作的,所以如果有并发删除/更新(update 是 insert 的同义词),那么无论哪个操作具有最新的时间戳,都将获胜 :) 这意味着它非常保持时钟在所有节点上同步很重要。
    【解决方案2】:

    在 Cassandra 中无法做到这一点,因为 Cassandra 中的写入、删除和更新模型基本相同。在所有这些情况下,表格中都会添加一个单元格,其中包含新信息或有关删除的信息。这是在不检查当前数据库状态的情况下完成的。

    如果不检查其余副本并对行进行完全合并,则无法判断任何操作是否会实际影响数据库的当前读取状态。

    这导致了经常被引用的“先读后写”的反模式。在 Cassandra 中,您应该尽可能快地编写,如果您需要历史记录,请使用保存修改日志而不仅仅是当前状态的数据结构。

    有一个选项可以进行这样的查询,使用IF value THEN do other thing 的 CAS 语法,但与普通写入相比,这是一项非常昂贵的操作,应谨慎使用。

    【讨论】:

      猜你喜欢
      • 2014-01-02
      • 2020-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-30
      • 1970-01-01
      相关资源
      最近更新 更多