系统环境:
linux5.4 64位
jdk1.6.45 64位
Cassandra1.2.5
最近在使用Cassandra做一个通讯录的存储工作,通讯录表共建了三个二级索引,有三个复合主键,有一个功能就是根据某二级索引查询出相关的所有联系人,该二级索引的长度大约为32,可以看做是主键的一个子集。
建表语句如下:
CREATE TABLE contactsmimic (
owneruserid text,
contactid text,
phone text,
label text,//use as timestamp for protoObj
friendid text,
ismutual int,
phoneindex text,
isdeleted int,
Json blob,
PRIMARY KEY (owneruserid, contactid, phone)
) ;
CREATE INDEX relation_friendid ON contactsmimic (friendid);
CREATE INDEX index_isdelete ON contactsmimic (isdeleted);
CREATE INDEX relation_phoneindex ON contactsmimic (phoneindex);
数据量大概10万条左右,每次启动报如下错误:
INFO [SSTableBatchOpen:1] 2013-09-03 09:27:36,573 SSTableReader.java (line 169) Opening /var/lib/cassandra/data/contactks/cpmimic/contactks-cpmimic.cpmimic_friendid_idx-ic-1 (485779 bytes)
ERROR [SSTableBatchOpen:1] 2013-09-03 09:27:36,573 CassandraDaemon.java (line 175) Exception in thread Thread[SSTableBatchOpen:1,5,main]
java.lang.AssertionError
at org.apache.cassandra.utils.ByteBufferUtil.readBytes(ByteBufferUtil.java:401)
at org.apache.cassandra.io.sstable.IndexSummary$IndexSummarySerializer.deserialize(IndexSummary.java:124)
at org.apache.cassandra.io.sstable.SSTableReader.loadSummary(SSTableReader.java:426)
at org.apache.cassandra.io.sstable.SSTableReader.load(SSTableReader.java:360)
at org.apache.cassandra.io.sstable.SSTableReader.open(SSTableReader.java:201)
at org.apache.cassandra.io.sstable.SSTableReader.open(SSTableReader.java:154)
at org.apache.cassandra.io.sstable.SSTableReader$1.run(SSTableReader.java:241)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
at java.util.concurrent.FutureTask.run(FutureTask.java:166)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:724)
而比较奇怪的是同样的数据放到32位机器上确没有任何错误。
解决过程也算费劲脑汁,升级JDK,升级Cassandra,升级glibc,升级操作系统,结果一无所获,要么索引直接失效,无法查询,要么加载失败。
就在快要放弃的时候,发现官网发布了Cassandra2.0.0,死马当活马医,权且一试,启动Cassandra,drop index,create index,还有nodetool rebuild_index,再重启,发现错误消失了,真是庆幸,但还不明确是哪一步使索引重建的。
还发现一个事情,Cassandra1.2*的索引文件是以ic为标识了,到了Cassandra2.0,是以ja为标识的。
最后,没有问题的部署环境如下:
Linux6.3 64位
JDK1.7.25 64位
Cassandra2.0.0
PS:当然以上不是解决问题的好方式,并没有找到根本问题,哪位大牛找到问题症结,请不吝赐教