【问题标题】:NoHostAvailableException with 1000 concurrent request to Cassandra with DataStax Java DriverNoHostAvailableException 与 DataStax Java 驱动程序对 Cassandra 的 1000 个并发请求
【发布时间】:2014-09-09 09:53:54
【问题描述】:

设置:

-2-node Cassandra 2.0.7.31 集群
-replicas=1
- 使用默认配置
-使用DataStax java驱动1.0

活动 使用 QueyBuilder 类的简单插入查询

结果

com.datastax.driver.core.exceptions.NoHostAvailableException: All host(s) tried for query failed (tried: /10.181.13.239 ([/10.181.13.239] Unexpected exception triggered))
            at com.datastax.driver.core.exceptions.NoHostAvailableException.copy(NoHostAvailableException.java:64)
            at com.datastax.driver.core.ResultSetFuture.extractCauseFromExecutionException(ResultSetFuture.java:214)
            at com.datastax.driver.core.ResultSetFuture.getUninterruptibly(ResultSetFuture.java:169)
            at com.jpmc.es.rtm.storage.impl.EventExtract.main(EventExtract.java:36)
            at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
            at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
            at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
            at java.lang.reflect.Method.invoke(Method.java:601)
            at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)
Caused by: com.datastax.driver.core.exceptions.NoHostAvailableException: All host(s) tried for query failed (tried: /10.181.13.239 ([/10.181.13.239] Unexpected exception triggered))
            at com.datastax.driver.core.RequestHandler.sendRequest(RequestHandler.java:98)
            at com.datastax.driver.core.RequestHandler$1.run(RequestHandler.java:165)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)

【问题讨论】:

  • 你能使用 cassandra-cli 连接到 cassandra 服务器吗?
  • 是的。对于 1000 个并发命中,我得到大约 85 TPS 的 upsert 。但我对 Cassandra 对 TPS 有更多的期望。我很困惑的是,datastax 驱动程序正在减慢整个过程的速度吗?

标签: java cassandra datastax-java-driver


【解决方案1】:

问题是我最终创建了一个线程一个连接模型。这是相当同步的。但是 Datstax 驱动程序异步工作(我猜它使用 netty)并在单个连接上接受多个请求。所以在我的情况下,我为每个请求一个会话,你猜怎么着?我留下了开放连接池 b/w Driver 和 Cassandra。服务器被阻塞了,驱动程序也被阻塞了。只需让 Driver 管理其池即可解决问题。

Datastax java 驱动程序默认维护最小连接数量来处理一定数量的并发请求。
Spec说驱动程序有一个限制,每个连接最多处理128个请求。所以当我们的驱动程序发现超过128个请求即将到来时,它只会打开连接。所以驱动程序很好地管理连接池。[http://www.datastax.com/drivers/java/2.0/com/datastax/driver/core/PoolingOptions.html]这个链接很有帮助

【讨论】:

    【解决方案2】:

    转到您的 cassandra.yaml 文件。它将出现在您的 cassandra 安装的 conf 文件夹中。

    对于 listen_address 给出 cassandra 服务器的 IP 地址。例如。

    listen_address: 10.181.13.239
    

    然后重新启动 cassandra 服务器。还要检查本机传输的端口未注释。应该有一个类似的条目

    native_transport_port: 9042
    

    【讨论】:

    • 嗨,约翰,谢谢您的回复。它适用于 1000 个或更少的客户端。
    • 实际上我想在 Cassandra 上执行基准测试。我正在尝试配置 Cassandra,以便它可以给我很好的 TPS。我正在使用 dataStax java 驱动程序作为客户端。
    • 我正在使用类似的环境,使用更复杂的事务可以轻松达到 > 10,000 TPS。您应该检查 Cassandra 实例上的 CPU 和内存使用情况,看看您是否遇到了问题。另外,Datastax Driver 已经是 2.0.3 版本,我会认真考虑升级。
    • HI @Baldy 实际上我并没有更改太多 Cassandra.yaml 和集群名称和 IPS。我正在使用配置 Intel Xeon 2 * 四核/64 GB RAM/800 GB*6 HDD 的两台服务器。
      我需要更改 Cassandra.yaml 上默认配置中的任何内容吗?
    • 我根本没有更改任何与性能相关的默认值。如果不深入了解您的环境,就很难诊断出性能问题。我会升级到最新的 Datastax 驱动程序并重新运行您的测试。有一个可用的cassandra-stress 工具可以帮助消除驱动程序作为您的性能瓶颈。
    猜你喜欢
    • 2018-01-18
    • 2016-09-06
    • 2015-05-18
    • 1970-01-01
    • 2019-02-25
    • 2014-09-28
    • 2018-02-15
    • 2015-10-25
    • 2021-02-09
    相关资源
    最近更新 更多