在Cassandra关闭之前,每次以编程方式刷新数据

17

我正在使用嵌入式Cassandra。当我关闭并重新启动Cassandra服务时,数据会丢失。我认为数据没有被正确刷新到磁盘中。因此,我尝试手动使用nodetool刷新数据并检查数据是否可用。但是对于嵌入式Cassandra服务,nodetool似乎无法正常工作。我收到以下错误:

c:\vijay\cassandra\bin>nodetool -host 192.168.2.86 -p 7199 drain

Starting NodeTool

Failed to connect to '192.168.2.86:7199': Connection refused: connect

我尝试设置jmx属性,但仍然遇到错误。我将以下行添加到我的代码中:

System.setProperty("com.sun.management.jmxremote", "true");
System.setProperty("com.sun.management.jmxremote.port", "7197");
System.setProperty("com.sun.management.jmxremote.authenticate", "false");
System.setProperty("com.sun.management.jmxremote.ssl", "false");
System.setProperty("java.rmi.server.hostname", "my ip");

那么,有没有办法手动将数据刷新到Cassandra而不使用nodetool呢?

编辑1:
经过几个小时的尝试,我现在能够运行nodetool了(而不是将jmx配置添加到我的代码中,我添加到了Eclipse调试配置中,然后它就可以工作了)。我运行了drain命令,现在数据已经正确地刷新到磁盘上了。所以现在我的问题是:为什么数据没有被正确地刷新?每次重新启动Cassandra服务时,最近的更改都会消失。


2
在 memtable 达到一定大小之前,不应该刷新数据。在此之前,提交日志保证了持久性,在写入确认时提交日志会被刷新。 - RussS
这就是问题所在了。在我的情况下,我猜提交日志没有被正确地刷新。当我在关闭服务之前使用nodetool刷新数据时,它可以正常工作,数据在服务器重新启动后仍然可用。那么有没有办法在每次服务器关闭时以编程方式刷新数据呢? - Vijay
3
我认为你应该尝试找出提交日志未刷新的原因。除非你禁用了fsync或者该系统上的fsync无法正常工作,否则它应该不断地写入和刷新。一旦解决了这个问题,你就不会在重新启动时丢失数据,也不需要手动刷新。 - RussS
默认情况下,日志会定期刷新。请参见http://wiki.apache.org/cassandra/Durability。 - jbaliuka
4个回答

1

1
你是如何停止和启动Cassandra服务器的?调用Cassandra守护进程上的stopServer应该会将任何未完成的写操作刷新到提交日志中。即使在方法返回后,线程仍将继续执行一些处理,因此如果在stopServer()之后终止JVM,则可能会防止数据被写入。

我尝试了正确的关闭方式,但问题仍然存在... 显然这是由于这个未解决的问题 https://issues.apache.org/jira/browse/CASSANDRA-4782 .. 我升级了我的Cassandra到更高的版本,这为我解决了问题.. 没有其他办法..! - Vijay

0

2
我已经尝试了所有可能与此问题相关的cassandra.yaml更改..但都没有用 :( - Vijay

0
可能是由于执行刷新操作而导致失败。刷新操作应该被记录在日志中。请确认您是否正在执行刷新操作。如果确实执行了刷新操作,但是失败了,那么应该有一些指示说明为什么刷新失败。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接