我正在使用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);
答案 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
如果您认为有用
,请参考连接选项希望这有帮助。