当一个节点关闭时Couchbase会爬行吗?不应该';它失败的不是很快吗?

当一个节点关闭时Couchbase会爬行吗?不应该';它失败的不是很快吗?,couchbase,nosql,Couchbase,Nosql,您好,我们正在测试CB enterpise 2.5和java客户端1.4.3(最新版本) 我们有一个3节点的集群,当一切就绪时,它的工作非常出色。当我们在进程上终止(但不要进行故障转移)时,我们会注意到性能上的巨大差异。它能够很快地为其他两个节点上的文档提供服务,但ops会急剧下降,因为每次我们试图从失败的节点获取文档时,它都会等待超时。java客户机应该是健壮的,而服务器肯定是健壮的。这两件事都应该知道节点已关闭,为什么它要等待完全超时直到失败?难道它不应该意识到节点已关闭并立即出错或从副本中

您好,我们正在测试CB enterpise 2.5和java客户端1.4.3(最新版本)

我们有一个3节点的集群,当一切就绪时,它的工作非常出色。当我们在进程上终止(但不要进行故障转移)时,我们会注意到性能上的巨大差异。它能够很快地为其他两个节点上的文档提供服务,但ops会急剧下降,因为每次我们试图从失败的节点获取文档时,它都会等待超时。java客户机应该是健壮的,而服务器肯定是健壮的。这两件事都应该知道节点已关闭,为什么它要等待完全超时直到失败?难道它不应该意识到节点已关闭并立即出错或从副本中获取信息吗

我们做错什么了吗?我们将opTimeout设置为2500ms,shouldOptimize=true,甚至将协议切换为二进制。我们还尝试手动将FailureMode设置为重新分发


我们是做错了什么,还是这是couchbase的规格?因为当前db在等待超时2.5秒时会被压垮,而之前它每秒执行5k操作。

在节点变得不可用和故障转移(用户可配置值)之间,对“死”节点的任何请求都将等待超时时间,然后再向用户报告超时

因此,在发生故障转移之前,对该“死”节点的所有请求都将失败—因此,根据定义,您的op/s将下降,因为在您的情况下,33%的数据当前不可用


如果您使用的是同步API调用,那么您还存在一个问题,即对健康节点的请求可能会备份到对“死”节点的请求之后,因此在应用程序中需要等待2.5秒才能继续其他工作。这就是异步API性能更好的原因。在这种情况下,为了减轻对其他健康节点的请求的影响,您可以将超时值降低为“更快失败”,并更快地进入下一个请求。

还有另一个解决方案,可通过Couchbase的REST API获得。 实际上,整个管理控制台都基于RESTAPI,因此应用程序中的每个函数都是可用的。 自动故障切换的最低值为30秒,但您可以随时启动故障切换


故障切换几乎是即时的。当然,在那之后,我们建议重新平衡。

我们最终以不同的方式解决了这个问题。不过我们还是要测试一下。对于java,在执行CouchbaseConnectionFactory时,我们将FailureMode设置为FailureMode.Cancel。这允许客户端取消对被认为已关闭的节点的任何请求。除此之外,我认为FailureMode.redistribution上还有一个bug。在API页面中有3种故障模式。重试-持续重试直到达到超时,如果在超时之前启动故障转移或节点返回,则将获得请求,取消-立即使用CanceledException取消请求。(续)最后一种模式是“重新分发”,用于查询节点,意识到它已关闭,然后转到下一个逻辑节点以获取数据(我假设是从副本)。但这不起作用。它的行为就像Retry@user2615862我确信这些故障模式来自旧的(预Couchbase)SpymeCached层,因此Couchbase Bucket不支持这些模式。(仅在memcached是(有损)缓存的情况下,重分发将只使用列表中的下一个节点作为缓存)。我们正在进行测试。我们不想对节点进行故障转移…故障转移很糟糕。90%的情况下,如果节点出现故障,系统很快就会启动它。我们正在测试couchbase在故障转移之前的故障期间的行为。