Cassandra INSERT和UPDATE语句失败-意外异常

时间:2018-11-28 18:56:55

标签: cassandra cql cassandra-2.0 cassandra-3.0 cassandra-2.1

我最近在生产集群和演示集群的system.log文件上都收到以下错误。每个群集有2个节点,复制因子为2。据我所知,未进行任何更改。我无法弄清楚错误背后的原因是什么。这导致INSERT和UPDATE语句失败。

[SharedPool-Worker-27] ERROR org.apache.cassandra.transport.Message - Unexpected exception during request; channel = [id: 0xeb429d31, /14.0.0.1:34495 => /14.0.0.2:9042]                
    java.lang.AssertionError: -2146739295
    at org.apache.cassandra.db.BufferExpiringCell.<init>(BufferExpiringCell.java:46) ~[apache-cassandra-2.1.10.jar:2.1.10]
    at org.apache.cassandra.db.BufferExpiringCell.<init>(BufferExpiringCell.java:39) ~[apache-cassandra-2.1.10.jar:2.1.10]
    at org.apache.cassandra.db.AbstractCell.create(AbstractCell.java:176) ~[apache-cassandra-2.1.10.jar:2.1.10]
    at org.apache.cassandra.cql3.UpdateParameters.makeColumn(UpdateParameters.java:65) ~[apache-cassandra-2.1.10.jar:2.1.10]
    at org.apache.cassandra.cql3.Constants$Setter.execute(Constants.java:314) ~[apache-cassandra-2.1.10.jar:2.1.10]
    at org.apache.cassandra.cql3.statements.UpdateStatement.addUpdateForKey(UpdateStatement.java:110) ~[apache-cassandra-2.1.10.jar:2.1.10]
    at org.apache.cassandra.cql3.statements.UpdateStatement.addUpdateForKey(UpdateStatement.java:57) ~[apache-cassandra-2.1.10.jar:2.1.10]
    at org.apache.cassandra.cql3.statements.ModificationStatement.getMutations(ModificationStatement.java:708) ~[apache-cassandra-2.1.10.jar:2.1.10]
    at org.apache.cassandra.cql3.statements.ModificationStatement.executeWithoutCondition(ModificationStatement.java:495) ~[apache-cassandra-2.1.10.jar:2.1.10]
    at org.apache.cassandra.cql3.statements.ModificationStatement.execute(ModificationStatement.java:481) ~[apache-cassandra-2.1.10.jar:2.1.10]
    at org.apache.cassandra.cql3.QueryProcessor.processStatement(QueryProcessor.java:238) ~[apache-cassandra-2.1.10.jar:2.1.10]
    at org.apache.cassandra.cql3.QueryProcessor.processPrepared(QueryProcessor.java:493) ~[apache-cassandra-2.1.10.jar:2.1.10]
    at org.apache.cassandra.transport.messages.ExecuteMessage.execute(ExecuteMessage.java:138) ~[apache-cassandra-2.1.10.jar:2.1.10]
    at org.apache.cassandra.transport.Message$Dispatcher.channelRead0(Message.java:439) [apache-cassandra-2.1.10.jar:2.1.10]
    at org.apache.cassandra.transport.Message$Dispatcher.channelRead0(Message.java:335) [apache-cassandra-2.1.10.jar:2.1.10]
    at io.netty.channel.SimpleChannelInboundHandler.channelRead(SimpleChannelInboundHandler.java:105) [netty-all-4.0.23.Final.jar:4.0.23.Final]
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:333) [netty-all-4.0.23.Final.jar:4.0.23.Final]
    at io.netty.channel.AbstractChannelHandlerContext.access$700(AbstractChannelHandlerContext.java:32) [netty-all-4.0.23.Final.jar:4.0.23.Final]
    at io.netty.channel.AbstractChannelHandlerContext$8.run(AbstractChannelHandlerContext.java:324) [netty-all-4.0.23.Final.jar:4.0.23.Final]
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [na:1.8.0_45]
    at org.apache.cassandra.concurrent.AbstractTracingAwareExecutorService$FutureTask.run(AbstractTracingAwareExecutorService.java:164) [apache-cassandra-2.1.10.jar:2.1.10]
    at org.apache.cassandra.concurrent.SEPWorker.run(SEPWorker.java:105) [apache-cassandra-2.1.10.jar:2.1.10]
    at java.lang.Thread.run(Thread.java:745) [na:1.8.0_45]

这些是异步请求。在客户端,我也看到了未来的失败。我正在使用cassandra-2.1.10。我还没有滚动重启节点,但是我认为这不会解决问题

还注意到,似乎失败的插入/更新发生在几次成功的插入/更新之后。请求语句本身(格式)很好。任何帮助将不胜感激。

更新:我研究了cassandra源代码。它包含以下内容:

assert timeToLive > 0 : timeToLive;
assert localExpirationTime > 0 : localExpirationTime;

好像在第二个assert语句上失败了。该表的属性中设置了TTL值1728000秒。在插入/更新语句中未设置任何ttl。因此,我不明白为什么某些语句对此断言失败。

编辑:在客户端应用程序上,我看到以下错误消息:

客户端1连接到群集1:

16:36:01.102 [New I/O worker #64] WARN  - /14.0.0.2:9042 replied with server error (java.lang.AssertionError: -2146571535), trying next host

客户端2连接到群集2:

16:30:01.302 [cluster1-nio-worker-7] WARN  - /14.0.0.4:9042 replied with server error (java.lang.AssertionError: -2146571895), defuncting connection.

我相信所发生的是当上述错误发生时,客户端断开了连接并重新连接。在这段时间内,其他异步请求失败。

1 个答案:

答案 0 :(得分:0)

其中一张表的“ default_time_to_live”设置为大约19年。问题背后的原因是2038 timestamp problmem。即使每个单元格上的ttl值本身是剩余的秒数,似乎cassandra仍在内部尝试将到期时间转换为时间戳。因此,当前时间戳+ ttl(19+)年= 2038年1月19日之后的时间戳。这导致溢出和负数,如上所示。减少表上的默认ttl值可解决问题,使断言错误不再发生。

似乎有一些断言错误,将导致连接重置,同时其他写入操作也会失败。