我们正在Apache Cassandra-v3.0.9
使用com.datastax.cassandra:cassandra-driver-core:3.1.3
。我们的应用程序始终运行良好,但一周一次,我们开始从应用程序中获得以下异常:
com.datastax.driver.core.exceptions.OperationTimedOutException: [xxx.xx.xx.xx/xxx.xx.xx.xx:9042] Timed out waiting for server response
at com.datastax.driver.core.exceptions.OperationTimedOutException.copy(OperationTimedOutException.java:44)
at com.datastax.driver.core.exceptions.OperationTimedOutException.copy(OperationTimedOutException.java:26)
at com.datastax.driver.core.DriverThrowables.propagateCause(DriverThrowables.java:37)
at com.datastax.driver.core.ChainedResultSetFuture.getUninterruptibly(ChainedResultSetFuture.java:62)
at com.datastax.driver.core.NewRelicChainedResultSetFuture.getUninterruptibly(NewRelicChainedResultSetFuture.java:11)
at com.datastax.driver.core.AbstractSession.execute(AbstractSession.java:68)
at com.til.cms.graphdao.cassandra.dao.generic.CassandraICMSGenericDaoImpl.getCmsEntityMapForLimitedSize(CassandraICMSGenericDaoImpl.java:2824)
.....
Caused by: com.datastax.driver.core.exceptions.OperationTimedOutException: [xxx.xx.xx.xx/xxx.xx.xx.xx:9042] Timed out waiting for server response
at com.datastax.driver.core.RequestHandler$SpeculativeExecution.onTimeout(RequestHandler.java:770)
at com.datastax.driver.core.Connection$ResponseHandler$1.run(Connection.java:1374)
at io.netty.util.HashedWheelTimer$HashedWheelTimeout.expire(HashedWheelTimer.java:581)
at io.netty.util.HashedWheelTimer$HashedWheelBucket.expireTimeouts(HashedWheelTimer.java:655)
at io.netty.util.HashedWheelTimer$Worker.run(HashedWheelTimer.java:367)
at io.netty.util.concurrent.DefaultThreadFactory$DefaultRunnableDecorator.run(DefaultThreadFactory.java:145)
这些应用程序正在访问Cassandra数据中心以获取读取请求。数据中心由5个物理服务器组成,每个服务器有2个磁盘,64 GB RAM,40个核心,16 GB堆栈,带有G1 GC。
根据我们的调查,Cassandra服务器没有问题,例如没有平均负载/ iowait增加,gc暂停或nodetool / cqlsh连接等。我们刚开始在应用程序日志中获取这些异常,直到我们重新启动Cassandra服务器。数据中心中的不同Cassandra服务器随机报告此异常,我们不得不重新启动它们。在正常时间,这些Cassandra服务器服务器中的每一个 10K读取请求/秒,并且几乎 10次写入请求/秒。当我们遇到此问题时,读取请求会显着影响到2-3 K /秒。
我们的cassandra数据中心的复制因子是3,以下是我们建立连接的方式
Cluster.builder()
.addContactPoints(nodes)
.withQueryOptions(new QueryOptions().setConsistencyLevel(ConsistencyLevel.LOCAL_ONE))
.withLoadBalancingPolicy(DCAwareRoundRobinPolicy.builder().withLocalDc(localDatacenter).build())
.withSpeculativeExecutionPolicy(PerHostPercentileTracker.builder(13000).build())
.build()
修改
我们在开始获取这些异常之前已经观察到,我们在java应用程序中获得了以下WARN
级异常。
2018-04-03 23:40:06,456 WARN [cluster1-timeouter-0] com.datastax.driver.core.RequestHandler [RequestHandler.java:805]不是 重试语句,因为它不是幂等的(此消息将是 只记录一次)。请注意,此版本的驱动程序会更改 非幂等语句的默认重试行为:它们不会成功 自动重试。驱动程序标记语句 默认情况下是非幂等的,所以你应该明确调用 setIdempotent(true)如果您的语句可以安全重试。看到 https://docs.datastax.com/en/developer/java-driver/3.1/manual/retries/了解更多详情。
2018-04-04 00:04:24,856 WARN [cluster1-nio-worker-2] com.datastax.driver.core.PercentileTracker [PercentileTracker.java:108]请求延迟为16632毫秒, 超过配置的最大可跟踪值13000
2018-04-04 00:04:24,858 WARN [cluster1-timeouter-0] com.datastax.driver.core.PercentileTracker [PercentileTracker.java:108]请求延迟为16712毫秒, 超过配置的最大可跟踪值13000