如何设置Cassandra的读写一致性。

10

我找不到相关的文档。我知道在cqlsh中有一个一致性命令,但没有区分读和写的一致性级别。如何为读和写设置不同的一致性级别?

此外,提到了“默认”一致性级别。该默认级别在哪里设置?它是针对读还是写的?


请查看您正在使用的驱动程序的文档,例如Java驱动程序:https://docs.datastax.com/en/drivers/java/2.0/com/datastax/driver/core/class-use/ConsistencyLevel.html - Chris Gerlt
所以...你能找到它的方法了吗?谷歌没有帮上忙。 - JSelser
5个回答

5

1
这两个链接都无法访问了!你能否更新一下? - user1401472

5

如何为读和写设置不同的一致性级别?

如果您只想更改当前会话的一致性级别,请使用CONSISTENCY

如果您想以编程方式更改一致性级别,请使用适用于客户端语言的Cassandra驱动程序。

由于一致性级别可以针对每个语句进行设置,因此您可以在每个语句上设置它,或者使用预处理语句。如果您正在使用Java驱动程序,则可以为读和写配置全局一致性级别(但不是仅限于只读只写)。

默认的[一致性级别]在哪里设置?它是用于读还是写?

如果您想为读和写设置不同的一致性级别,则必须在每个语句上进行设置。使用QueryOptions().setConsistencyLevel设置全局一致性级别(对于Java驱动程序)。它适用于读和写

要为当前会话设置一致性级别,请使用来自Cassandra shell(CQLSH)的CONSISTENCY命令。
例如:
将一致性设置为强制大多数节点响应: CONSISTENCY QUORUM 要查看当前的一致性级别,只需从shell运行CONSISTENCY;即可: ty@cqlsh> consistency; Current consistency level is ONE. 对于编程客户端应用程序,请使用适当的驱动程序设置一致性级别。
例如,使用Java驱动程序设置每个插入的一致性级别,可以调用QueryBuilder.insertInto并使用setConsistencyLevel
例如: PreparedStatement pstmt = session.prepare( "INSERT INTO product (sku, description) VALUES (?, ?)"); pstmt.setConsistencyLevel(ConsistencyLevel.QUORUM); 要使用Java驱动程序为读取和写入设置全局一致性级别,请执行以下操作:
QueryOptions qo = new QueryOptions().setConsistencyLevel(ConsistencyLevel.ALL);
由于Java驱动程序仅执行CQL语句,这些语句可以是对Cassandra的读取或写入,因此不可能仅为读取或仅为写入全局配置一致性级别。要这样做,由于一致性级别可以针对每个语句进行设置,您可以在每个语句上设置它,或者使用PreparedStatements。有关更多信息,请参见Queries and Results文档。
更多关于读/写一致性级别的资源:

其他关于一致性的资源: 您可能还想了解副本放置策略和复制因子(这些是其他形式的一致性)。 我为了保险起见,包含了以下链接:


0

现在设置一致性级别不再使用PreparedStatement。该API已经更改。现在您必须使用BatchStatementBuilder

这里是一个可行的示例代码。

BatchStatementBuilder builder = BatchStatement.builder(DefaultBatchType.UNLOGGED);
        builder.setConsistencyLevel(ConsistencyLevel.LOCAL_QUORUM);
        PreparedStatement preparedStatement = session.prepare("INSERT INTO \"ScottKeySpace16\".\"Movie\" (title, year, plot) values (:k0, :k1, :k2)");
        builder.addStatement(preparedStatement.boundStatementBuilder()
            .setString("k0", "Movie44")
            .setInt("k1", 2022)
            .setString("k2", "This is a very funny movie")
            .build());

        BatchStatement batchStatement = builder.build();
        session.execute(batchStatement);

0

一旦使用CQL USING子句,一致性级别就不再设置。请参见CASSANDRA-4734以获取说明。

相反,在CQLSH中,您应该使用CONSISTENCY命令:有关详细信息,请参见此处

请注意,所有DataStax驱动程序中的默认一致性级别已从ONE更改为LOCAL_ONE:有关详细信息,请参见Python驱动程序文档 - 但是,尽管在幕后使用了Python驱动程序,但CQLSH仍具有ONE的默认一致性级别)。


“ONE to LOCAL_ONE”。我不确定是否同意这一点;在cqlsh中没有设置任何内容的默认一致性是ONE(输出“当前一致性级别为ONE”)。 - Rdesmond
1
你是对的,Python驱动现在默认为LOCAL_ONE,但cqlsh仍然默认为ONE:https://github.com/apache/cassandra/blob/trunk/bin/cqlsh.py#L757 - adutra

-1
  1. 默认一致性设置在cassandra.conf文件中。它适用于读和写。

  2. 您可以通过在查询中添加USING选项来设置每个查询的一致性。


我看到了3个回答,但都没有我的答案。我的问题是如何设置不同的读写一致性。因此,我认为正确的答案不再是使用“using”子句,而是使用一致性命令,但我的问题是如何为读和写设置不同的级别? - bhomass
你只是重复了我的评论,没有回答问题。我感到困惑,这样的事情竟然成了一个谜。你不可能被迫同时设置相同的一致性级别来读取和写入数据,那样没有任何意义。 - bhomass
使用cqlsh无法设置。但在Java程序中,您可以设置。在Java驱动程序中,您可以找到Write conf和Read Conf,并且还可以创建两个不同的集群和会话,一个用于读取,另一个用于写入。 - mahendra singh
好的,下次我遇到Datastax的人,我一定会向他或她提出这个问题。这绝对听起来像是产品规格中的漏洞。 - bhomass

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接