Тайм-аут прокси-API для API-ключа из-за проблемы с соединением Cassandra

Буду признателен за помощь в определении и решении этого:

Я получаю частые периоды, когда все Proxy API зависают и трассировка показывает "???" для кода состояния HTTP для запросов, и я получаю этот ответ через 30 секунд:

 Status Code: 504 Gateway Timeout 
 Content-Length: 177 
 Content-Type: text/xml; charset=UTF-8 

<?xml version='1.0' encoding='UTF-8'?><fault><faultstring>The Service is temporarily unavailable</faultstring><detail><errorcode>SERVICE_UNAVAILABLE</errorcode></detail></fault> 

Вот что я вижу в system.log для всех трех серверов Cassandra

>     2014-04-01 14:29:20,124 org: env: Apigee-Main-36 ERROR m.p.c.c.c.HThriftClient - HThriftClient.close() : Could not flush
> transport (to be expected if the pool is shutting down) in close for
> client: CassandraClient<10.49.192.52:9160-829>
>     org.apache.thrift.transport.TTransportException: java.net.SocketException: Broken pipe
>       at org.apache.thrift.transport.TIOStreamTransport.write(TIOStreamTransport.java:147)
> ~[libthrift-0.7.0.jar:0.7.0]
>       at org.apache.thrift.transport.TFramedTransport.flush(TFramedTransport.java:156)
> ~[libthrift-0.7.0.jar:0.7.0]
>       at me.prettyprint.cassandra.connection.client.HThriftClient.close(HThriftClient.java:125)
> [hector-core-1.1-3.jar:na]
>       at me.prettyprint.cassandra.connection.client.HThriftClient.close(HThriftClient.java:38)
> [hector-core-1.1-3.jar:na]
>       at me.prettyprint.cassandra.connection.HConnectionManager.closeClient(HConnectionManager.java:325)
> [hector-core-1.1-3.jar:na]
>       at me.prettyprint.cassandra.connection.HConnectionManager.operateWithFailover(HConnectionManager.java:273)
> [hector-core-1.1-3.jar:na]
>       at me.prettyprint.cassandra.model.ExecutingKeyspace.doExecuteOperation(ExecutingKeyspace.java:113)
> [hector-core-1.1-3.jar:na]
>       at me.prettyprint.cassandra.service.template.ThriftColumnFamilyTemplate.sliceInternal(ThriftColumnFamilyTemplate.java:88)
> [hector-core-1.1-3.jar:na]
>       at me.prettyprint.cassandra.service.template.ThriftColumnFamilyTemplate.doExecuteSlice(ThriftColumnFamilyTemplate.java:46)
> [hector-core-1.1-3.jar:na]
>       at me.prettyprint.cassandra.service.template.ColumnFamilyTemplate.queryColumns(ColumnFamilyTemplate.java:113)
> [hector-core-1.1-3.jar:na]
>       at com.apigee.datastore.client.CassandraClient.get(CassandraClient.java:169)
> [datastore-1.0.0.jar:na]
>       at com.apigee.keymanagement.dao.nosql.impl.AppDaoImpl.getCredential(AppDaoImpl.java:123)
> [keymanagement-1.0.0.jar:na]
>       at com.apigee.keymanagement.dao.nosql.impl.AppDaoImpl.getConsumerKeyStatus(AppDaoImpl.java:77)
> [keymanagement-1.0.0.jar:na]
>       at com.apigee.keymanagement.util.ResourceUtil.validateConsumerKey(ResourceUtil.java:490)
> [keymanagement-1.0.0.jar:na]
>       at com.apigee.keymanagement.util.ResourceUtil.validateConsumerKey(ResourceUtil.java:475)
> [keymanagement-1.0.0.jar:na]
>       at com.apigee.keymanagement.util.ResourceUtil.getConsumerDetails(ResourceUtil.java:526)
> [keymanagement-1.0.0.jar:na]
>       at com.apigee.keymanagement.util.ResourceUtil.getConsumerDetailsForApiKey(ResourceUtil.java:596)
> [keymanagement-1.0.0.jar:na]
>       at com.apigee.keymanagement.service.OAuth2RuntimeServiceImpl.getConsumerForApiKey(OAuth2RuntimeServiceImpl.java:81)
> [keymanagement-1.0.0.jar:na]
>       at com.apigee.oauth.v2.connectors.LocalOAuthServiceConnector.getClientAttributesForApiKey(LocalOAuthServiceConnector.java:173)
> [oauthV2-1.0.0.jar:na]
>       at com.apigee.oauth.v2.OAuthServiceImpl.getClientAttributesForApiKey(OAuthServiceImpl.java:506)
> [oauthV2-1.0.0.jar:na]
>       at com.apigee.steps.oauth.v2.OAuthStepExecution.execute(OAuthStepExecution.java:401)
> [oauthV2-1.0.0.jar:na]
>       at com.apigee.messaging.runtime.steps.StepExecution.execute(StepExecution.java:97)
> [message-processor-1.0.0.jar:na]
>       at com.apigee.flow.execution.AsyncExecutionStrategy$AsyncExecutionTask.call(AsyncExecutionStrategy.java:69)
> [message-flow-1.0.0.jar:na]
>       at com.apigee.flow.execution.AsyncExecutionStrategy$AsyncExecutionTask.call(AsyncExecutionStrategy.java:51)
> [message-flow-1.0.0.jar:na]
>       at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
> [na:1.6.0_32]
>       at java.util.concurrent.FutureTask.run(FutureTask.java:138) [na:1.6.0_32]
>       at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441)
> [na:1.6.0_32]
>       at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
> [na:1.6.0_32]
>       at java.util.concurrent.FutureTask.run(FutureTask.java:138) [na:1.6.0_32]
>       at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
> [na:1.6.0_32]
>       at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
> [na:1.6.0_32]
>       at java.lang.Thread.run(Thread.java:662) [na:1.6.0_32]
>     Caused by: java.net.SocketException: Broken pipe
>       at java.net.SocketOutputStream.socketWrite0(Native Method) ~[na:1.6.0_32]
>       at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92)
> ~[na:1.6.0_32]
>       at java.net.SocketOutputStream.write(SocketOutputStream.java:136) ~[na:1.6.0_32]
>       at org.apache.thrift.transport.TIOStreamTransport.write(TIOStreamTransport.java:145)
> ~[libthrift-0.7.0.jar:0.7.0]
>       ... 31 common frames omitted
>     2014-04-01 14:29:20,126 org: env: Apigee-Main-36 ERROR m.p.c.c.HConnectionManager - HConnectionManager.markHostAsDown() :
> MARK HOST AS DOWN TRIGGERED for host 10.49.192.52(10.49.192.52):9160
>     2014-04-01 14:29:20,126 org: env: Apigee-Main-36 ERROR m.p.c.c.HConnectionManager - HConnectionManager.markHostAsDown() :
> Pool state on shutdown:
> <ConcurrentCassandraClientPoolByHost>:{10.49.192.52(10.49.192.52):9160};
> IsActive?: true; Active: 1; Blocked: 0; Idle: 2; NumBeforeExhausted: 9
>     2014-04-01 14:29:20,127 org: env: Apigee-Main-36 ERROR m.p.c.c.c.HThriftClient - HThriftClient.close() : Could not flush
> transport (to be expected if the pool is shutting down) in close for
> client: CassandraClient<10.49.192.52:9160-828>
>     org.apache.thrift.transport.TTransportException: java.net.SocketException: Connection timed out
>       at org.apache.thrift.transport.TIOStreamTransport.write(TIOStreamTransport.java:147)
> ~[libthrift-0.7.0.jar:0.7.0]
>       at org.apache.thrift.transport.TFramedTransport.flush(TFramedTransport.java:156)
> ~[libthrift-0.7.0.jar:0.7.0]
>       at me.prettyprint.cassandra.connection.client.HThriftClient.close(HThriftClient.java:125)
> [hector-core-1.1-3.jar:na]

