在运行Debian的VM上的单节点安装Cassandra 3.7中,我有一个大约有2000万行的表。为了能够选择过去几天插入的数据,我使用Datastax DevCenter 1.6.0执行语句,以在包含插入日期的列上创建二级索引:
CREATE INDEX srsdata_datetimeinserted ON ccp.srsdata(datetimeinserted);
语句本身运行得很快,然后,据我所知,索引创建过程在hte后台启动,其中一个内核的CPU负载接近100%。问题是,此CPU负载现在已超过24小时,并且即使在多次重新启动虚拟机后也会再次启动。
为了检查索引创建过程,我已经运行
nodetool compactionstats
但几乎从一开始它似乎停留在5.78%并且在过去24小时内根本没有变化:
pending tasks: 1
- ccp.srsdata: 1
id compaction type keyspace table completed total unit progress
2616e5d0-c217-11e6-bbed-073889a74ba2 Secondary index build ccp srsdata 655814 11350989 bytes 5.78%
Active compaction remaining time : 0h00m00s
我可以从表中进行SELECT而不是INSERT数据,甚至不能进入其他表,然后我得到
"Cassandra timeout during write query at consistency ONE
(1 replica were required but only 0 acknowledged the write)"
如果我尝试删除索引,
DROP INDEX srsdata_datetimeinserted;
我得到了
"Timed out waiting for server respones".
我试图使用
停止索引构建nodetool stop INDEX_BUILD
但它没有任何区别。
如何停止并重启索引创建?或者还有其他的东西在运行,我还没有?
更新2017-01-12
我从未让索引创建过程停止,因此我最终从创建索引之前的备份中恢复虚拟服务器。
我还发现了Cassandra 3.4(http://www.doanduyhai.com/blog/?p=2058)中引入的新SASI索引,特别是SPARSE索引模式用于存储接近唯一的数据,例如毫秒时间戳。实际上,允许最多5个相同的值。所以我使用
创建了一个SASI索引CREATE CUSTOM INDEX srsdata_datetimeinserted ON ccp.srsdata (datetimeinserted) USING 'org.apache.cassandra.index.sasi.SASIIndex' WITH OPTIONS = { 'mode': 'SPARSE' };
创作花了大约20分钟,似乎工作正常,现在我可以进行像
这样的查询select * from ccp.srsdata where datetimeinserted >= '2017-01-01 00:00:00+0000' AND datetimeinserted < '2017-01-01 15:00:00+0000';