卡桑德拉操作超时。

6

操作超时 - 仅收到0个响应。

这是来自服务器的错误消息。

错误代码为4608,数据一致性为1,已接收数据为0,需要接收的数据块为1,没有数据存在...

我在尝试对我的Cassandra集群进行SELECT查询时会遇到这种错误。我们使用m1.large AWS实例搭建了一个3节点集群。它们大多数时候都能成功运行,但偶尔会出现以上错误。由于我们还未投入生产,所以所有表都很小。我们没有任何表格超过几千行,并且同样的查询在其他时间也能正常完成。延长超时时间不是一个选项,而且我不认为这会解决问题(查询应该很短,而且每次错误中的查询都不相同)。

这是否可能是节点之间连接失效或者网络问题?有什么方法可以测试这些问题吗?我只在客户端看到这个错误,是否应该在Cassandra日志中看到它的存在?

1个回答

4
这实际上是一个来自负责处理您的请求的C*服务器(也称为“协调器”)的错误。
看起来您正在使用一致性级别为“ONE”的查询,因此只有一个持有数据的副本需要在配置的文件中的read_request_timeout_in_ms(默认为5秒)内响应协调器,但是没有副本在该时间段内响应。
超时可能会发生,您的应用程序应根据您的喜好准备处理它们(直接失败、重试、增加复制因子以使其不太可能发生等)。
以下是您应考虑的几件事:
1. 增加您正在查询数据的keyspace的复制因子。如果您的复制因子为1,则依赖于1个节点可用来响应特定分区的查询。将RF增加到3之类的值将使您的应用程序更具弹性,可以应对性能差的节点或节点下线的情况。
2. 根据您希望它的行为方式,配置您的RetryPolicy来重试读取操作。Node.js驱动程序的默认设置仅重试一次读取操作,并且仅在received>blockFor的情况下才重试(在您的情况下未重试)。
3. 增加文件中的read_request_timeout_in_ms。我不建议这样做,除非您的配置/环境/查询很差,否则5000ms应该足够了。

我们目前使用的是RF 2,因此数据至少在2个节点上。 我降低了超时时间,因为我不认为失败的查询会成功。这样我们就可以更快地失败。默认情况下,范围查询似乎会超时10秒钟。我知道我们应该能够处理故障,并且我们正在捕获错误,但请求的延迟对我们来说是个问题。我不认为一个由3个节点组成的集群应该在我们的负载(小)下出现超时。这是我的主要关注点。我不希望随着用户数量的增加出现更多的超时,但这似乎与负载无关。 - Alex Yurkowski
你在 C* 端进行任何监控以查看是否存在可能导致延迟的解释吗?我建议查看 nodetool cfstats,看看它是否揭示了任何信息,并监视任何类型的操作系统统计信息,以查看是否有任何见解。另一件有趣的事情是启用查询跟踪,这将有助于解释为什么查询有时需要一段时间。 - Andy Tolbert
我们使用New Relic来监控服务器和操作系统统计信息,但与Cassandra直接相关的内容似乎一切正常。今天我发现了实际问题,我们正在创建一个长的Feed,并且某个使用Cassandra Lucene插件的查询需要很长时间,而且我们一次会触发很多这样的查询。这种情况只会偶尔发生,这就是为什么很难追踪到它的原因。我修改了查询以不使用插件并在我们的进程中进行过滤,现在它运行良好。谢谢! - Alex Yurkowski

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接