2

我正在使用 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);
4

1 回答 1

6

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

INFO [ScheduledTasks:1] 2014-05-15 23:19:49,678 GCInspector.java (line 116) GC for ConcurrentMarkSweep: 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.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

希望这可以帮助。

于 2015-01-09T18:16:59.787 回答