【问题标题】:Issue with reading data from Apache cassandra从 Apache cassandra 读取数据的问题
【发布时间】: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 代码运行良好。

标签: database nosql cassandra


【解决方案1】:

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

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

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

【讨论】:

  • 非常感谢您的回复!我实际上的意思是读取一致性......我在明确设置一致性后对其进行了测试,它仍然显示出同样的问题。此外,单独的一致性并不能解释原始帖子的更多细节部分中的场景。如果您有进一步的建议,请告诉我。
【解决方案2】:

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

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

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

【讨论】:

  • 非常感谢您的回复。令牌冲突绝对是问题的一部分。我现在已经修复了令牌冲突问题,但是原帖中描述的场景 1 和 2 仍然存在。您对此有什么进一步的了解吗?我现在将使用详细信息更新原始帖子。
  • 哦,很酷,我在这里确实学到了一些新东西。这肯定是问题所在。我正在使用 Cassandra CQL JDBC 连接器。我已经进行了广泛的搜索,但我无法弄清楚这个库中是否内置了自动节点发现功能。您是否知道 CQL JDBC 连接器是否具有自动节点发现功能以及如何将其关闭?我可以看到像 Hector 这样的高级客户端库已经内置了这些,但是对于 CQL JDBC 连接器的情况还不清楚。
猜你喜欢
  • 1970-01-01
  • 2022-07-27
  • 2020-01-26
  • 1970-01-01
  • 2013-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-12
相关资源
最近更新 更多