【问题标题】:Cassandra throwing NoHostAvailableException after 5 minutes of high IOPS runCassandra 在高 IOPS 运行 5 分钟后抛出 NoHostAvailableException
【发布时间】:2015-02-23 18:47:50
【问题描述】:

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

【问题讨论】:

    标签: cassandra datastax cassandra-cli


    【解决方案1】:

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

    INFO [ScheduledTasks:1] 2014-05-15 23:19:49,678 GCInspector.java(第 116 行)用于 ConcurrentMarkSweep 的 GC:2896 毫秒用于 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

    希望这会有所帮助。

    【讨论】:

    • 我有完全相同的问题,但我无法访问代码。我在 Cassandra 上使用 Hadoop,我不知道如何传递 fetchSzie 以供驱动程序使用(由 Hadoop 的 Cassandra 实现使用。你知道是否有一个属性可以用来设置 fetchSize用代码来做吗??
    • 不,不幸的是,它需要在代码中设置或编写的代码从可在运行时配置的属性文件中提取此 fetchsize
    • 我发现这是 cassandra stackoverflow.com/a/30322318/1314742987654325@2.0.10 版本的问题
    猜你喜欢
    • 2015-05-18
    • 2019-02-25
    • 1970-01-01
    • 1970-01-01
    • 2015-05-07
    • 1970-01-01
    • 1970-01-01
    • 2019-03-14
    • 2018-01-18
    相关资源
    最近更新 更多