当前位置: 首页 > 知识库问答 >
问题:

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

咸浩初
2023-03-14

我最近在系统上收到以下错误.log生产和演示集群上的文件。每个群集有 2 个节点,复制因子为 2。据我所知,没有发生任何变化。我无法弄清楚错误背后的原因是什么。它会导致插入和更新语句失败。

[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;

看起来它在第二个断言语句上失败了。该表在其属性中设置了一个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个答案

范京
2023-03-14

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

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

 类似资料:
  • 我试图联合所有大约20个表合并成一个单一的视图。我不断得到一个错误,该错误声明: 如果我将该列注释掉,可以很好地工作。 我尝试将所有列强制转换为相同的数据类型,但没有成功。 我试着注释掉有问题的专栏,这很有效,但我需要那个专栏。 我只尝试了几个表的联合,这取决于文档类型,有时有效,有时无效。

  • 问题内容: 我有此查询返回我的ID 但我收到此语句的语法错误 我如何正确更新从第一条语句中检索到的ID 问题答案: 正确的:

  • 主要内容:更新单个记录,更新多条记录,不使用WHERE子句SQL UPDATE语句用于修改数据库中已有的数据。 子句中的条件决定要更新哪一行。 语法 假设有一个表,它的结构和数据记录如下所示 - EMP_ID EMP_NAME CITY SALARY AGE 1 Angelina Chicago 200000 30 2 Robert Austin 300000 26 3 Christian Denver 100000 42 4 Kristen Washi

  • 主要内容:语法,实例SQLite 的 UPDATE 查询用于修改表中已有的记录。可以使用带有 WHERE 子句的 UPDATE 查询来更新选定行,否则所有的行都会被更新。 语法 带有 WHERE 子句的 UPDATE 查询的基本语法如下: 您可以使用 AND 或 OR 运算符来结合 N 个数量的条件。 实例 假设 COMPANY 表有以下记录: 下面是一个实例,它会更新 ID 为 6 的客户地址: 现在,COMPAN

  • UPDATE 语句用于更新表中的记录。 SQL UPDATE 语句 UPDATE 语句用于更新表中已存在的记录。 SQL UPDATE 语法UPDATE table_name SET column1=value1,column2=value2,... WHERE some_column=some_value; 请注意 SQL UPDATE 语句中的 WHERE 子句! WHERE 子句规定哪条记录

  • 我有一个for go项目,它有一个步骤来生成protobuf源代码。最小的可复制示例是(假设安装了所有必需的依赖项,并且正确定位了proto文件): 您可以在以下位置查看完整版本:https://github.com/cqfn/degitx/blob/master/proto/makefile 它在Linux和CI管道上正常工作,但在WSL下的Windows上失败,并出现错误: 语法错误:“(”意