从Apache cassandra读取数据的问题

时间:2013-01-18 21:52:10

标签: database nosql cassandra

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

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

我有一个程序可以读取相当大量的数据,大约500MB。

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

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

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

预期效果

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

任何人都可以指出我正确的方向吗?我非常感谢你的帮助, 感谢

更新:网络使用

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

更新:SQLTransentExceptions:TimedOutException()

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

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

您似乎遇到令牌冲突,在您的情况下会转换为拥有100%密钥的两个节点。您需要做的是重新分配其中一个节点,使其拥有一半令牌。使用nodetool move(使用令牌85070591730234615865843651857942052864),然后使用nodetool cleanup

慢速最有可能来自高网络延迟,当在所有事务中成倍增加(某些子集实际超时)会导致相应大的作业时间。许多客户端库使用自动节点发现来了解新节点或已关闭节点,然后跨可用节点循环请求。所以,即使你只是告诉它有关localhost的事情,它也可能自己了解另一个节点。

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