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

如果发生读取超时,如何在Cassandra中重试

田仲卿
2023-03-14

在我的生产Cassandra集群(10个节点)中,我经常获得ReadTimeoutException。因此,为了在我的本地开发环境(四个节点的Cassandra集群)中重现这个问题,我运行了我的代码,然后停止了两个CassandRadaemon。我有以下例外

线程“main”com.datastax.driver.core.exceptions.unavailableException:在com.datastax.driver.core.exceptions.unavailableException.copy(UnavailableException.copy(UnavailableException.java:79)在com.datastax.driver.core.defailableException.java)在com.datastax.driver.core.defailableExceptionExceptionExceptionException在com.datastax.driver.core.arraybackedResultset.java:245).在在com.datastax.driver.core.exceptions.unavailableException.copy(unavailableException.java:79)在com.datastax.driver.core.responses$error.asException(response.java:94)在com.datastax.driver.core.arrayBackedResultSet$multipage$1.onset(arrayBackedResultSet:352)在.java:45)在com.datastax.driver.core.requestHandler$screstativeExecution.setfinalResult(requestHandler.java:748)在com.datastax.driver.core.requestHandler$screstativeExecution.onset(requestHandler.java:587)在com.datastax.driver.core.connection$dispatcher.channelRead0(connection.java.connection$dispatcher.channelRead0.channel.AbstractChannelHandlio.netty.channel.abstractChannelContext.java:339)在io.netty.channel.abstractChannelHandlerContext.firechannelRead(AbstractChannelHandlerContext.java:324)在io.netty.handler.timeout.idlestateHandler.java:254)在io.netty.channel.abstractChannelContext.java:254),在io.netty.channel.abstractChannelContext.java:339)在codec.messageTomessageDecoder.channelRead(MessageTomessageDecoder.java:103)在io.netty.channel.abstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:339)在io.netty.channel.abstractChannelContext.fireChannelRead(AbstractChannelHandlerContext.java:324)在:339)在io.netty.channel。AbstractChannelHandlerContext.FireChannelRead(AbstractChannelHandlerContext.java:324)在io.netty.channel.defaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:847)在io.netty.channel.nio.abstractNiobyTechannel.java:131)在io.netty.channel.nio.abstractNiobyTechannel.java:131)在O.nioEventLoop.ProcessSelectedKeys(NioEventLoop.java:382)(io.netty.channel.nio.nioEventLoop.run(NioEventLoop.java:354)(io.netty.util.concurrent.singleThreadEventExecutor$2.run(singleThreadEventExecutor.java(thread.java:745)(java.lang.thread.run(thread.java.executor.111)由:.响应$错误$1.decode(responses.java:37)在com.datastax.driver.core.message$protocoldecoder.decode(message.java:213)在com.datastax.driver.core.message$protocoldecoder.decode(message.java:204)在io.netty.handler.codec.messageMessageDecoder.channelRead(messageTomessageDecoder.java:89)...还有13个

我的Cassandra连接代码如下所示

SocketOptions so = new SocketOptions();
so.setReadTimeoutMillis(Integer.MAX_VALUE);
so.setConnectTimeoutMillis(sockettimeoutinmillis);

Builder builder = new Cluster.Builder().
                addContactPoints(connectionpoints).withPort(port);

builder.withPoolingOptions(new PoolingOptions().setCoreConnectionsPerHost(HostDistance.LOCAL, new PoolingOptions().getMaxConnectionsPerHost(HostDistance.LOCAL)));

cluster = builder
               .withRetryPolicy(DowngradingConsistencyRetryPolicy.INSTANCE)
               .withReconnectionPolicy(new ConstantReconnectionPolicy(10000L))
               .build();

session=cluster.connect();

我在连接到Cassandra时提供了重试策略,那么为什么我会遇到这样的html" target="_blank">异常?我还没有编写任何特定的代码来处理ReadTimeoutException和重试。是否需要任何特定的代码或处理?

共有1个答案

司空俊雄
2023-03-14

如果需要自定义逻辑来处理读/写超时和UnavailableExceptions,可以实现自己的自定义RetryPolicy

您可以重写onreadtimeout方法,使其完全符合您的要求。

但是,您提供的异常是unavailableException,这是一个cassandra协调器,它告诉您没有副本可以完成您的查询(在本例中,意味着拥有您试图读取的数据的所有副本都用C*标记下来),因此它甚至没有尝试,并且很快就失败了。在这种情况下,重试可能不会提供太多价值,因为您可能会经历相同的结果。根据您指定的RetryPolicy(DowngradingConsistencyRetryPolicy),可能发生的情况是遇到了ReadTimeout或UnavailableException,并且RetryPolicy在较低的ConsistencyLevel(ONE)再次尝试,但仍然失败,因为遇到了另一个UnavailableException。

有几个问题可能有助于你澄清:

  1. 您正在使用的密钥空间使用什么复制因子?在开发环境中提到4个节点。如果有1个节点宕机,而RF为1,则可能有25%的查询会遇到UnavailableException。
  2. 您用什么一致性级别查询?如果您没有提供一个,那么无论如何您总是在使用'one',所以降级ConsistencyRetryPolicy可能对您没有好处。
 类似资料:
  • 我对Spring Boot cassandra web应用程序有问题。随着数据的增长,它开始出现,现在它是一个非常常见的场景。 所有查询有时都不起作用,返回。几秒钟后它又开始工作了,几秒钟后它就不工作了。所以web应用程序不断返回或响应。相同的查询始终在中工作。 我正在使用: Spring启动启动程序 sping-boo-starter-data-cassandra#2.1.3 Cassandra

  • 问题内容: 我使用Elasticsearch-1.1.0为推文编制了索引。索引过程可以。然后我升级了版本。现在我使用Elasticsearch-1.3.2,并且我随机收到此消息: 随机性快照: 有人可以指出如何解决该问题吗? 非常感谢你。 问题答案: 很难给出直接答案,因为您看到的错误可能与您使用的客户端有关。但是,解决方案可能是以下之一: 1.通过传递timeout参数在创建ES客户端时全局增加

  • 我使用Elasticsearch-1.1.0对推文进行索引。索引过程还可以。然后我升级了版本。现在我使用Elasticsearch-1.3.2,我随机得到这条消息: 随机性快照: 有人能指出如何解决问题吗? 谢谢您们。

  • 谁能解释一下为什么我的Cassandra集群中每隔4-5分钟就会出现读取超时。我几乎可以始终如一地看到这一点,并能够始终如一地再现这一点。 读取吞吐量保持在每秒 1 个请求,集群中没有发生写入或压缩。读取超时在 cassandra.yaml 文件中配置为 5 秒。我正在使用datastax java驱动程序2.1.14。 超时期间的跟踪不起作用。在cqlsh中第二次手动读取同一行密钥成功。看看这个

  • 我们有一个单节点Cassandra集群(Apache),在AWS上有2个VCPU和大约16 GB的RAM。我们有大约28 GB的数据上传到Cassandra。 现在Cassandra可以很好地使用主键进行选择和分组查询,但是当使用用户定义的函数在非主键上使用聚合函数时,它会给出一个超时。 为了详细说明-我们对3年数据的年份、月份和日期进行了分区。现在,例如,如果两列是-Bill_ID和Bill_A

  • 问题内容: 我想使用串行com端口进行通信,并且每次调用read函数调用时都想实现超时。 编辑: 我正在使用Linux OS。如何使用选择函数调用实现? 问题答案: select()有5个参数,首先是最高的文件描述符+ 1,然后是fd_set用于读取,一个用于写入,一个用于异常。最后一个参数是struct timeval,用于超时。错误时返回-1,超时时返回0或设置的集合中文件描述符的数量。