Astyanax不尊重配置的套接字超时时间。

4

这是我的设置:

  • 4个节点的Cassandra 1.2.19
  • Astyanax 1.56.49

我正在进行配置,如下所示:

AstyanaxContext<Keyspace> context = new AstyanaxContext.Builder()
    .forCluster(service.getClusterName())
    .forKeyspace(service.getKeySpaceName())
    .withAstyanaxConfiguration(new AstyanaxConfigurationImpl()
         .setDiscoveryType(NodeDiscoveryType.NONE)
         .setCqlVersion("3.0.0")
         .setDefaultReadConsistencyLevel(consistencyLevel.getAstyanaxValue())
         .setDefaultWriteConsistencyLevel(consistencyLevel.getAstyanaxValue())
    )
    .withConnectionPoolConfiguration(new ConnectionPoolConfigurationImpl("b2bConnectionPool")
         .setPort(service.getPort())
         .setMaxConnsPerHost(5)
         .setSeeds(StringUtils.join(hosts, ","))
         // increase default timeout for heavy operations (milliseconds)
         .setSocketTimeout(15000)
         .setSSLConnectionContext(sslContext)
         .setAuthenticationCredentials(credentials)
    )
    .withConnectionPoolMonitor(new CountingConnectionPoolMonitor())
    .buildKeyspace(ThriftFamilyFactory.getInstance());

现在有一个可重复的查询需要很长时间,最后会抛出OperationTimeoutException异常:

com.netflix.astyanax.connectionpool.exceptions.OperationTimeoutException: OperationTimeoutException: [host=myhost(myip):13260, latency=10001(40007), attempts=4]TimedOutException()
    at com.netflix.astyanax.thrift.ThriftConverter.ToConnectionPoolException(ThriftConverter.java:171) ~[astyanax-thrift-1.56.49.jar:na]
    at com.netflix.astyanax.thrift.AbstractOperationImpl.execute(AbstractOperationImpl.java:65) ~[astyanax-thrift-1.56.49.jar:na]
    at com.netflix.astyanax.thrift.ThriftColumnFamilyQueryImpl$1$2.execute(ThriftColumnFamilyQueryImpl.java:190) ~[astyanax-thrift-1.56.49.jar:na]
    at com.netflix.astyanax.thrift.ThriftColumnFamilyQueryImpl$1$2.execute(ThriftColumnFamilyQueryImpl.java:182) ~[astyanax-thrift-1.56.49.jar:na]
    at com.netflix.astyanax.thrift.ThriftSyncConnectionFactoryImpl$ThriftConnection.execute(ThriftSyncConnectionFactoryImpl.java:151) ~[astyanax-thrift-1.56.49.jar:na]
    at com.netflix.astyanax.connectionpool.impl.AbstractExecuteWithFailoverImpl.tryOperation(AbstractExecuteWithFailoverImpl.java:119) ~[astyanax-core-1.56.49.jar:na]
    at com.netflix.astyanax.connectionpool.impl.AbstractHostPartitionConnectionPool.executeWithFailover(AbstractHostPartitionConnectionPool.java:338) ~[astyanax-core-1.56.49.jar:na]
    at com.netflix.astyanax.thrift.ThriftColumnFamilyQueryImpl$1.execute(ThriftColumnFamilyQueryImpl.java:180) ~[astyanax-thrift-1.56.49.jar:na]

异常信息显示“latency=10001”,我认为这应该是配置为15000毫秒的套接字超时,但显然不是。在astyanax中如何增加查询操作的超时时间?

我无法在cqlsh中重现问题,但可以利用一个小的Java程序重现查询。我将尝试应答中提到的配置更改,并在之后给出反馈。 - Steffen Harbich
增加超时时间(请参见答案)解决了问题。 - Steffen Harbich
2个回答

1
当尝试查询大量数据的节点时,我遇到了类似的超时异常。我在cassandra.yaml中修改了以下4个值,解决了所有的超时错误。
读操作完成前,协调器应等待多长时间: read_request_timeout_in_ms: 15000
序列或索引扫描完成前,协调器应等待多长时间: range_request_timeout_in_ms: 30000
写入完成前,协调器应等待多长时间: write_request_timeout_in_ms: 30000
计数器写入完成前,协调器应等待多长时间: counter_write_request_timeout_in_ms: 15000
注意:您需要在集群中的所有节点上进行此操作,并且还需要在所有节点上重新启动Cassandra。

谢谢你的回答。我会尝试一下。 - Steffen Harbich

1
我相信你遇到的不是套接字超时,而是rpc超时,我认为无法通过Astyanax来控制。在你的堆栈跟踪中,OperationTimeoutException内部包装的异常是TimedOutException,当rpc超时发生(默认10秒)时抛出。如果是套接字超时,则会抛出SocketTimeoutException

尝试使用cqlsh执行查询,你将得到一个Request did not complete within rpc_timeout消息。

在你的<cassandra_home>/conf/cassandra.yaml文件中,尝试设置:

read_request_timeout_in_ms: 20000
rpc_timeout_in_ms: 20000

重新启动您的服务器,然后再次尝试查询执行。


谢谢你的回答。我会尝试一下。 - Steffen Harbich

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接