我通过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排除在"嫌疑人列表之外"。
如果有人有类似的话,我会很感激信息或建议。
答案 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;数据库连接通过多次创建超大型查询 - 它尽职尽责地报告内存错误 - 然后恢复。