我们最近开始玩cassandra,并设置了
4数据中心(DC1,DC2,DC3,DC4),(在VM上运行的每个数据中心集群3个节点),内存,memtables等.config以默认值运行。
我们有一个在每个节点上运行的cron作业(大约每周1次,交错)来执行修复工作。
无论如何,我们有4个节点同时死亡,(2个死在DC1中,2个死在DC2中,dc1 / dc2都在美国,其他2个在欧盟)都是内存不足,所有4个节点上的堆栈似乎相同..(请参阅下面的完整堆栈)。
节点在周末崩溃了,当时应该没有客户端活动到达集群(因为这是一个测试集群),查看日志显示唯一的活动是修复/压缩。
每个节点在4GB的盒子上运行,堆设置为1GB。 此时集群的实际数据负载可以忽略不计,我们有3个密钥空间(RF = 2到所有DataCenters),其中每个密钥空间大小为2-12kb ..(12kb实际上是我们刚刚安装的OpsCenter星期五..可以安装OpsCenter吗?)
我怀疑到目前为止我们还没有将超过20Mb的交易推入系统。
有关可能导致此OOM的原因的任何想法? 我简单地看了一下hprof转储,但没有什么真正突出。
我们已经做了更多的挖掘,并确定了我们的 nodetool修复操作正在运行12个多小时(导致另一个节点同时运行nodetool修复,我相信同时运行的2个修复导致节点到OOM)。
我还能够通过运行1 nodetool修复作业以及nodetool紧凑键空间操作来按需复制OOM错误。
我不知道为什么要花12个多小时进行维修。
我们还确定我们的一些数据目录/密钥空间/表目录有超过7500多个文件,这可能导致进程永远运行。
还阅读了我们已开始使用nodetool repair -par -inc开始的2.1文档 此过程目前仍在运行。
一些想法: 我们认为对我们来说最好的策略可能是:nodetool compact。
nodetool -inc
然后保留这个脚本'连续运行,循环抛出所有数据中心的所有节点 (也许在切换节点之间等待几个小时)。 这听起来合理吗?这将至少确保只有1个维修作业在运行,并且从不同时进行主要压缩。
WARN [SharedPool-Worker-13] 2014-12-07 18:32:14,961 AbstractTracingAwareExecutorService.java:167 - Uncaught exception on thread Thread[SharedPool-Worker-13,5,main]: {}
java.lang.OutOfMemoryError: Java heap space
at org.apache.cassandra.io.compress.CompressedRandomAccessReader.<init>(CompressedRandomAccessReader.java:79) ~[apache-cassandra-2.1.0.jar:2.1.0]
at org.apache.cassandra.io.compress.CompressedRandomAccessReader.open(CompressedRandomAccessReader.java:43) ~[apache-cassandra-2.1.0.jar:2.1.0]
at org.apache.cassandra.io.util.CompressedPoolingSegmentedFile.createReader(CompressedPoolingSegmentedFile.java:59) ~[apache-cassandra-2.1.0.jar:2.1.0]
at org.apache.cassandra.io.util.PoolingSegmentedFile.getSegment(PoolingSegmentedFile.java:40) ~[apache-cassandra-2.1.0.jar:2.1.0]
at org.apache.cassandra.io.sstable.SSTableReader.getFileDataInput(SSTableReader.java:1694) ~[apache-cassandra-2.1.0.jar:2.1.0]
at org.apache.cassandra.db.columniterator.IndexedSliceReader.setToRowStart(IndexedSliceReader.java:107) ~[apache-cassandra-2.1.0.jar:2.1.0]
at org.apache.cassandra.db.columniterator.IndexedSliceReader.<init>(IndexedSliceReader.java:83) ~[apache-cassandra-2.1.0.jar:2.1.0]
at org.apache.cassandra.db.columniterator.SSTableSliceIterator.createReader(SSTableSliceIterator.java:65) ~[apache-cassandra-2.1.0.jar:2.1.0]
at org.apache.cassandra.db.columniterator.SSTableSliceIterator.<init>(SSTableSliceIterator.java:42) ~[apache-cassandra-2.1.0.jar:2.1.0]
at org.apache.cassandra.db.filter.SliceQueryFilter.getSSTableColumnIterator(SliceQueryFilter.java:179) ~[apache-cassandra-2.1.0.jar:2.1.0]
at org.apache.cassandra.db.filter.QueryFilter.getSSTableColumnIterator(QueryFilter.java:62) ~[apache-cassandra-2.1.0.jar:2.1.0]
at org.apache.cassandra.db.CollationController.collectAllData(CollationController.java:284) ~[apache-cassandra-2.1.0.jar:2.1.0]
at org.apache.cassandra.db.CollationController.getTopLevelColumns(CollationController.java:59) ~[apache-cassandra-2.1.0.jar:2.1.0]
at org.apache.cassandra.db.ColumnFamilyStore.getTopLevelColumns(ColumnFamilyStore.java:1872) ~[apache-cassandra-2.1.0.jar:2.1.0]
at org.apache.cassandra.db.ColumnFamilyStore.getColumnFamily(ColumnFamilyStore.java:1680) ~[apache-cassandra-2.1.0.jar:2.1.0]
at org.apache.cassandra.db.Keyspace.getRow(Keyspace.java:345) ~[apache-cassandra-2.1.0.jar:2.1.0]
at org.apache.cassandra.db.SliceFromReadCommand.getRow(SliceFromReadCommand.java:59) ~[apache-cassandra-2.1.0.jar:2.1.0]
at org.apache.cassandra.db.ReadVerbHandler.doVerb(ReadVerbHandler.java:47) ~[apache-cassandra-2.1.0.jar:2.1.0]
at org.apache.cassandra.net.MessageDeliveryTask.run(MessageDeliveryTask.java:62) ~[apache-cassandra-2.1.0.jar:2.1.0]
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) ~[na:1.8.0_11]
at org.apache.cassandra.concurrent.AbstractTracingAwareExecutorService$FutureTask.run(AbstractTracingAwareExecutorService.java:163) ~[apache-cassandra-2.1.0.jar:2.1.0]
at org.apache.cassandra.concurrent.SEPWorker.run(SEPWorker.java:103) [apache-cassandra-2.1.0.jar:2.1.0]