2016-08-08 1 views
4

Это моя установка:Astyanax не уважая сконфигурированный сокетов тайм-аут

  • 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] 

Сообщение об исключении говорит «задержка = 10001», и я подумал, что это должно быть гнездо таймаут настроен на 15000 мс, но это явно не так. Как увеличить тайм-аут для операции запроса в astyanax?

+0

Я не мог воспроизвести проблему с помощью cqlsh, но я мог бы воспроизвести запрос с помощью небольшой java-программы. Я попробую изменить конфигурацию, упомянутую в ответах, и дать обратную ссылку. –

+0

Увеличение таймаутов (см. Ответы) сделало трюк. –

ответ

1

Я получал подобное исключение таймаута при попытке запросить узлы с большими данными. Я изменил эти 4 значения в cassandra.yaml и разрешил все ошибки таймаута.

Как долго координатор должен ждать операции чтения, чтобы завершить 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

Примечание: Вы должны сделать это во всех узлах кластера, а также необходимо перезапустить Кассандру во всех из них.

+0

Thx для вашего ответа. Я попробую. –

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 

Перезапустите сервер и попробуйте еще раз выполнение запроса.

+0

Thx для вашего ответа. Я попробую. –