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