【问题标题】:Setting up a keyspace in cassandra *without* a replication factor在 cassandra *没有*复制因子的情况下设置键空间
【发布时间】:2023-04-05 01:46:02
【问题描述】:

我们从 cassandra 集群 (1.0.10) 中得到了奇怪的行为。

我们正在运行一个 3 节点集群。

如果我创建一个键空间 没有设置复制因子,那么我在尝试输入数据时会出错:

[default@unknown] create keyspace foo;
ae639ba0-d4b8-11e1-0000-424d3d43a8df
Waiting for schema agreement...
Warning: unreachable nodes 10.227.65.172, 10.51.62.63... schemas agree across the cluster
[default@unknown] use foo;
Authenticated to keyspace: foo
[default@foo] create column family User with comparator = UTF8Type;
b4608180-d4b8-11e1-0000-424d3d43a8df
Waiting for schema agreement...
Warning: unreachable nodes 10.227.65.172, 10.51.62.63... schemas agree across the cluster
[default@foo] update column family User with
...             column_metadata =
...             [
...             {column_name: first, validation_class: UTF8Type},
...             {column_name: last, validation_class: UTF8Type},
...             {column_name: age, validation_class: UTF8Type, index_type: KEYS}
...             ];
b70562c0-d4b8-11e1-0000-424d3d43a8df
Waiting for schema agreement...
Warning: unreachable nodes 10.227.65.172, 10.51.62.63... schemas agree across the cluster
[default@foo] set User['jsmith']['first'] = 'John';
null
UnavailableException()
        at org.apache.cassandra.thrift.Cassandra$insert_result.read(Cassandra.java:15206)
        at org.apache.cassandra.thrift.Cassandra$Client.recv_insert(Cassandra.java:858)
        at org.apache.cassandra.thrift.Cassandra$Client.insert(Cassandra.java:830)
        at org.apache.cassandra.cli.CliClient.executeSet(CliClient.java:901)
        at org.apache.cassandra.cli.CliClient.executeCLIStatement(CliClient.java:218)
        at org.apache.cassandra.cli.CliMain.processStatementInteractive(CliMain.java:220)
        at org.apache.cassandra.cli.CliMain.main(CliMain.java:348)

(无法到达节点的问题应该不是here所说的问题)

但是,如果我创建键空间并指定复制因子(1、2 或 3),那么它就可以正常工作。

如果在没有指定复制因子的情况下创建集群存在问题,那么不应该在创建时抛出异常吗?如果您在多节点集群上指定复制因子,预期的行为是什么?

【问题讨论】:

标签: cassandra


【解决方案1】:

cassandra-cli 内部创建键空间时的默认复制策略是NetworkTopologyStrategy (NTS),它实际上没有单个replication_factor 的概念。 NTS 的副本是基于每个数据中心配置的。使用 NTS 时的默认复制选项是“{datacenter1:1}”,这意味着应该将一个副本放在“datacenter1”副本组中。如果您没有配置特定的告密者,那么很可能所有节点都被分配到“datacenter1”。

我对您如何将复制因子设置为 1、2 或 3 感到困惑,因为 cassandra-cli 不应该让您指定 replication_factor 而不同时指定 placement_strategySimpleStrategy,如果你这样做,我想你会更清楚这种差异。

无论如何,由于您在默认情况下的有效复制因子是 1,我希望您的问题确实是警告消息中的故障节点。它们真的是僵尸节点,正如您引用的邮件中所讨论的那样,还是它们仍然在环中并且无法访问的真实节点? nodetool ring 的输出应该有助于诊断为什么 Cassandra 认为它不能成功存储您的记录。

最后,我应该指出,您会发现使用cqlsh 工具比使用cassandra-cli 更容易很多完成此类工作。在这种情况下,它至少会迫使您给出明确的复制策略和策略选项。

【讨论】:

  • 当我手动设置 RF 时,我也在设置布局策略,所以效果很好。如果我只是做了简单的'create keyspace foo;'它设置了一个密钥空间,但随后对该密钥空间的所有访问都失败了。如果在使用 cassandra-cli 时出现错误,告诉我使用 csh 并没有帮助 - 我将提交错误报告。
  • 是的,这不是 cassandra-cli 中的错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-22
  • 2023-04-01
  • 2013-03-07
  • 2017-05-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多