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

Cassandra在高IOPS运行5分钟后抛出NoHost可用性异常

皇甫鸿远
2023-03-14

我正在使用数据斯塔克斯卡桑德拉2.1驱动程序,并以~8000 IOPS的速率执行读/写操作。我使用池选项来配置我的会话,并使用单独的会话进行读取和写入,每个会话都连接到群集中的不同节点作为联系点。这在 5 分钟内工作正常,但在那之后我得到很多异常,例如:

失败原因:com.datastax.driver.core.exceptions.NoHostAvailableException:尝试查询的所有主机都失败(尝试:/10.0.1.123:9042(com.datastax.driver.core.TransportException:[/10.0.1.123:9042]连接已关闭),/10.0.1.56:9042(com.datastax.driver.core.exceptions.DriverException:尝试获取可用连接时超时(您可能希望增加每个主机连接的驱动程序数量)))

有人能帮我解决什么问题吗?

异常要求我增加每个主机的连接数,但是我可以为此参数设置多高的值?另外,我无法将Core连接PerHost设置为超过2,因为它会给我一个例外,说2是最大值。

这就是我创建每个读/写会话的方式。

   PoolingOptions poolingOpts = new PoolingOptions();
           poolingOpts.setCoreConnectionsPerHost(HostDistance.REMOTE, 2);
           poolingOpts.setMaxConnectionsPerHost(HostDistance.REMOTE, 200);
           poolingOpts.setMaxSimultaneousRequestsPerConnectionThreshold(HostDistance.REMOTE, 128);
           poolingOpts.setMinSimultaneousRequestsPerConnectionThreshold(HostDistance.REMOTE, 2);
           cluster = Cluster
             .builder()
             .withPoolingOptions( poolingOpts )
             .addContactPoint(ip)
             .withRetryPolicy( DowngradingConsistencyRetryPolicy.INSTANCE )
             .withReconnectionPolicy( new ConstantReconnectionPolicy( 100L ) ).build();
           Session s =  cluster.connect(keySpace);

共有1个答案

湛玄裳
2023-03-14

您的问题可能不在您的代码或连接方式中。如果您说问题在几分钟后发生,那么很可能是您的集群在尝试处理数据摄取时变得过载,无法跟上。典型的迹象是当您开始在cassandra系统中看到JVM垃圾收集“GC”消息时。日志文件中,太多的小客户机和大客户机单独批处理在一起可能意味着传入的客户机没有响应导致这种情况。在开始查看代码之前,请先确认日志中没有显示太多这些事件。下面是一个大型GC事件的好例子:

INFO[scheduled tasks:1]2014-05-15 23:19:49,678 GCInspector.java(第116行)GC for concurrent mark sweep:2896 ms for 2 collections,310563800 used马克斯是8375238656

当连接到一个集群时,有一些建议,其中之一是每个真实集群只有一个集群对象。根据我在下面链接的文章(如果你已经研究过,请道歉):

  • 每个(物理)群集(每个应用程序生存期)使用一个群集实例
  • 每个密钥空间最多使用一个会话实例,或者使用单个会话并在查询中显式指定密钥空间
  • 如果多次执行语句,请考虑使用准备好的语句
  • 通过使用批处理,您可以减少网络往返次数,也可以进行原子操作

http://www.datastax.com/documentation/developer/java-driver/2.1/java-driver/fourSimpleRules.html

由于您正在进行大量读取,如果setFetchSize适用于您的代码,我绝对建议您使用它

http://www.datastax.com/documentation/developer/java-driver/2.1/common/drivers/reference/cqlStatements.html

http://www . datas tax . com/documentation/developer/Java-driver/2.1/Java-driver/reference/query builder overview . html

这里有一些连接选项供参考,如果你觉得有用的话。

http://www . datastax . com/documentation/developer/Java-driver/2.1/common/drivers/reference/connections options _ c . html

希望这有所帮助。

 类似资料:
  • 问题内容: 我有要求在5分钟内运行一会儿循环。我寻找了计时器api,但找不到这样做。任何人都可以为此提供代码摘要。 谢谢 问题答案: 最简单的方法是只检查每次迭代已花费了多少时间。例: 这将运行循环,直到超过5分钟为止。 笔记: 当前循环迭代将始终完成,因此在实践中它将始终运行5分钟以上。 对于此应用程序而言,它比之更合适,因为如果调整了计算机的系统时钟,后者将发生变化,从而使计算工作中断。 感谢

  • 我想写一个应用程序,将5个字符串(与文件资产相关)写入卡桑德拉。我根据数据斯塔克斯文档中的教程编写了代码。它可以工作大约 30 秒,进行几百次插入,但崩溃并出现错误: 该过程仍在运行,我可以重新运行单元测试,并得到相同的结果:几百次插入,然后出现这个错误。服务器没有显示出任何故障或错误的迹象。 我正在使用驱动程序: 这是我的客户端代码: 我正在我的本地主机上运行卡桑德拉2.0.9(带有固态驱动器和

  • 问题内容: 因此,我想尝试一下Timer和TimerTask类。 30秒过后,我能够执行一行代码。我现在一直想做的是让这行代码执行5分钟。 这是我最初尝试的 我在for循环中使用了数字10,以查看timer.schedule在循环的下一次迭代期间是否还要再等待30秒。 知道我应该怎么做吗?我尝试将schedule方法与传入参数period一起使用,但这只是使其重新执行而从未停止过。 问题答案: 您

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

  • 我只想花半个小时尝试Spring的roo - 但失败了。 spring.io 上的Spring roo项目页面只是告诉添加一个maven依赖项。但我不知道有任何公共专家存储库提供它 github上的项目页面包含所有源代码,但自述文件开头为 这些说明针对希望开发Spring Roo本身的经验丰富的开发人员。如果您是Spring Roo的新手[…]我们建议您访问Spring Roo主页并下载官方版本:

  • 我正在尝试使用Spring连接到支持SSL的Cassandra。我已收到密钥库和信任库文件及其各自的密码。使用DevCenter工具,我能够使用这些文件和凭据连接到远程数据库。然而,当我尝试使用java进行连接时,我不断遇到以下异常: 客户端身份验证似乎未正确通过。 使用以下代码: