【问题标题】:Atomic Batches in CassandraCassandra 中的原子批处理
【发布时间】:2014-05-05 00:57:46
【问题描述】:

批处理语句在 cassandra 中是原子的是什么意思?准确地说,文档在本质上有点令人困惑。这是否意味着查询在集群中的节点之间是原子的?

例如,我有一个包含 100 个查询的批次。如果批处理中的第 40 个查询失败,那么批处理中执行的 39 个查询会发生什么?

我了解在后台创建了一个批处理日志,它将负责部分批处理的一致性。它是否删除了其余 39 个条目并提供了批处理查询所需的原子性质。

在 MYSQL 中,我们将 autocommit 设置为 false,因此我们可以回滚。 cassandra 在这些情况下会回滚吗?

【问题讨论】:

  • 不确定您是否对答案感到满意,因为直到现在都没有被接受。我的问题是,如果您指的是多分区或单分区批处理,因为它们的处理方式不同。
  • 我刚刚发表了一篇文章,解释了单分区批处理和多分区批处理之间的区别,希望它有助于更​​好地理解批处理:inoio.de/blog/2016/01/13/cassandra-to-batch-or-not-to-batch

标签: cassandra batch-processing datastax-java-driver cassandra-2.0


【解决方案1】:

原子性是基于协调器的。这意味着当您进行原子批量突变时,它将转到一个协调器。如果您的批次中的一个突变(在您的示例中为 40)由于负责它的副本已死而失败,则协调器将为该副本写入提示,并在死节点备份时交付它。

但是,在一种情况下,您最终会应用一半的突变:如果协调器本身有问题。

要了解有关原子批处理的更多信息,请阅读以下内容: http://www.datastax.com/dev/blog/atomic-batches-in-cassandra-1-2

【讨论】:

  • 查询有问题而不是节点有问题的情况如何。例如,查询中有一个空值,第 40 个查询失败,因为它有一个空值。你的意思是说后面的批处理永远不会被记录,错误会在批处理验证中被捕获?
  • 这就是 Unlogged 批处理会做的事情(提示)。记录的批次做得更多。
【解决方案2】:

它们实际上被称为记录批次而不是原子批次。您获得的不仅仅是提示(任何写入都会获得),您还可以在协调器开始执行写入之前将批次复制到其他 2 个节点。

前段时间我写了一篇博客:http://christopher-batey.blogspot.co.uk/2015/03/cassandra-anti-pattern-cassandra-logged.html

对于您的具体问题“它是否会删除其余 39 个条目并提供批处理查询所需的原子性质”

否 - Casssandra 没有回滚的概念。批处理日志副本将不断重试查询,直到全部成功。

【讨论】:

    【解决方案3】:

    最终一致是 C* 中的主要思想,他们以同样的方式设计批处理。与 SQL 世界中的 事务 不同,当失败发生时,批处理是“重放”而不是回滚。

    这种设计差异是合理的,因为在 C* 中,添加比删除便宜。

    需要注意的是,隔离 在 C* 中是不允许的。也就是说,其他客户端可能仍会读取部分更新的值。

    C*中批处理的特性讨论页面 https://issues.apache.org/jira/browse/CASSANDRA-4285

    【讨论】:

    • 您在同一个分区中获得隔离,而不是在分区之间。
    【解决方案4】:

    原子批处理应该是 All or nothing。我不认为它应该只重放部分日志,因为它不与原子批处理定义一起使用。

    -Vivek

    【讨论】:

    • 它们被称为记录批处理,但是一些博客/文档称它们为原子的。
    猜你喜欢
    • 2015-04-05
    • 1970-01-01
    • 2018-09-02
    • 1970-01-01
    • 1970-01-01
    • 2011-02-22
    • 1970-01-01
    • 2017-05-24
    相关资源
    最近更新 更多