Spring数据Cassandra驱动程序在几个小时后卡住了,同一节点上的单节点数据库

时间:2016-11-13 14:43:41

标签: java spring cassandra spring-data-cassandra

我通过spring-data-cassandra遇到Apache Cassandra数据库访问问题:

  • 有时服务器无法在开始时连接到数据库 - 通常它在第二次尝试中起作用
  • 一旦开始,每小时几次,在随机的时刻,很少 请求失败并超时,然后继续正常工作
  • 最后,几个小时后,司机开始一直拒绝 请求,报告超时 - 以及需要重新启动服务器

该应用程序是一个使用Spring Data Cassandra的小型Spring Boot(1.4.0)服务器应用程序(尝试过1.4.2和1.4.4)。应用程序从远程客户端收集数据,并基于服务器端的REST接口实现一些管理GUI,包括使用Spring @Scheduled任务每10秒准备一次的仪表板,并通过websocket协议向客户端(浏览器)提供数据。通过使用HTTPS和双边身份验证(服务器+客户端证书)来保护流量。

当前的应用程序状态正在使用数据库(2.2.8)进行测试,该数据库运行在具有Ubuntu 14.04 OS的同一云服务器(通过环回127.0.0.1地址连接)上运行。一些测试客户端创建负载,导致每小时插入大约300k数据库记录(50k主数据和5x50k详细记录),每5秒左右上传一次数据。仪表板正在拖曳最后一小时的流量并创建统计信息。 sar实用程序的平均CPU使用率约为10%。当前数据库大小约为25GB。

数据插入是小批量生成的 - 我也尝试过单独写入,但问题并没有消失,只是在单次写入测试时CPU使用率增加了大约50%。

我做了很多Google"研究"关于这个主题并没有发现什么具体的,但尝试了很多建议,例如将模式名称放在所有查询和几个配置选项中 - 显然对最终结果没有影响(阻止服务器需要重新启动)。服务器已经运行了大约30个小时左右,但有时会在1-2小时内被阻止,通常在驱动程序卡住之前运行7-10个小时,在运行期间没有明显的模式。

我一直在监视堆 - 没有什么特别值得注意的,没有数据结构随着时间的推移堆积起来。服务器使用-Xms2g -Xmx3g -XX:+ PrintGCDetails

运行

最终出现的错误是:

Caused by: com.datastax.driver.core.exceptions.NoHostAvailableException: All host(s) tried for query failed (tried: inpresec-cassandra/127.0.1.1:9042 (com.datastax.driver.core.OperationTimedOutException: [inpresec-cassandra/127.0.1.1:9042] Operation timed out))
        at com.datastax.driver.core.RequestHandler.reportNoMoreHosts(RequestHandler.java:217) ~[cassandra-driver-core-2.1.9.jar!/:na]
        at com.datastax.driver.core.RequestHandler.access$1000(RequestHandler.java:44) ~[cassandra-driver-core-2.1.9.jar!/:na]
        at com.datastax.driver.core.RequestHandler$SpeculativeExecution.sendRequest(RequestHandler.java:276) ~[cassandra-driver-core-2.1.9.jar!/:na]
        at com.datastax.driver.core.RequestHandler$SpeculativeExecution$1.run(RequestHandler.java:374) ~[cassandra-driver-core-2.1.9.jar!/:na]
        ... 3 common frames omitted

我还注意到,cassandra进程报告的虚拟内存大小大致与数据库的大小相匹配 - 当数据库大约12GB并且它一直忠实地遵循数据库大小时我注意到它 - 不确定它是否具有与服务器问题有关。数据库的常驻部分介于2到3GB之间。服务器的常驻部分通常为1.5-2.5GB。云服务器的总内存为8GB。

在主机VM OS中直接运行Cassandra之前,我在Docker中运行它并遇到同样的问题 - 离开Docker已经完成了将Docker排除在"嫌疑人列表之外"。

如果有人有类似的话,我会很感激信息或建议。

1 个答案:

答案 0 :(得分:0)

问题显然已经通过升级Netty并提供对epoll协议的支持而不是默认的NIO回退来解决。最初在pom.xml中有:

<dependency>
    <groupId>io.netty</groupId>
    <artifactId>netty-all</artifactId>
    <version>4.0.9.Final</version>
</dependency>

现在这已改为:

    <dependency>
        <groupId>io.netty</groupId>
        <artifactId>netty-all</artifactId>
        <version>4.0.29.Final</version>
    </dependency>

    <dependency>
        <groupId>io.netty</groupId>
        <artifactId>netty-transport-native-epoll</artifactId>
        <version>4.0.29.Final</version>
        <!-- Explicitly bring in the linux classifier, test may fail on 32-bit linux -->
        <classifier>linux-x86_64</classifier>
        <scope>test</scope>
    </dependency>

添加第二个规范以明确包含epoll支持,作为su here

此更改后,原始邮件显示在日志文件中:

com.datastax.driver.core.NettyUtil       : Did not find Netty's native epoll transport in the classpath, defaulting to NIO.

已变为:

com.datastax.driver.core.NettyUtil       : Found Netty's native epoll transport in the classpath, using it

此后一直没有随机失败 - 试过&#34; kill&#34;数据库连接通过多次创建超大型查询 - 它尽职尽责地报告内存错误 - 然后恢复。