【问题标题】:how to set cassandra read and write consistency如何设置cassandra读写一致性
【发布时间】:2016-06-14 09:00:13
【问题描述】:

我找不到这方面的文档。我知道cqlsh中有一个一致性命令,但是没有读写一致性的区别。如何为读写设置不同的一致性级别?

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

【问题讨论】:

标签: cassandra consistency


【解决方案1】:

默认情况下,所有 R/W 操作的一致性级别为 ONE。

通过在查询中添加CONSISTENCY XXXX 语法,在每个查询(读取或更新插入)的基础上完成设置 CL,如下所示:

https://cassandra.apache.org/doc/latest/cql/dml.html#insert

和

https://cassandra.apache.org/doc/4.0/tools/cqlsh.html

【讨论】:

  • 这两个链接都无法访问了!你能更新一下吗?
【解决方案2】:
  1. 默认一致性在 cassandra.conf 文件中设置。用于读写。

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

【讨论】:

  • 3 回复。我在其中任何一个中都看不到答案。我的问题是如何设置单独的读写一致性。所以我认为正确的答案是不再使用“using”子句,而是使用一致性命令,但我的问题是如何为读取和写入设置不同的级别?
  • 您只是重复了我的评论,而没有回答问题。我很困惑,这是一个如此神秘的东西。不能强迫您为读取和写入设置相同的一致性级别。那没有任何意义。
  • 使用 cqlsh 你不能设置。但是在java程序中你可以设置 .在 java 驱动程序中,您可以找到 Write conf 和 Read Conf,也可以创建两个不同的集群和会话,一个用于读取,一个用于写入。
  • 好的,下次遇到Datastax的人,我一定会把这个问题发给他或她。这听起来绝对像是产品规范中的保留。
【解决方案3】:

不再使用 CQL USING 子句设置一致性级别。请参阅CASSANDRA-4734 了解说明。

相反,对于 CQLSH,您应该使用 CONSISTENCY 命令:有关详细信息,请参阅 here。

请注意,所有 DataStax 驱动程序中的默认一致性级别已从 ONE 更改为 LOCAL_ONE:有关详细信息,请参阅 python driver documentation - 然而,尽管在后台使用了 python 驱动程序,但 CQLSH 仍然具有默认一致性ONE)。

【讨论】:

  • “一个到 LOCAL_ONE”。不确定我是否同意;未从 cqlsh 设置任何内容的默认一致性为 ONE(输出“当前一致性级别为 ONE”)。
  • 你说得对,python驱动现在默认是LOCAL_ONE,但是cqlsh还是默认ONE:github.com/apache/cassandra/blob/trunk/bin/cqlsh.py#L757
【解决方案4】:

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

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

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

由于可以为每个语句设置一致性级别,因此您可以在每个语句上设置它,或者使用 PreparedStatements。如果您使用的是 Java 驱动程序,则可以为读取和写入(但不是 only 读取和 only 写入)配置全局一致性级别。

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

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

要为当前会话设置一致性级别,请使用CONSISTENCY 命令 来自 cassandra shell (CQLSH)。

例如:

设置 CONSISTENCY 以强制大多数节点响应: CONSISTENCY QUORUM

要查看您当前的一致性级别,只需从 shell 运行 CONSISTENCY;:

ty@cqlsh> consistency; Current consistency level is ONE.

对于客户端应用程序编程,使用适当的驱动程序设置一致性级别。

要使用 Java 驱动程序设置 per-insert 一致性级别,例如,使用 setConsistencyLevel 调用 QueryBuilder.insertInto。

例如:

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 文档中的更多信息。

更多关于读/写一致性级别的资源

关于一致性的其他资源: 您可能还想查看您的副本放置策略和复制因子(这是其他形式的一致性)。 我在下面添加了链接以供参考:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-24
    • 2017-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-02
    • 1970-01-01
    • 2017-08-07
    相关资源
    最近更新 更多