【发布时间】:2013-01-21 02:16:20
【问题描述】:
我在使用 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 代码也可以正常运行。
【问题讨论】:
-
什么客户端使用? cassandra-cli(默认 CL.ONE)?
-
显示“nodetool -h localhost ring”的输出(从 C1 或 C2 运行,当两者都启动并运行时)
-
非常感谢您的回复。我实际上正在使用我编写的 java 程序中的 cassandra jdbc 连接器库来读取数据。我已经用 nodetool ring 输出更新了原始帖子......它似乎只显示了 C2,尽管 C1 和 C2 都正常运行..
-
一些有帮助的信息: 1. 从一个节点到另一个节点执行
ping以查看您的网络延迟是多少。 2. 查看日志以了解 Cassandra 在做什么。 3. 您的客户端库是否发现节点并循环您的请求? -
感谢您的回复。 1) 延迟约为 20 毫秒。 2)我检查了 cassandra 日志,没有任何错误。然而,读取数据库的程序有几个 SQLTransientExceptions:TimedOutException()。我使用 10 秒的默认超时。但这引发了一个问题,即当所有数据检索都应该来自本地实例时,为什么 SQL 语句会超时。此外,如果只有一个节点启动,则相同的 SQL 代码运行良好。