我正在运行一个2节点(每个节点8个核心) Cassandra 3.10集群,复制因子为1。随着时间的推移,我在cassandra集群上拥有了许多密钥空间。
我最近注意到,当我停止/开始的时候,恢复的时间是非常缓慢的。在我的和debug.log中,我看到了数以千计的堆栈跟踪,如下面的示例所示。看起来卡桑德拉试图为不再存在的关键字空间准备语句,就像我之前删除的那样。
注意,在启动时,我没有任何应用程序/客户端等连接到cassandra。我还手动清除了提交日志、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]发布于 2017-07-13 16:14:21
我想出来了。Cassandra将准备好的语句写入system.prepared_statements键空间。不太确定他们什么时候引入了这个特性。它似乎将所有准备好的语句保存在此表中,并试图在重新启动时读取它们。我的实例中有数百万行,包括以前删除的键空间中的行。
截断表system.prepared_statements为我解决了问题,启动时间从小时到秒不等。
截断表:
truncate system.prepared_statements;https://stackoverflow.com/questions/44973340
复制相似问题