我在使用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代码运行正常。
答案 0 :(得分:1)
没有“ANY”的读取一致性(仅适用于写入)。最低读取一致性是ONE。您需要检查您的读取一致性是什么。
也许您的配置设置方式是读取需要从两个服务器获取数据(如果两者都已启动),并且从C2获取数据到C1的速度非常慢。
强制将读取一致性级别设置为“ONE”。
答案 1 :(得分:0)
您似乎遇到令牌冲突,在您的情况下会转换为拥有100%密钥的两个节点。您需要做的是重新分配其中一个节点,使其拥有一半令牌。使用nodetool move
(使用令牌85070591730234615865843651857942052864),然后使用nodetool cleanup
。
慢速最有可能来自高网络延迟,当在所有事务中成倍增加(某些子集实际超时)会导致相应大的作业时间。许多客户端库使用自动节点发现来了解新节点或已关闭节点,然后跨可用节点循环请求。所以,即使你只是告诉它有关localhost的事情,它也可能自己了解另一个节点。
在节点必须通信的任何分布式计算环境中,网络延迟和可靠性是一个重要因素,必须予以处理。