Cassandra在写数据时失败了

时间:2017-01-12 15:35:02

标签: cassandra garbage-collection jvm

我正在尝试将数据加载到Cassandra中,但它失败了。我正在单个节点(笔记本电脑)上运行,但我在一个小型集群(3-5个节点)中看到了相同的行为。我正在使用默认设置运行Cassandra 3.9。

我正在使用DataStax Java驱动程序3.0.0从两个线程编写。我正在编写具有50KB行和5-10K列的行。磁盘上的总数据集大约为40GB。我正在同时写5行/ thread。

插入一段时间后,我开始写入超时:

com.datastax.driver.core.exceptions.WriteTimeoutException: Cassandra timeout during write query at consistency LOCAL_ONE (1 replica were required but only 0 acknowledged the write)

我以指数退避重试。最终写入停止前进。此时,我看到很长时间的GC暂停:

WARN  [Service Thread] 2017-01-11 19:04:54,529 GCInspector.java:282 - ConcurrentMarkSweep GC in 4139ms.  CMS Old Gen: 3456106376 -> 3455729576; Par Eden Space: 671088640 -> 670388064; Par Survivor Space: 83886080 -> 58722784
WARN  [Service Thread] 2017-01-11 19:04:58,692 GCInspector.java:282 - ConcurrentMarkSweep GC in 4010ms.  CMS Old Gen: 3456105584 -> 3455769528; Par Survivor Space: 83886080 -> 62960320

此时,似乎所有时间都花在了GC上。即使我杀了写作,Cassandra似乎也没有恢复。它最终以OutOfMemoryError消亡。我将可记忆空间降低到32MB:

memtable_heap_space_in_mb: 32
memtable_offheap_space_in_mb: 32

这可能已经修复了OOM错误(虽然我可能只是等待不够长)。

我希望Cassandra +指数退避能够使作者达到某种最大均衡写入速度,但这似乎并没有发生。这对卡桑德拉来说是不切实际的期望吗?我可以在作者中对速率进行限制,但我不知道对速率限制采用什么指标是合理的。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

这是Cassandra集群的典型问题。

我从两个方面看到了这一点:

  • cassandra客户负责减少写入以减少群集过载。这称为背压
  • 工程师负责设计群集以适应应用程序的SLA并支持所需的写入速度(和延迟)。

由于您可能不了解群集的执行方式,因此您唯一的选择是应用背压。在客户端级别将写入降低到合理的值。此值很大程度上取决于您的硬件(井和软件)配置。尝试使用ballbark值(例如3k op / s),并提高此值,直到找到开始使群集过载的写入速度。您将找到群集支持的速率(具有您的特定工作负载!)。如果它对您的应用程序来说还不够,那么使用更多节点扩展您的群集。