当我尝试向 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 而不会出现此错误?
您是否通过一些快速连续执行这些操作的自动化作业运行 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* 集群未针对您尝试施加到集群上的负载进行正确指定。您是否已经完成了正确的集群规模调整以及在初始规划阶段对该集群上运行的实际负载的预期测试(+一些缓冲缓冲)测试?如果没有,我强烈建议您查看此文档并执行必要的集群测试/调整大小。干杯!