【发布时间】: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。