2 ответа

Решение

Так как я платный клиент Apigee, я также открыл дело....

Первоначально они не были уверены, что существует функция поддержания активности или TTL-соединение, которое может вызвать сброс / восстановление соединения.

Вот что я получил обратно:

  1. Установите следующие значения на узлах маршрутизатора / обработчика сообщений: /proc/sys/net/ipv4/tcp_keepalive_time на 1800 секунд (30 минут).

Для этого: echo 1800 > /proc/sys/net/ipv4/tcp_keepalive_time

ВНИМАНИЕ: это изменение не сохраняется при перезагрузке, поэтому вы хотели бы отредактировать файл /etc/sysctl.conf и поместить его туда.

Затем выполните команду:

sysctl -p

чтобы эти значения загружались из этого файла.

Вы можете использовать следующее, чтобы проверить, обновилось ли значение

sysctl net.ipv4.tcp_keepalive_time

  1. перезапустите ваши процессоры сообщений.

Таким образом, исправление, которое было введено в действие, было проверкой активности в клиенте Hector в процессоре сообщений.

Зонд выполняет проверку активности на основе интервала, заданного в настройке ОС tcp_keepalive_time. Таким образом, причина для установки этого значения на 30 минут основана на настройке брандмауэра для времени простоя, составляющего 3600 секунд.

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

Это может произойти, когда на кассандре есть нагрузка, и она сама себя понизит.

Во время этого процесса он закроет свои соединения в пуле.

Пожалуйста, перезапустите процессоры сообщений, чтобы восстановить соединение.

Дайте мне знать, как это происходит.

С уважением, Jagjyot.

Другие вопросы по тегам