ALTER TABLE ADD 上的 Cassandra 消息反序列化异常

问题描述 投票:0回答:1

当我尝试向 Cassandra(4.0.5) ColumnFamily 添加列时遇到一些麻烦。

我在 1 个 DC 中使用 3 节点集群

./nodetool -h cass-host status
Datacenter: PERF-DC
===================
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
--  Address       Load        Tokens  Owns (effective)  Host ID                               Rack         
UN  10.24.40.53   391.57 KiB  16      100.0%            2e8207df-1954-4ba6-b438-1c1215cd264f  PERF-DC-RACK1
UN  10.24.40.133  388.83 KiB  16      100.0%            faaa220b-83ec-4489-8814-83739cf0c6c5  PERF-DC-RACK7
UN  10.24.40.132  402.47 KiB  16      100.0%            ef89f057-a315-4451-83e3-a9c27a0ee0c9  PERF-DC-RACK8


10.24.40.53  - cass-host1    
10.24.40.133 - cass-host2
10.24.40.132 - cass-host3

我有一个ColumnFamily

CREATE TABLE table_01
(
    tdsrId         BIGINT,
    id             BIGINT,
    contents       VARCHAR,
    PRIMARY KEY ((tdsrId),id) 
) WITH default_time_to_live = 3600 
AND gc_grace_seconds = 3600;

首先我已经开始从我的java应用程序读取数据的活动

HOST: cass-host3
Consistency: LOCAL_QUORUM
QUERY: SELECT tdsrId,id,contents FROM table_01 WHERE tdsrId=1234567
load: 1000 operation per second

然后我尝试将列添加到ColumnFamily:

$cqlsh cass-host1

Connected to PERF-CLUSTER at cass-host1:9042
[cqlsh 6.0.0 | Cassandra 4.0.5 | CQL spec 3.4.5 | Native protocol v5]
Use HELP for help.

cassandra@cqlsh> alter table ks.table_01 add t01 int;

结果:

1)在 cass-host3 上,我在 cassandra/log/debug.log 中收到 5 个错误


    ERROR [Messaging-EventLoop-3-1] 2023-12-26 18:03:01,094 InboundMessageHandler.java:182 - /10.24.40.53:7000->/10.24.40.132:7000-SMALL_MESSAGES-ff4dd09b unexpected exception caught while deserializing a message
    java.lang.RuntimeException: Unknown column t01 during deserialization
        at org.apache.cassandra.db.Columns$Serializer.deserialize(Columns.java:489)
        at org.apache.cassandra.db.filter.ColumnFilter$Serializer.deserializeRegularAndStaticColumns(ColumnFilter.java:1072)
        at org.apache.cassandra.db.filter.ColumnFilter$Serializer.deserialize(ColumnFilter.java:1021)
        at org.apache.cassandra.db.ReadCommand$Serializer.deserialize(ReadCommand.java:928)
        at org.apache.cassandra.db.ReadCommand$Serializer.deserialize(ReadCommand.java:833)
        at org.apache.cassandra.net.Message$Serializer.deserializePost40(Message.java:782)
        at org.apache.cassandra.net.Message$Serializer.deserialize(Message.java:642)
        at org.apache.cassandra.net.InboundMessageHandler.processSmallMessage(InboundMessageHandler.java:168)
        at org.apache.cassandra.net.InboundMessageHandler.processOneContainedMessage(InboundMessageHandler.java:151)
        at org.apache.cassandra.net.AbstractMessageHandler.processFrameOfContainedMessages(AbstractMessageHandler.java:242)
        at org.apache.cassandra.net.AbstractMessageHandler.processIntactFrame(AbstractMessageHandler.java:227)
        at org.apache.cassandra.net.AbstractMessageHandler.process(AbstractMessageHandler.java:218)
        at org.apache.cassandra.net.FrameDecoder.deliver(FrameDecoder.java:321)
        at org.apache.cassandra.net.FrameDecoder.channelRead(FrameDecoder.java:285)
        at org.apache.cassandra.net.FrameDecoder.channelRead(FrameDecoder.java:269)
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
        at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
        at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1410)
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
        at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:919)
        at io.netty.channel.epoll.AbstractEpollStreamChannel$EpollStreamUnsafe.epollInReady(AbstractEpollStreamChannel.java:795)
        at io.netty.channel.epoll.EpollEventLoop.processReady(EpollEventLoop.java:480)
        at io.netty.channel.epoll.EpollEventLoop.run(EpollEventLoop.java:378)
        at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:989)
        at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
        at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
        at java.base/java.lang.Thread.run(Thread.java:829)

2)在我的 java 应用程序上,我有 5 个错误

2023-12-26 18:02:53.941 ERROR 1821233 --- [   scheduling-1] console_out     : err count: 5, message:Query; 
CQL [SELECT tdsrId,id,contents FROM table_01 WHERE tdsrId=?]; 
Cassandra failure during read query at consistency LOCAL_QUORUM (2 responses were required but only 1 replica responded, 1 failed); 
nested exception is com.datastax.oss.driver.api.core.servererrors.ReadFailureException:
 Cassandra failure during read query at consistency LOCAL_QUORUM (2 responses were required but only 1 replica responded, 1 failed)

之后,下一个 cql 工作正常,没有任何错误。

我预计 ALTER TABLE 是危险操作,我丢失了一些查询结果,女巫一直与 ALTER 同时执行。

有人可以解释一下,这种行为是否正确,或者我可能调整我的 cassandra 并使用 ALTER TABLE ADD COLUMN 而不会出现此错误?

cassandra deserialization alter
1个回答
0
投票

您是否通过一些快速连续执行这些操作的自动化作业运行 alter 和 select 语句?您能否在执行 nodetool describecluster

 语句后立即执行 
ALTER
,以确保在发布之前架构更改已传播到集群中的所有节点(在这种情况下,所有节点都将具有相同的架构 UUID)对该表上新添加的列进行选择?如果命令的结果有多个 UUID,则意味着架构更改尚未传播到集群中的其他/所有节点,您需要通过查看 
system.log
debug.log
文件来调查它。

关于您遇到的另一个问题,

Cassandra failure during read query at consistency LOCAL_QUORUM (2 responses were required but only 1 replica responded, 1 failed); 

在这种情况下,C* 集群未针对您尝试施加到集群上的负载进行正确指定。您是否已经完成了正确的集群规模调整以及在初始规划阶段对该集群上运行的实际负载的预期测试(+一些缓冲缓冲)测试?如果没有,我强烈建议您查看此文档并执行必要的集群测试/调整大小。干杯!

© www.soinside.com 2019 - 2024. All rights reserved.