Cassandra:无法完成请求:一个或多个节点不可用

时间:2015-08-14 05:54:17

标签: cassandra

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

1 个答案:

答案 0 :(得分:3)

执行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个电影标题进行实验,它是否总是返回相同的端点?