java - 使用 nodetool 为 Cassandra 快照拍摄 java.lang.NoSuchMethodException
问题描述
我正在尝试使用在 docker 容器上运行的 nodetool 快照工具获取 cassandra 数据库的快照。更准确地说,我使用以下命令
nodetool -h cassandra -p 9999 snapshot
其中 cassandra 在 hosts 文件中定义。
这会产生以下异常:
错误:takeSnapshot(java.lang.String,java.util.Map,[Ljava.lang.String;) - 堆栈跟踪 - java.lang.NoSuchMethodException: takeSnapshot(java.lang.String, java.util.Map, [Ljava.lang.String;) 在 com.sun.jmx.mbeanserver.PerInterface.noSuchMethod(PerInterface.java:169) 在 com.sun.jmx.mbeanserver.PerInterface.invoke(PerInterface.java:135) 在 com.sun.jmx.mbeanserver.MBeanSupport.invoke(MBeanSupport.java:252) 在 com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819) 在 com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:801) 在 javax.management.remote.rmi.RMIConnectionImpl.doOperation(RMIConnectionImpl.java:1468) 在 javax.management.remote.rmi.RMIConnectionImpl.access$300(RMIConnectionImpl.java:76) 在 javax.management.remote.rmi.RMIConnectionImpl$PrivilegedOperation.run(RMIConnectionImpl.java:1309) 在 javax.management.remote.rmi.RMIConnectionImpl.doPrivilegedOperation(RMIConnectionImpl.java:1401) 在 javax.management.remote.rmi.RMIConnectionImpl.invoke(RMIConnectionImpl.java:829) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:498) 在 sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:357) 在 sun.rmi.transport.Transport$1.run(Transport.java:200) 在 sun.rmi.transport.Transport$1.run(Transport.java:197) 在 java.security.AccessController.doPrivileged(本机方法) 在 sun.rmi.transport.Transport.serviceCall(Transport.java:196) 在 sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:573) 在 sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:834) 在 sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(TCPTransport.java:688) 在 java.security.AccessController.doPrivileged(本机方法) 在 sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:687) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) 在 java.lang.Thread.run(Thread.java:748)
有人会知道为什么会这样吗?
提前致谢 !
解决方案
看起来你在 Docker 和你的主机上有不兼容的 Cassandra 版本 - 在你的主机上你有 DataStax Enterprise 或 Cassandra 4.0 beta,它们有另一组函数参数(它是5 年前的这个提交takeSnapshot
引入的) .
要解决这个问题,你需要使用相同版本的 Cassandra 来执行命令,最简单的方法是在 Docker 容器中执行它docker exec <container-name> nodetool snapshot <options-if-necessary>
推荐阅读
- java - Spring依赖问题
- mocha.js - 当端点相互依赖时,如何在 Mocha 中测试 API 的不同端点
- ios - 使用 writeJPEGRepresentation 函数保存具有深度数据的 CIImage
- three.js - 点云纹理 alpha 混合 (THREEJS)
- excel - SSIS 行从原始数量减少
- google-app-engine - 有什么方法可以从 Google Sheet 2 触发 Google Sheet 1 的功能?
- javascript - 在处理程序栏中包含 js 文件
- c# - 在 SSH.NET 中逐行读取和处理命令输出
- django - 何时使用自定义模型管理器?
- java - 尝试向已有数据的表添加新的布尔列时出错