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

Failing Cassandra INSERT and UPDATE statements - Unexpected Exception

我最近在我的生产和演示集群上的 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.access0(AbstractChannelHandlerContext.java:32) [netty-all-4.0.23.Final.jar:4.0.23.Final]
    at io.netty.channel.AbstractChannelHandlerContext.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]

这些是异步请求。在客户端,我看到未来会失败,因为 well.I 使用的是 cassandra-2.1。10.I 还没有完成节点的滚动重启,但我不认为将解决问题。

还注意到,失败的 inserts/updates 似乎发生在几次成功的 inserts/updates 之后。请求语句本身(格式)没问题。任何帮助将不胜感激。

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

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

看起来它在第二个断言语句上失败了。 table 在其属性中设置了 1728000 秒的 TTL 值。 insert/update 语句中未设置 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.

我相信发生上述错误时,客户端会断开连接并重新连接。在此期间其他异步请求失败。

其中一个 table 的 'default_time_to_live' 设置为大约 19 年。问题背后的原因是 2038 timestamp problmem。尽管每个单元格上的 ttl 值本身就是剩余的秒数,但 cassandra 似乎在内部尝试将到期时间转换为时间戳。所以当前时间戳 + ttl (19+) 年 = 2038 年 1 月 19 日之后的时间戳。这导致了溢出和上面显示的异常中看到的负数。减少 table 上的默认 ttl 值修复了问题,阻止了断言错误的发生。

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