在高IOPS运行5分钟后,Cassandra抛出NoHostAvailableException

时间:2014-12-26 12:52:51

标签: cassandra datastax cassandra-cli

我正在使用datastax cassandra 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:尝试获取可用连接时超时(您可能希望增加每个主机的驱动程序号)连接)))

任何人都可以帮我解决可能出现的问题吗?

异常要求我增加每个主机的连接数,但是我可以为此参数设置多高的值? 此外,我无法将CoreConnectionsPerHost设置为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 个答案:

答案 0 :(得分:6)

您的问题实际上可能不在您的代码或您连接的方式中。如果你说问题在几分钟后发生,那么可能只是你的集群正在变得过载,试图处理数据的摄取而无法跟上。这种情况的典型标志是当你开始在cassandra system.log文件中看到JVM垃圾收集“GC”消息时,过多的小型垃圾邮件集合在一起就会出现大的问题,这意味着传入的客户端没有响应导致这种情况。场景。在开始查看代码之前,请确保您的日志中没有显示太多此类事件。以下是大型GC事件的一个很好的例子:

  

INFO [ScheduledTasks:1] 2014-05-15 23:19:49,678 GCInspector.java(第116行)GC用于ConcurrentMarkSweep:2896 ms用于2个集合,310563800使用;最大值是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.datastax.com/documentation/developer/java-driver/2.1/java-driver/reference/queryBuilderOverview.html

如果您认为有用

,请参考连接选项

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

希望这有帮助。