我们使用cassandra作为临时存储来在模块之间发送二进制对象(如图像)。发件人将对象保存到Cassandra中,并通过RabbitMq发送小消息。 Receiver从Cassandra获取消息并读取对象。为了避免需要维修,我们每小时创建一个键空间,如下所示#34; yyyy-MM-dd-HH"。删除脚本每小时在Crontab中运行,并从Cassandra和磁盘中删除旧的键空间。 这种机制很有效,除了罕见的情况,似乎Cassandra试图在脚本运行的同一时刻完全保留memtables。然后有以下异常(来自/var/log/cassandra/system.log)和节点崩溃,需要重启。 你能告诉我什么是最好的处理方法吗?顺便说一下,我们不能使用像Redis或Memcache这样的产品,因为我们需要我们的容量受SSD而不是RAM的限制。
例外:
错误[FlushWriter:609] 2014-05-24 09:37:05,260 CassandraDaemon.java(第198行)线程中的异常线程[FlushWriter:609,5,main] /var/lib/cassandra/data/ks_2014_05_24_07/cf_cortexer/ks_2014_05_24_07-cf_cortexer-tmp-jb-1-Filter.db中的FSWriteError 在org.apache.cassandra.io.sstable.SSTableWriter $ IndexWriter.close(SSTableWriter.java:475) 在org.apache.cassandra.io.util.FileUtils.closeQuietly(FileUtils.java:212) 在org.apache.cassandra.io.sstable.SSTableWriter.abort(SSTableWriter.java:301) 在org.apache.cassandra.db.Memtable $ FlushRunnable.writeSortedContents(Memtable.java:417) 在org.apache.cassandra.db.Memtable $ FlushRunnable.runWith(Memtable.java:350) 在org.apache.cassandra.io.util.DiskAwareRunnable.runMayThrow(DiskAwareRunnable.java:48) 在org.apache.cassandra.utils.WrappedRunnable.run(WrappedRunnable.java:28) 在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) at java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:615) 在java.lang.Thread.run(Thread.java:744) 引起:java.io.FileNotFoundException:/var/lib/cassandra/data/ks_2014_05_24_07/cf_cortexer/ks_2014_05_24_07-cf_cortexer-tmp-jb-1-Filter.db(没有这样的文件或目录) at java.io.FileOutputStream.open(Native Method) 在java.io.FileOutputStream。(FileOutputStream.java:221) 在java.io.FileOutputStream。(FileOutputStream.java:110) 在org.apache.cassandra.io.sstable.SSTableWriter $ IndexWriter.close(SSTableWriter.java:466) ......还有9个