Cassandra:集群如何处理死节点?

时间:2012-02-13 14:06:45

标签: cassandra

我对cassandra很新,我不确定我是否理解正确,所以我希望有人可以帮助我。

这是我的系统:

  • cassandra 0.8
  • 具有3个节点的群集
  • 复制因子为3
  • 的密钥空间
  • 复制策略:NetworkTopologyStrategy(同一DC中的所有节点)
  • 使用twitter cassandra gem [1]连接到集群的rails metal app
    • 阅读一致性:ONE
    • 写下合作伙伴:ANY

当一个节点出现故障时,我很清楚这一点:

  • 如果我使用读取一致性级别为1,我应该能够从键空间读取记录。
  • 我应该能够使用ANY
  • 的写入一致性级别写入密钥空间

这是我不明白的地方:

  • 上述操作成功,但仅当我手动删除死节点的令牌时
  • 我的群集不应该按预期使用死节点工作吗?这不是cassandra的全部意义:高可用性?

我在gem的代码中挖掘,看起来如果cassandra集群告诉gem它可以在死节点上找到记录(实际上已经关闭)。因此gem失败并出现异常,它无法连接到死节点。

所以我不确定我是否完全误解了一些东西,我的cassandra设置是错误的,或者如果cassandra ruby​​ gem是问题(我不认为)。

thx,simon

[1] https://github.com/twitter/cassandra

1 个答案:

答案 0 :(得分:0)

是的,您的群集应该像您描述的死节点一样工作。

我不熟悉ruby或ruby客户端但是我觉得你的客户端更有可能尝试向死节点发送请求,这会导致“无法连接”类型的异常。如果没有足够的节点满足某个查询的一致性要求,Cassandra会抛出一个UnavailableException。

ruby​​客户端执行什么类型的池,您确定它没有尝试向已关闭的节点发送查询吗?假设ruby客户端具有某种连接池,它可能必须在实现节点关闭之前至少看到一个失败的查询。