【问题标题】:Decommission cassandra node times out with "received only 0 responses"停用 cassandra 节点超时,“仅收到 0 个响应”
【发布时间】:2014-02-28 18:44:16
【问题描述】:

当我尝试停用 Cassandra 集群中的一个节点时,该过程开始(我看到活动流从该节点流向集群中的其他节点(使用 vnodes)),但稍有延迟 @987654321 @ 存在并带有以下错误消息。

我可以重复运行nodetool decommission,它会开始将数据流式传输到其他节点,但到目前为止总是存在以下错误。

为什么我会看到这个,有没有办法可以安全地停用这个节点?

Exception in thread "main" java.lang.RuntimeException: org.apache.cassandra.exceptions.ReadTimeoutException: Operation timed out - received only 0 responses.
        at org.apache.cassandra.db.HintedHandOffManager.getHintsSlice(HintedHandOffManager.java:578)
        at org.apache.cassandra.db.HintedHandOffManager.listEndpointsPendingHints(HintedHandOffManager.java:528)
        at org.apache.cassandra.service.StorageService.streamHints(StorageService.java:2854)
        at org.apache.cassandra.service.StorageService.unbootstrap(StorageService.java:2834)
        at org.apache.cassandra.service.StorageService.decommission(StorageService.java:2795)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at com.sun.jmx.mbeanserver.StandardMBeanIntrospector.invokeM2(StandardMBeanIntrospector.java:93)
        at com.sun.jmx.mbeanserver.StandardMBeanIntrospector.invokeM2(StandardMBeanIntrospector.java:27)
        at com.sun.jmx.mbeanserver.MBeanIntrospector.invokeM(MBeanIntrospector.java:208)
        at com.sun.jmx.mbeanserver.PerInterface.invoke(PerInterface.java:120)
        at com.sun.jmx.mbeanserver.MBeanSupport.invoke(MBeanSupport.java:262)
        at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:836)
        at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:761)
        at javax.management.remote.rmi.RMIConnectionImpl.doOperation(RMIConnectionImpl.java:1454)
        at javax.management.remote.rmi.RMIConnectionImpl.access$300(RMIConnectionImpl.java:74)
        at javax.management.remote.rmi.RMIConnectionImpl$PrivilegedOperation.run(RMIConnectionImpl.java:1295)
        at javax.management.remote.rmi.RMIConnectionImpl.doPrivilegedOperation(RMIConnectionImpl.java:1387)
        at javax.management.remote.rmi.RMIConnectionImpl.invoke(RMIConnectionImpl.java:818)
        at sun.reflect.GeneratedMethodAccessor28.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:303)
        at sun.rmi.transport.Transport$1.run(Transport.java:159)
        at java.security.AccessController.doPrivileged(Native Method)
        at sun.rmi.transport.Transport.serviceCall(Transport.java:155)
        at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:535)
        at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:790)
        at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:649)
        at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
        at java.lang.Thread.run(Thread.java:662)
Caused by: org.apache.cassandra.exceptions.ReadTimeoutException: Operation timed out - received only 0 responses.
        at org.apache.cassandra.service.ReadCallback.get(ReadCallback.java:100)
        at org.apache.cassandra.service.StorageProxy.getRangeSlice(StorageProxy.java:1213)
        at org.apache.cassandra.db.HintedHandOffManager.getHintsSlice(HintedHandOffManager.java:573)
        ... 33 more

【问题讨论】:

  • 对于后来发现此问题的任何人,我认为,通过使用nodetool netstats 观看流并等待所有内容从节点流出,我可以安全地停用节点。然后我把它取下来并在整个集群中进行了修复。
  • 您能以其他方式完成它吗?如果您有一个非常大的集群并且需要数月才能完成修复,那么当您有 25 个以上的节点要更换时,对一个节点执行此操作并围绕集群运行修复是不可行的。
  • 我实际上最终通过使用更大的节点解决了这个问题。从根本上说,问题在于节点没有资源来可靠地运行 Cassandra。在这个问题发生时,我在 aws 上使用 m1.xlarge。迁移到 i2.2xlarge 缓解了这个问题。当你向它抛出大量数据时,节点可以有多小并且仍然可以运行似乎存在一些真正的限制。
  • 这实际上正是我们想要做的就是将整个集群从 m1 移动到 i2。问题是我们无法分解节点来替换它们。
  • 这应该不是什么大问题:您可以在整个新数据中心内一次性运行重建,根据我的经验,它可以很好地并行化工作,因此您只需面对机器间传输时间,在aws内部是可以接受的。然后,您无需停用旧数据中心:您可以在将客户端指向新 dc 并在新 dc 上运行修复后直接将其关闭。旧节点上没有任何东西会丢失,因此您可以直接将它们切断而无需 decom。

标签: cassandra nodetool


【解决方案1】:

被提示的切换管理器正在检查提示以查看是否需要在期间传递这些提示 退役,以便提示不会丢失。你很可能有很多提示,或者 一堆墓碑,或者表中的某些东西导致查询超时。你不是 在超时之前在日志中看到任何其他异常是你吗?提高读取超时 在您停用节点或手动删除提示 CF 之前,应在您的节点上使用一段时间 很可能让你过去。如果你删除它们,你会想要确保你 完成所有退役后运行完整的集群修复,以传播数据 来自您删除的任何提示。

【讨论】:

    【解决方案2】:

    简短的回答是,我试图停用的节点对于它所拥有的数据量来说功能不足。在撰写本文时,处理具有任意数量数据的节点所需的资源似乎是合理的硬性最低限度,这似乎与 AWS i2.2xlarge 提供的资源差不多。特别是,旧的 m1 实例允许您在每个节点上存储比可用内存和计算资源支持的更多的数据,从而让您陷入困境。

    【讨论】:

    • 我目前正在为我的集群使用 m1.xlarge。当您遇到麻烦时,您在每个节点上平均拥有多少数据?我担心遇到与您相同的问题,并希望限制数据的总大小。
    猜你喜欢
    • 2017-06-18
    • 1970-01-01
    • 2021-04-29
    • 2016-01-16
    • 1970-01-01
    • 2018-11-14
    • 2018-01-04
    • 1970-01-01
    • 2017-10-28
    相关资源
    最近更新 更多