0

我在使用 apache cassandra 时遇到了一些麻烦。我已经尝试解决这个问题好几个星期了。

这是我的设置。我有 2 台运行 apache cassandra 的计算机(让我们称之为计算机 C1 和计算机 C2),我创建了一个复制因子为 2 的密钥空间。这样每台计算机都有一个数据的本地副本。

我有一个程序可以读取大量数据,例如大约 500MB。

场景 1)假设只有计算机 C1 正在运行 cassandra,我在计算机 C1 上运行读取程序,然后此读取发生半分钟到一分钟。

场景 2) 我现在在计算机 C2 上启动 cassandra 实例并再次在计算机 C1 上运行读取程序 - 现在需要很长时间才能完成,大约 20 分钟。

我不确定为什么会这样。读取一致性设置为“一”

预期表现

理想情况下,计算机 C1 和 C2 上的读取程序必须快速完成。这应该是可能的,因为两台计算机都有数据的本地副本。

谁能指出我正确的方向?非常感谢您的帮助,谢谢

更新:网络使用

这可能意义不大,但我使用 nethogs 监控互联网连接,当两个 cassandra 节点都启动时,我读取数据库,cassandra 使用带宽与另一个节点通信 - 大概这是在后台发生的读取修复我使用了读取一致性级别“一”,在我的情况下,具有所需数据的最近节点是本地计算机的 cassandra 实例(所有节点都有所有数据) - 所以数据源应该来自本地计算机。 .

更新:SQLTransentExceptions:TimedOutException()

然而,当两个节点都启动时,读取数据库的程序有几个 SQLTransentExceptions:TimedOutException()。我使用 10 秒的默认超时。但这引发了一个问题,即当所有数据检索都应该来自本地实例时,为什么 SQL 语句会超时。此外,如果只有一个节点启动,则相同的 SQL 代码运行良好。

4

2 回答 2

1

没有“ANY”的读取一致性(仅适用于写入)。最低读取一致性为 ONE。您需要检查您的读取一致性到底是什么。

也许您的配置设置为读取需要从两个服务器获取数据(如果两者都已启动),并且从 C2 获取数据到 C1 的速度非常慢。

强制将您的读取一致性级别设置为“ONE”。

于 2013-01-18T22:41:20.567 回答
0

您似乎有令牌冲突,在您的情况下,这意味着两个节点都拥有 100% 的密钥。您需要做的是重新分配其中一个节点,使其拥有一半的令牌。使用nodetool move(使用令牌 85070591730234615865843651857942052864) 后跟nodetool cleanup.

缓慢的速度很可能来自高网络延迟,当您的所有事务(某些子集实际上超时)相乘时,会导致相应的大量工作时间。许多客户端库使用自动节点发现来了解新节点或停机节点,然后跨可用节点循环请求。因此,即使您只告诉它有关 localhost 的信息,它也可能会自行了解其他节点。

在节点必须通信的任何分布式计算环境中,网络延迟和可靠性是一个巨大的因素,必须加以处理。

于 2013-01-19T23:04:21.610 回答