【问题标题】:Cassandra Batch statement-Multiple tablesCassandra Batch语句-多表
【发布时间】:2018-08-27 15:50:36
【问题描述】:

我想使用批处理语句从我的数据库中的 3 个表中删除一行以确保原子性。所有 3 个表中的分区键将相同。在我阅读的有关批处理语句的所有示例中,所有查询都是针对单个表的吗?就我而言,使用批处理语句是个好主意吗?或者,我应该避免吗?

我正在使用 Cassandra-3.11.2,并使用 C++ 驱动程序执行查询。

【问题讨论】:

    标签: cassandra cassandra-3.0


    【解决方案1】:

    是的,您可以使用批处理来确保原子性。单个分区批处理更快(相同的表和相同的分区键)但仅适用于有限数量的分区(在您的情况下为三个)没关系。但不要将其用于性能优化(例如:减少多个请求)。如果你需要原子性,你可以使用它。

    您可以查看以下链接:

    Cassandra batch query performance on tables having different partition keys
    Cassandra batch query vs single insert performance
    How single parition batch in cassandra function for multiple column update?

    已编辑

    在我的情况下,表是不同的,但所有 3 个表中的分区键是相同的。这是单分区批处理的特例,还是完全不同的东西。

    对于不同的表分区也不同。所以这是一个多分区批处理。 LOGGED 批处理用于确保不同分区(不同表或不同分区键)的原子性。 UNLOGGED 批处理用于确保单个分区批处理的原子性和隔离性。如果您使用 UNLOGGED 批处理进行多分区批处理原子性将无法保证。默认为 LOGGED 批处理。对于单个分区批处理默认为 UNLOGGED。因为单分区批次被认为是单行突变。对于单行更新,不需要使用 LOGGED 批处理。要了解 LOGGEDUNLOGGED 批次,我在下面分享了一个链接。

    多分区批处理只能用于在不同表上实现少量写入的原子性。除此之外,应该避免使用它们,因为它们太贵了。

    单分区批处理可用于实现原子性和隔离性。它们并不比普通写入贵多少。

    但您可以使用多分区LOGGED批处理,因为分区有限。

    一个非常有用的 Doc in Batch 并提供了所有详细信息。如果你读到这里,所有的困惑都会被清除。

    Cassandra - to BATCH or not to BATCH

    分区键令牌与行分区

    表分区和分区键令牌不同。分区键用于决定数据驻留在哪个节点。对于相同的行键,分区令牌相同,因此驻留在同一节点中。对于不同的分区键或相同的键不同的表,它们是不同的行突变。即使对于相同的键,您也无法通过一次查询来获取不同分区键或不同表的数据。协调节点必须将其视为不同的请求或突变,并分别从复制节点请求实际数据。这是 C* 存储数据的内部结构。

    每个表甚至都有自己的目录结构,这清楚地表明一个表的分区永远不会与另一个表的分区交互。

    Does the same partition key in different cassandra tables add up to cell theoretical limit?

    要了解 C* 如何映射数据的详细信息,请查看此链接:

    Understanding How CQL3 Maps to Cassandra's Internal Data Structure

    【讨论】:

    • 在我的例子中,表是不同的,但分区键在所有 3 个表中是相同的。这是单分区批处理的特例,还是完全不同的东西。实际上,在 C++ 驱动程序中,'CASS_BATCH_TYPE_LOGGED' 建议用于跨多个分区的突变,'CASS_BATCH_TYPE_UNLOGGED' 建议用于单个分区。我只是想确保在我的情况下(3 个表),我可以使用“UNLOGGED”类型。
    • 之前我认为具有相同分区键的不同表会有相同的分区。但是你说不是这样的。您能否详细说明为什么会这样,因为根据我的理解,分区键用作散列函数的输入,散列将决定数据将写入哪个节点。如果3张表的分区键都一样,那为什么不应该是单分区呢?
    • 嗨@Chaity 这个链接-datastax.com/dev/blog/row-level-isolation 指定“对于原子性,保证实际上扩展到列族(在相同的键空间内):即使对于不同的列,相同分区键的更新也会以原子方式保存family." ,并且实现细节指定为更新不同表上的相同分区键创建单个 RowMutation 并以原子方式执行。这不是说不同表的同一个分区键,数据都存放在同一个分区吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-02
    • 2015-01-22
    • 2014-09-27
    • 2018-05-06
    • 1970-01-01
    相关资源
    最近更新 更多