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