我正在运行一个2节点(每个节点8个内核)的Cassandra 3.10集群,复制因子为1。随着时间的推移,我在我的Cassandra集群上已经拥有了大量的密钥空间。
我最近注意到,当我停止/启动时,返回的时间非常慢。我在system.log和debug.log中看到了数千条**“预准备语句重建”**堆栈跟踪,如下面的示例所示。看起来Cassandra正试图为已不存在的键空间准备语句,因为我之前已经删除了它们。
注意我没有任何应用程序/客户端等连接到cassandra时,它启动。我也手动清理了commitlog,保存的缓存沿着数据文件,为以前的下降键空间,这没有什么区别,在启动时。我看到相同的行为与我们没有数据和提交日志。
有人知道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条答案
按热度按时间xzv2uavs1#
我发现了这个问题。Cassandra将预处理语句写入system.prepared_statementskeyspace。不太清楚他们什么时候引入了这个特性。它似乎将所有预处理语句保存在这个表中,并试图在重新启动时读取它们。我的示例中有数百万行,包括那些来自以前删除的keyspace的行。
截断表system.prepared_statements为我解决了这个问题,启动时间从几个小时缩短到几秒钟。
截断表: