【问题标题】:Cassandra :Unable to complete request: one or more nodes were unavailableCassandra:无法完成请求:一个或多个节点不可用
【发布时间】:2015-08-14 05:54:17
【问题描述】:

我有一个带有 3 个节点的 cassandra 集群。我有一个复制因子为 1 的 movies_keyspace,因此每条记录只存在一个副本。它包含一个包含 3 条记录的电影表。当我的第一个节点启动而其他两个节点关闭时,我触发了 select * from movies 查询,它给了我“无法完成请求:一个或多个节点不可用”(这已在其他线程中得到回答)。但是,当我从添加了所有三部电影的 title="movie_name" 的电影中选择 * 时,它返回给我行。当其他两个节点关闭时,这怎么可能?我应该得到较早的错误。

【问题讨论】:

    标签: cassandra


    【解决方案1】:

    当您执行select * from table 时,cassandra 协调器节点为您的环中的每个令牌范围创建范围请求。由于您有一个复制因子为 1 的键空间,这意味着每个节点都必须可用于成功发出所有范围查询。由于 3 个范围中有 2 个没有可用的副本,因此 Cassandra 返回“不可用”错误。

    至于select * from movies where title='X' 成功,很可能这些标题中的每一个都必须属于同一范围。

    如果您想验证这一点,可以使用nodetool getendpoints keyspace_name table_name key 命令。例如,如果我有一个包含 3 个节点的集群和一个复制因子为 3 的键空间“测试”,nodetool getendpoints test table1 1 返回:

    127.0.0.2
    127.0.0.3
    127.0.0.1
    

    如果我更改我的键空间并将我的复制因子减少到 1,则相同的查询现在只返回 1 个节点:

    ALTER KEYSPACE test
    WITH replication = {
        'class' : 'SimpleStrategy',
        'replication_factor' : 3
    };
    

    nodetool getendpoints test table1 1:

    127.0.0.2
    

    Cassandra 使用Partitioning 根据此主键确定数据的位置。因此,如果我改变我的密钥,我可能会得到一个不同的节点:

    nodetool getendpoints test table1 32342349:

    127.0.0.1
    

    nodetool getendpoints test table1 32342344:

    127.0.0.3
    

    如果您使用查询工作的 3 个电影标题对此进行试验,它是否总是返回相同的端点?

    【讨论】:

    • nodetool 为每个电影标题返回相同的节点。每次我得到 127.0.0.2。
    • 不应该给我 3 部电影的 3 个不同节点吗?
    • 不一定。 Cassandra 根据其 Partitioner (wiki.apache.org/cassandra/Partitioners) 和您尝试检索的数据的主键来计算哪些节点拥有哪些数据。
    猜你喜欢
    • 1970-01-01
    • 2015-08-08
    • 2012-12-24
    • 2014-04-11
    • 2012-11-29
    • 1970-01-01
    • 1970-01-01
    • 2021-01-04
    • 1970-01-01
    相关资源
    最近更新 更多