【问题标题】:Cassandra reports:"Unable to complete request: one or more nodes were unavailable" when I use CQL:"select * from User"当我使用 CQL 时,Cassandra 报告:“无法完成请求:一个或多个节点不可用”:“select * from User”
【发布时间】:2012-12-24 09:53:14
【问题描述】:

Cassandra工作在3个节点的集群模式下。当所有节点都“UP”时,我在cqlsh中使用cql“select * from User”,Cassandra返回正确的结果。但是在一个节点死了之后,当我使用“select ” 再次,没有结果返回但报告:“无法完成请求:一个或多个节点不可用”。 我转而使用 cassandra-cli 命令:“get Users”,它返回正确的数据而没有任何错误。 有什么想法吗?

【问题讨论】:

  • 你使用的是哪种一致性?
  • 可能是由于在检索数据期间使用了不同的一致性而导致的问题。了解有关超时和数据不可用异常的更多信息click here

标签: java python cassandra cql


【解决方案1】:

我希望当您使用 CQL 时,您会收到一个一致性级别为“ALL”的请求。在这种情况下,它将等待所有服务器(托管该节点的副本)的回复,然后再返回。当一个节点宕机时,它会失败,因为它无法联系到宕机的节点。

当您通过 Cassandra-cli 执行此操作时,我希望一致性级别默认为“QUORUM”或“ONE”或“ANY”,因此即使一个副本已关闭,您也会很高兴地返回数据。

【讨论】:

  • 感谢您的评论。但是 CQL 和 cli 中的一致性级别被 ONE 击败,并且 CQL 和 cli 都可以写入数据。读取不适用于 CQL 但在 cli 中可以。
【解决方案2】:

cqlsh 和 cli 都默认为 CL.ONE。我怀疑区别实际上是您的 cqlsh 查询说“选择所有用户”,而 cli 中的“获取”是“选择一个用户”。

【讨论】:

  • 感谢您的回答,就是这样。顺便说一句,一个节点已经死了,但我的集群中还有另外两个“UP”,为什么cql“select”不起作用?
  • 如果复制因子为 1,则数据可能存储在该 DOWN 节点上。在这种情况下,您将无法从中进行选择。
【解决方案3】:

您的键空间放置采用哪种策略? 如果你使用 NetworkTopologyStrategy,你可以尝试如下:

 CREATE KEYSPACE gxsim with placement_strategy = 'org.apache.cassandra.locator.NetworkTopologyStrategy' and strategy_options = {'DC1' : 1 , DC2' : 1} AND durable_writes = true;

【讨论】:

    【解决方案4】:

    如果您的 cassandra 集群在 aws 中,则更改“cassandra.yaml”中的配置只需将 endpoint_snitch 再次更改为 Ec2Snitch 可能的一件事是您的数据中心实际上是 ec2 实例的“区域”,它应该就像“us-east”,“us-west”。在你的情况下,它应该只是“eu-west”。

    根据 datastax 所说,EC2Snitch¶

    使用 EC2Snitch 在 Amazon EC2 上进行简单的集群部署,其中集群中的所有节点都位于一个区域内。该区域被视为数据中心,而可用区被视为数据中心内的机架。例如,如果一个节点在 us-east-1a 中,us-east 是数据中心名称,1a 是机架位置。由于使用的是私有 IP,因此此告密者无法跨多个区域运行。

    在定义您的 keyspace strategy_options 时,使用 EC2 区域名称(例如,us-east)作为您的数据中心名称。

    链接-http://www.datastax.com/docs/1.0/cluster_architecture/replicationhttp://www.datastax.com/documentation/cql/3.1/cql/cql_using/update_ks_rf_t.html

    【讨论】:

      【解决方案5】:
      1. 您用于键空间的复制因子是多少?
      2. “users”列族有多少行数据?

      我发现自己处于类似情况(昨天),复制因子设置为 1,“用户”列族只有一行。

      集群信息: AWS 上的 3 个节点 相同的数据中心名称

      键空间名称:rf1 简单策略 复制因子 1 列族名称:用户 使用cqlsh查询,默认一致性

      场景一:

      集群中的一两个节点宕机了

      我发现如果 3 个节点中的任何一个节点出现故障,查询“select * from users”将返回“无法完成请求:一个或多个节点不可用”。

      场景二:

      节点 1 已关闭。 节点 2 已关闭。 节点 3 已启动。

      查询“select * from users where user_name='abhishek'”将返回该行。

      我认为是这种情况,因为该行似乎在节点 3 上。

      我对场景的理解:

      当您进行“select * from users”查询时,您是在要求 Cassandra 返回列族中的所有行。它无法这样做,因为一个或多个节点已关闭,并且它无法为您提供整个列族,因为节点上可能有一些行已关闭。

      但是带有 where 子句的查询会返回该行,因为它在节点 3 上可用并且节点 3 已启动。

      这有意义吗?

      这种解释的一个缺陷是我希望 Cassandra 使用“select * from users”返回集群中所有可用的行

      我现在要做更多的挖掘工作,如果我发现任何有用的东西会更新。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-08-08
        • 2014-04-11
        • 2021-05-20
        • 1970-01-01
        • 2017-02-13
        • 2021-01-04
        • 2015-12-04
        相关资源
        最近更新 更多