在 Cassandra 集群中的数据中心之间添加甚至 50 毫秒的延迟,即使对于 LOCAL_SERIAL 也会导致 NoNodeAvailableException

问题描述 投票:0回答:1

我尝试进行测试以了解 C* 如何通过修复每个数据包的延迟来解决网络问题。带有 Datastax Java 驱动程序的 Java 应用程序非常简单的 multidc C* 集群和 tc 工具。

有DCA和DCB。它们中的每一个都只有 C* 节点。我第二次开始测试时仅向 C* 发出 200 个请求(插入...如果不存在),但每个请求首先尝试以 SERIAL 一致性执行,如果失败,则第二次尝试使用 LOCAL_SERIAL。 SERIAL 和 LOCAL_SERIAL 的超时分别为 400 毫秒和 200 毫秒。

我使用 tc 工具对网络问题进行建模。正如已经说过的,我为从 DCA 节点到 DCB 节点的所有请求添加了 50 毫秒的修复延迟。

在此之后,单个手动请求仍然有效。但是,如果我在 DCA 上进行 200 rps 的负载测试,即使在 LOCAL_SERIAL 尝试中,我的日志中也会出现很多 NoNodeAvailableException。

我阅读了有关 Datastax Java 驱动程序的默认设置的信息。看来他们这次测试没问题。我检查了 DCA 中应用程序中的接触点仅包含 DCA 的一个节点。

为什么我会在这些非常简单的条件下得到这种行为?有什么想法吗?

我的同事甚至在没有网络问题的 80 rps 上也遇到了一些异常。但我不知道他们的设置。

java cassandra network-programming datastax-java-driver
1个回答
0
投票

不确定写入有效负载有多大,但这绝对会影响这一点。否则,Cassandra 中轻量级事务的棘手部分是(我认为)每个事务都在协调器和目标节点之间进行 4 次往返。因此,这将极大地限制其本身的吞吐量。

此外,多 DC 通信也绝非易事。我建议写入单个数据中心(使用 LOCAL_QUORUM),并依靠复制来同步副本。

节点是否被标记为“关闭”?如果是这样,您可以尝试的一件事是查看每个节点上的

phi_convict_threshold
。 Phi Convict 本质上是节点通信在报告故障之前可以等待多长时间的非线性表示。我认为它默认为 8,但对于我完成的大多数多 DC 云部署,我们必须将其增加到 12。

© www.soinside.com 2019 - 2024. All rights reserved.