0

TL; DR - 所以我有一個從DataStax java cassandra驅動程序到DataStax cassandra集羣的連接問題。它最初連接和執行得很好,然後在某一點突然失去連接並且不重新連接 - 此時所有查詢都失敗。Cassandra java驅動程序連接錯誤

更多信息 -

所以我跑在CentOS DataStax卡桑德拉2.1 3個節點的集羣中,我使用DataStax卡桑德拉驅動程序3.0.0。在過去的幾個月中,一切都運行良好,最近iv'e部署了一些代碼更改,包括一些模式更改(即向現有表添加列)以及增加查詢次數。斷開連接在這一點開始。

因此,當我的應用程序上升時,它連接到羣集並擁有一個羣集(和會話)對象,如下面的代碼片段所示,此時一切順利。幾個小時後,我開始接收每個查詢執行NoHostAvailableException。在這一點上,我有其他服務器與相同的cassandra集羣表現良好,所以我知道集羣本身沒有任何問題。當我重啓我的服務器時,一切都很好。

在調查了一會兒之後,當問題開始發生時,我看到沒有任何活動連接到兩個節點。如果將驅動程序設置爲在專用日誌文件中登錄DEBUG級別並等待問題再次發生。幾個小時後再次出現問題,在某些時候日誌文件顯示此消息:

Connection[/10.4.116.91:9042-1, inFlight=2, closed=false] connection error 
io.netty.handler.codec.DecoderException: com.datastax.driver.core.exceptions.DriverInternalError: Adjusted frame length exceeds 268435456: 326843398 - discarded 
     at io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:418) 
     at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:245) 
     at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:292) 
     at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:278) 
     at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:962) 
     at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:131) 
     at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:528) 
     at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:485) 
     at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:399) 
     at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:371) 
     at io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:112) 
     at java.lang.Thread.run(Thread.java:745) 
Caused by: com.datastax.driver.core.exceptions.DriverInternalError: Adjusted frame length exceeds 268435456: 326843398 - discarded 
     at com.datastax.driver.core.Frame$Decoder$DecoderForStreamIdSize.decode(Frame.java:239) 
     at com.datastax.driver.core.Frame$Decoder.decode(Frame.java:205) 
     at io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:387) 
     ... 11 common frames omitted 

,並在之後,你看到這一點:

Connection[/10.4.116.91:9042-1, inFlight=2, closed=false] connection error 
io.netty.handler.codec.DecoderException: com.datastax.driver.core.exceptions.DriverInternalError: Adjusted frame length exceeds 268435456: 326843398 - discarded 
     at io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:418) 
     at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:245) 
     at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:292) 
     at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:278) 
     at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:962) 
     at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:131) 
     at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:528) 
     at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:485) 
     at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:399) 
     at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:371) 
     at io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:112) 
     at java.lang.Thread.run(Thread.java:745) 
Caused by: com.datastax.driver.core.exceptions.DriverInternalError: Adjusted frame length exceeds 268435456: 326843398 - discarded 
     at com.datastax.driver.core.Frame$Decoder$DecoderForStreamIdSize.decode(Frame.java:239) 
     at com.datastax.driver.core.Frame$Decoder.decode(Frame.java:205) 
     at io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:387) 
     ... 11 common frames omitted 

從這一點上你看到的只是超時和重試但連接不會重新建立。 這破壞了司機:

// CREATION OF CASSANDRA SESSION 
PoolingOptions poolingOptions = new PoolingOptions(); 
poolingOptions 
    .setPoolTimeoutMillis(0) 
    .setMaxRequestsPerConnection(HostDistance.LOCAL, 32768) 
    .setMaxRequestsPerConnection(HostDistance.REMOTE, 2000); 
cluster = builder.withPoolingOptions(poolingOptions).build(); 
cluster.getConfiguration().getCodecRegistry().register(new EnumNameCodec<>(OnBoardingSlide.Type.class)); 
session = cluster.connect(Global.getServerConfig().CASSANDRA_KEYSPACE_NAME); 
+0

你正在做插入或只是從cassandra讀取? – root545

+0

兩者。所有查詢都失敗。 – AvivC

回答

2

如果卡桑德拉節點被配置有native_transport_max_frame_size_in_mb> 256和驅動程序讀取的幀比256MB拋出異常大。這可能是在Java驅動程序

一個錯誤由於解碼器,用於解析幀的讀取後續數據包的能力是靜態

在3.0.4這已被固定在, 這裏是鏈接的細節。

https://datastax-oss.atlassian.net/browse/JAVA-1292

你可以嘗試升級您的驅動程序?

+0

我也在這裏收到此提示: https://groups.google.com/a/lists.datastax.com/forum/#!topic/java-driver-user/1cSGl-YOzxE 我剛剛遷移今天。我會等待幾天,看看它是否重複,我會在這裏確認! 謝謝! – AvivC

+0

似乎不會重複使用新版本! – AvivC

相關問題