Cassandra在3个节点的集群模型中工作。当所有节点都是“UP”时,我在cqlsh中使用cql“select * from User”,Cassandra返回正确的结果。但是在一个节点死后,当我使用“select”时“再次,没有结果返回,但报告:”无法完成请求:一个或多个节点不可用“。 我转向使用cassandra-cli命令:“获取用户”,它返回正确的数据而没有任何错误。 任何想法?
答案 0 :(得分:2)
我希望当您使用CQL时,您的请求的一致性级别为“ALL”。在这种情况下,它将在返回之前等待所有服务器(承载该节点的副本)的回复。当一个节点关闭时,它会失败,因为它无法联系下行节点。
当您通过Cassandra-cli进行此操作时,我希望一致性级别默认为“QUORUM”或“ONE”或“ANY”,因此即使一个副本已关闭,也会很高兴地返回数据。
答案 1 :(得分:0)
cqlsh和cli都默认为CL.ONE。我怀疑差异实际上是你的cqlsh查询说“选择所有用户”,而cli中的“get”是“只选择一个用户”。
答案 2 :(得分:0)
您的密钥空间位置采用哪种策略? 如果你使用NetworkTopologyStrategy,你可以尝试如下:
CREATE KEYSPACE gxsim with placement_strategy = 'org.apache.cassandra.locator.NetworkTopologyStrategy' and strategy_options = {'DC1' : 1 , DC2' : 1} AND durable_writes = true;
答案 3 :(得分:0)
如果你的cassandra集群在aws中,那么就改变“cassandra.yaml”中的配置,只需将endpoint_snitch更改为Ec2Snitch,有一件事可能是你的数据中心实际上是ec2实例的“区域”,它应该是就像“us-east”,“us-west”。在你的情况下,它应该只是'eu-west'。
根据datastax所说的EC2Snitch¶
在Amazon EC2上使用EC2Snitch进行简单的群集部署,其中群集中的所有节点都在一个区域内。该区域被视为数据中心,可用区域被视为数据中心内的机架。例如,如果节点位于us-east-1a,则us-east是数据中心名称,1a是机架位置。由于使用了私有IP,因此该窃听不适用于多个区域。
定义keyspace strategy_options时,请使用EC2区域名称(例如us-east)作为数据中心名称。
link - http://www.datastax.com/docs/1.0/cluster_architecture/replication http://www.datastax.com/documentation/cql/3.1/cql/cql_using/update_ks_rf_t.html
答案 4 :(得分:0)
我发现自己处于类似情况(昨天),复制因子设置为1,"用户"列族只有一行。
群集信息: AWS上的3个节点 相同的数据中心名称
Keyspace名称:rf1 SimpleStrategy 复制因子1 列族名称:用户 使用cqlsh查询,默认一致性
情景1:
群集中的一个或两个节点已关闭
我发现查询"选择*来自用户"将返回"无法完成请求:一个或多个节点不可用"如果3个节点中的任何一个出现故障。
情景2:
节点1已关闭。 节点2已关闭。 节点3启动了。
查询"从用户中选择*,其中user_name =' abhishek'"会让我回头。
我认为情况就是这样,因为该行似乎在节点3上。
我对场景的理解:
当您进行查询"从用户"中选择*时,您要求Cassandra返回列族中的所有行。它不能这样做,因为一个或多个节点已关闭,并且它无法为您提供整个列系列,因为节点上可能存在一些已关闭的行。
但是带有where子句的查询将返回该行,因为它在节点3上可用并且节点3已启动。
这有意义吗?
这个解释的一个缺陷是,我希望Cassandra能够返回群集中所有可用的行,并使用#34; select * from users"
我现在要做更多的挖掘,如果我发现任何有用的东西,我会更新。