我在尝试向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
字符串
我有一个列家庭
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-host 3上,我在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)
型
在那之后,next cql工作正常,没有任何错误。
我预计,ALTER TABLE是危险的操作,我失去了一些查询结果,它与ALTER同时执行。
有人能解释一下,这是正确的行为,或者可能是我调优我的cassandra和使用ALTER TABLE ADD COLUMN没有这个错误?
1条答案
按热度按时间vs91vp4v1#
您是否通过某些自动化作业运行alter和select语句,这些自动化作业会快速连续地执行这些语句?您是否可以在执行
ALTER
语句后立即执行nodetool describecluster
,以确保架构更改已传播到群集中的所有节点(在这种情况下,所有节点将具有相同的模式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* 集群没有针对您试图放置在集群上的负载进行适当的规范。您是否已经通过了适当的集群大小调整和测试(+一些缓冲)测试在初始规划阶段将在此群集上运行的实际负载?如果没有,我强烈建议您使用check out this documentation并执行必要的集群测试/规模调整。干杯!