CounterMutationStage中的Cassandra WriteTimeoutException异常 - 节点最终死亡

时间:2017-07-25 14:19:56

标签: cassandra cassandra-3.0

我在我的cassandra system.log中遇到以下异常:

WARN  [CounterMutationStage-25] 2017-07-25 13:25:35,874 AbstractLocalAwareExecutorService.java:169 - Uncaught exception on thread Thread[CounterMutationStage-25,5,main]: {}
java.lang.RuntimeException: org.apache.cassandra.exceptions.WriteTimeoutException: Operation timed out - received only 0 responses.
    at org.apache.cassandra.service.StorageProxy$DroppableRunnable.run(StorageProxy.java:2490) ~[apache-cassandra-3.9.jar:3.9]
    at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source) ~[na:1.8.0_112]
    at org.apache.cassandra.concurrent.AbstractLocalAwareExecutorService$FutureTask.run(AbstractLocalAwareExecutorService.java:164) ~[apache-cassandra-3.9.jar:3.9]
    at org.apache.cassandra.concurrent.AbstractLocalAwareExecutorService$LocalSessionFutureTask.run(AbstractLocalAwareExecutorService.java:136) [apache-cassandra-3.9.jar:3.9]
    at org.apache.cassandra.concurrent.SEPWorker.run(SEPWorker.java:109) [apache-cassandra-3.9.jar:3.9]
    at java.lang.Thread.run(Unknown Source) [na:1.8.0_112]
Caused by: org.apache.cassandra.exceptions.WriteTimeoutException: Operation timed out - received only 0 responses.
    at org.apache.cassandra.db.CounterMutation.grabCounterLocks(CounterMutation.java:150) ~[apache-cassandra-3.9.jar:3.9]
    at org.apache.cassandra.db.CounterMutation.applyCounterMutation(CounterMutation.java:122) ~[apache-cassandra-3.9.jar:3.9]
    at org.apache.cassandra.service.StorageProxy$9.runMayThrow(StorageProxy.java:1473) ~[apache-cassandra-3.9.jar:3.9]
    at org.apache.cassandra.service.StorageProxy$DroppableRunnable.run(StorageProxy.java:2486) ~[apache-cassandra-3.9.jar:3.9]
    ... 5 common frames omitted

每当发生这种情况时,CPU会在一分钟左右降至0%,节点会无响应但在此之后会恢复。 但最终,节点将完全死亡(即进程继续运行,但它不再响应命令,即使关闭不起作用,也必须终止进程)。

更多信息:

  • Cassandra 3.9
  • G1垃圾收集器
  • Windows Server 2012 R2上的单个节点(20个内核,256 GB RAM)
  • 使用大量计数器和反突变

我尝试过的事情:

  • 从日志中删除所有其他警告。曾经有关于计数器批次太大的警告,重写代码根本不使用批处理。这标志着警告,但不是例外问题。
  • 迁移到更大的机器,使用更大的堆和微调GC,以确保问题不是机器过载。 CPU负载<&lt; 20%。

有没有人知道还能做什么?我主要担心的是节点完全死亡。我不确定这个异常是否会导致它,但它是我唯一的提示......

更新1:

更新到Cassandra 3.11,节点现在似乎不再死亡。但是,写入超时是主要的,节点在几分钟内没有响应但至少现在恢复了。

更新2:

解决问题(在专业顾问的帮助下)。我们节点上的磁盘I / O速度非常糟糕,导致刷新写入器的队列不断增加。原因未知,驱动器上的I / O速度测试(Raid 1 SSD)实际上非常好。 将节点从Windows移动到Linux(并根据http://docs.datastax.com/en/landing_page/doc/landing_page/recommendedSettings.html进行配置)解决了这个问题。

问题的真正原因尚不清楚;可能是Windows本身或只是与RAID设置的一些怪异不兼容。无论如何,Cassandra只是在Linux上进行过测试,而且更容易找到Linux设置的帮助。经验教训。

1 个答案:

答案 0 :(得分:1)

这听起来像是一台拥有20个核心和256GB内存的强大机器。 Cassandra是一个旨在横向扩展的分布式系统。不要在单个节点上推送负载,而是尝试添加更多商品硬件并水平扩展。您也可以在同一个框中运行Cassandra的多个节点。

Atleast尝试在此框中运行几个节点,以便从无响应中扩展。大多数情况下,CPU不是Cassandra的瓶颈。它是单个节点可以执行的I / O.

  • 检查cassandra.yaml中concurrent_writes的值,我猜基于20核的建议,它将是160(20 * 8)。
  • 如果可行,请尝试分离commitlog目录和数据目录存储驱动器。
  • 缩放写入的最佳选择是添加更多的框(可能在配置中更小)。