停用cassandra节点超时,并显示“;仅收到0个响应”;

停用cassandra节点超时,并显示“;仅收到0个响应”;,cassandra,nodetool,Cassandra,Nodetool,当我尝试解除Cassandra集群中某个节点的工作时,该过程开始(我看到活动流从该节点流向集群中的其他节点(使用vnodes)),但经过一点延迟后,nodetool decommission存在,并显示以下错误消息 我可以反复运行nodetool decommission,它将开始向其他节点传输数据,但到目前为止,始终存在以下错误 为什么我会看到这一点,有没有一种方法可以让这个节点安全地退役 Exception in thread "main" java.lang.RuntimeExceptio

当我尝试解除Cassandra集群中某个节点的工作时,该过程开始(我看到活动流从该节点流向集群中的其他节点(使用vnodes)),但经过一点延迟后,
nodetool decommission
存在,并显示以下错误消息

我可以反复运行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

简单的回答是,我试图停用的节点因其所持有的数据量而功率不足。在撰写本文时,处理具有任意数据量的节点所需的资源似乎有一个合理的硬最小值,这似乎在AWS i2.2xlarge提供的附近。特别是,旧的m1实例让您陷入麻烦,因为它允许您在每个节点上存储的数据远远超过可用的内存和计算资源所能支持的数量。

提示切换管理器正在检查提示,以确定在切换过程中是否需要传递这些提示 为了不让这些提示丢失,我们将停止使用。你很可能有很多提示,或者 一堆墓碑,或表中导致查询超时的内容。你不是 在超时之前在日志中看到任何其他异常,是吗?提高读取超时 在您停用节点或手动删除提示之前,应在节点上设置一段时间 最有可能的是你的过去。如果您删除了它们,那么您需要确保 完成所有退役后运行完整群集修复,以传播数据
从您删除的任何提示中。

对于以后发现此问题的任何人,我想,通过使用
nodetool netstats
观看流,并等待所有操作都从节点上流下来,我能够安全地解除节点的运行。然后我把它取下来,在集群中进行修复。你能用其他方法完成吗?如果您有一个非常大的集群,并且修复需要几个月才能完成,那么当您有25个以上的节点要替换时,对一个节点执行此操作并围绕集群运行修复是不可行的。实际上,我最终通过使用更大的节点来解决此问题。从根本上说,问题在于节点没有足够的资源来可靠地运行Cassandra。本期发行时,我正在aws上使用m1.xlarge。迁移到i2.2xlarge可以缓解这个问题。当你向一个节点抛出大量数据时,它的大小和功能似乎有一些真正的限制。实际上,我们正试图将整个集群从m1移动到i2。问题是,我们无法对节点进行分解以替换它们。这应该不是什么大问题:您可以在整个新数据中心一次运行所有重建,根据我的经验,它在并行化工作方面做得很好,因此您只需要面对机间传输时间,aws上的内部传输时间是可以接受的。然后,您就不需要让旧数据中心退役:您可以在将客户端指向新dc并在新dc上运行修复后直接将其关闭。旧节点上没有任何东西会丢失,因此您可以不进行装饰就将其切断。我目前正在使用m1.xlarge用于集群。当您遇到麻烦时,每个节点上平均有多少数据?我担心会遇到与您相同的问题,并希望限制数据的总大小。