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