【问题标题】:Cassandra failing when writing dataCassandra 写入数据失败
【发布时间】:2017-01-13 21:40:50
【问题描述】:

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

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

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

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。我将 memtable 空间降低到 32MB:

memtable_heap_space_in_mb: 32
memtable_offheap_space_in_mb: 32

这可能已经修复了 OOM 错误(尽管我可能只是等待的时间不够长)。

我希望 Cassandra + 指数退避能将写入器限制到某个最大平衡写入速度,但这似乎没有发生。这是对 Cassandra 的不切实际的期望吗?我可以在作者中进行速率限制,但我不知道什么指标是合理的速率限制。有什么想法吗?

【问题讨论】:

标签: cassandra garbage-collection jvm


【解决方案1】:

这是 Cassandra 集群的典型问题。

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

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

由于您可能不知道您的集群将如何运行,因此您唯一的选择是应用背压。在客户端级别将写入限制到合理的值。该值在很大程度上取决于您的硬件(以及软件)配置。尝试使用一个粗略的值(例如 3k op/s),并提高此值,直到您发现写入速度开始使集群过载。您会发现您的集群支持的速率是多少(对于您的特定工作负载!)。如果这对您的应用程序来说还不够,那么用更多节点扩展您的集群。

【讨论】:

    猜你喜欢
    • 2012-06-16
    • 1970-01-01
    • 2014-11-23
    • 2013-11-01
    • 2021-12-24
    • 2016-05-13
    • 2015-10-15
    • 2016-03-29
    相关资源
    最近更新 更多