为什么我在启动时从丢弃的键空间获得Cassandra预处理语句重新创建错误?

时间:2017-07-07 14:30:01

标签: cassandra-3.0

我正在运行一个2节点(每个节点8个核心)Cassandra 3.10集群,复制因子为1.我的cassandra集群随着时间的推移已经拥有了许多密钥空间。

我最近注意到,当我停止/开始回来的时间非常缓慢。我在system.log和debug.log中看到了数以千计的"准备好的语句娱乐" 堆栈跟踪,如下例所示。似乎Cassandra正在尝试为不再存在的键空间准备语句,因为我之前已经删除了它们。

注意我启动时没有任何连接到cassandra的应用程序/客户端等。我还手动清除了commitlog,saved_caches以及之前丢弃的键盘的数据文件,这在启动时没有任何区别。我在没有数据和提交日志的情况下看到了相同的行为。

任何人都知道Cassandra在启动时从哪里获取此信息和/或如何在保留现有密钥空间的同时解决此问题?

准备好的声明娱乐警告:

WARN  [main] 2017-07-07 14:44:14,362 QueryProcessor.java:159 - prepared statement recreation error: update metric_resource set attributes = ? where t_uid ='TUID1' and metric_name =? and resource_name=?
org.apache.cassandra.db.KeyspaceNotDefinedException: Keyspace test_keyspace_1 does not exist
        at org.apache.cassandra.thrift.ThriftValidation.validateKeyspace(ThriftValidation.java:85) ~[apache-cassandra-3.10.jar:3.10]
        at org.apache.cassandra.thrift.ThriftValidation.validateColumnFamily(ThriftValidation.java:109) ~[apache-cassandra-3.10.jar:3.10]
        at org.apache.cassandra.cql3.statements.ModificationStatement$Parsed.prepare(ModificationStatement.java:796) ~[apache-cassandra-3.10.jar:3.10]
        at org.apache.cassandra.cql3.statements.ModificationStatement$Parsed.prepare(ModificationStatement.java:789) ~[apache-cassandra-3.10.jar:3.10]
        at org.apache.cassandra.cql3.QueryProcessor.getStatement(QueryProcessor.java:557) ~[apache-cassandra-3.10.jar:3.10]
        at org.apache.cassandra.cql3.QueryProcessor.prepare(QueryProcessor.java:412) ~[apache-cassandra-3.10.jar:3.10]
        at org.apache.cassandra.cql3.QueryProcessor.preloadPreparedStatement(QueryProcessor.java:154) ~[apache-cassandra-3.10.jar:3.10]
        at org.apache.cassandra.service.CassandraDaemon.setup(CassandraDaemon.java:358) [apache-cassandra-3.10.jar:3.10]
        at org.apache.cassandra.service.CassandraDaemon.activate(CassandraDaemon.java:601) [apache-cassandra-3.10.jar:3.10]
        at org.apache.cassandra.service.CassandraDaemon.main(CassandraDaemon.java:735) [apache-cassandra-3.10.jar:3.10]

与非现有键空间相关的其他堆栈跟踪:

org.apache.cassandra.db.KeyspaceNotDefinedException: Keyspace test_keyspace1 does not exist
        at org.apache.cassandra.thrift.ThriftValidation.validateKeyspace(ThriftValidation.java:85) ~[apache-cassandra-3.10.jar:3.10]
        at org.apache.cassandra.thrift.ThriftValidation.validateColumnFamily(ThriftValidation.java:109) ~[apache-cassandra-3.10.jar:3.10]
        at org.apache.cassandra.cql3.statements.SelectStatement$RawStatement.prepare(SelectStatement.java:920) ~[apache-cassandra-3.10.jar:3.10]
        at org.apache.cassandra.cql3.statements.SelectStatement$RawStatement.prepare(SelectStatement.java:915) ~[apache-cassandra-3.10.jar:3.10]
        at org.apache.cassandra.cql3.QueryProcessor.getStatement(QueryProcessor.java:557) ~[apache-cassandra-3.10.jar:3.10]
        at org.apache.cassandra.cql3.QueryProcessor.prepare(QueryProcessor.java:412) ~[apache-cassandra-3.10.jar:3.10]
        at org.apache.cassandra.cql3.QueryProcessor.preloadPreparedStatement(QueryProcessor.java:154) ~[apache-cassandra-3.10.jar:3.10]
        at org.apache.cassandra.service.CassandraDaemon.setup(CassandraDaemon.java:358) [apache-cassandra-3.10.jar:3.10]
        at org.apache.cassandra.service.CassandraDaemon.activate(CassandraDaemon.java:601) [apache-cassandra-3.10.jar:3.10]
        at org.apache.cassandra.service.CassandraDaemon.main(CassandraDaemon.java:735) [apache-cassandra-3.10.jar:3.10]

1 个答案:

答案 0 :(得分:0)

我想出了这个。 Cassandra将准备好的语句写入 system.prepared_statements 键空间。他们引入此功能时不太确定。它似乎将所有准备好的语句保留在此表中,并尝试在重新启动时读取它们。我的实例中有数百万行,包括以前删除的键空间。

截断表system.prepared_statements为我解决了问题,启动时间从几小时到几秒。

截断表:

truncate system.prepared_statements;