Astyanax 不遵守配置的套接字超时
Astyanax not respecting configured socket timeout
这是我的设置:
- 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.execute(ThriftColumnFamilyQueryImpl.java:190) ~[astyanax-thrift-1.56.49.jar:na]
at com.netflix.astyanax.thrift.ThriftColumnFamilyQueryImpl.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.execute(ThriftColumnFamilyQueryImpl.java:180) ~[astyanax-thrift-1.56.49.jar:na]
异常消息显示 "latency=10001",我认为这应该是配置为 15000 毫秒的套接字超时,但显然不是。如何增加 astyanax 中查询操作的超时时间?
我相信您遇到的不是套接字超时,而是我认为无法通过 Astyanax 控制的 rpc 超时。在您的堆栈跟踪中,包裹在 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
重新启动服务器并再次尝试执行查询。
我在尝试查询具有更大数据的节点时遇到了类似的超时异常。我在 cassandra.yaml 中修改了这 4 个值,它解决了所有超时错误。
协调器等待读取操作完成的时间
read_request_timeout_in_ms: 15000
协调器应等待 seq 或索引扫描完成多长时间
range_request_timeout_in_ms: 30000
协调器等待写入完成的时间
write_request_timeout_in_ms: 30000
协调器应等待计数器写入完成的时间
counter_write_request_timeout_in_ms: 15000
注意:您需要在集群中的所有节点中执行此操作,并且还需要在所有节点中重新启动 Cassandra。
这是我的设置:
- 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.execute(ThriftColumnFamilyQueryImpl.java:190) ~[astyanax-thrift-1.56.49.jar:na]
at com.netflix.astyanax.thrift.ThriftColumnFamilyQueryImpl.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.execute(ThriftColumnFamilyQueryImpl.java:180) ~[astyanax-thrift-1.56.49.jar:na]
异常消息显示 "latency=10001",我认为这应该是配置为 15000 毫秒的套接字超时,但显然不是。如何增加 astyanax 中查询操作的超时时间?
我相信您遇到的不是套接字超时,而是我认为无法通过 Astyanax 控制的 rpc 超时。在您的堆栈跟踪中,包裹在 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
重新启动服务器并再次尝试执行查询。
我在尝试查询具有更大数据的节点时遇到了类似的超时异常。我在 cassandra.yaml 中修改了这 4 个值,它解决了所有超时错误。
协调器等待读取操作完成的时间 read_request_timeout_in_ms: 15000
协调器应等待 seq 或索引扫描完成多长时间 range_request_timeout_in_ms: 30000
协调器等待写入完成的时间 write_request_timeout_in_ms: 30000
协调器应等待计数器写入完成的时间 counter_write_request_timeout_in_ms: 15000
注意:您需要在集群中的所有节点中执行此操作,并且还需要在所有节点中重新启动 Cassandra。