8

Tengo un sitio web ejecutándose en Amazon Web Services que se implementa con Elastic Beanstalk y se ejecuta en un mínimo de 2 instancias micro EC2. Se ha implementado una política de escalado automático, de modo que puede ampliarse y reducirse según el tráfico en el sitio web. Debido a esta política de escalado automático, quería evitar el uso de sesiones fijas y por esa razón estoy usando memcached-session-manager. Estoy usando Amazon ElastiCache (pequeña instancia) para el servidor memcached.memcached-session-manager en AWS

La configuración en el context.xml es el siguiente:

<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager" 
    memcachedNodes="sessions.myinstancecode.0001.use1.cache.amazonaws.com:11211" 
    sticky="false" 
    sessionBackupAsync="false" 
    lockingMode="none" 
    transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory" /> 

Esto funciona bien cuando el tráfico es bajo (es decir, menos de 10 usuarios en línea), pero a veces hace que la instancia EC2 para reiniciar. Puedes imaginar que si el sitio web se está ejecutando actualmente en dos instancias y ambos deciden reiniciarse al mismo tiempo, el sitio web se vuelve inalcanzable y es un gran problema. Estas son las últimas líneas en el tail_catalina.log que se gira en Amazon S3 antes de la instancia EC2 decide reiniciar:

Jun 13, 2012 12:32:27 AM de.javakaffee.web.msm.BackupSessionTask handleException 
WARNING: Could not store session 42F9761AC24F826E1FC3F2A834FBF442 in memcached. 
Note that this session was relocated to this node because the original node was not available. 
net.spy.memcached.internal.CheckedOperationTimeoutException: Timed out waiting for operation - failing node: sessions.myinstancecode.0001.use1.cache.amazonaws.com/10.194.23.99:11211 
    at net.spy.memcached.internal.OperationFuture.get(OperationFuture.java:73) 
    at de.javakaffee.web.msm.BackupSessionTask.storeSessionInMemcached(BackupSessionTask.java:230) 
    at de.javakaffee.web.msm.BackupSessionTask.doBackupSession(BackupSessionTask.java:195) 
    at de.javakaffee.web.msm.BackupSessionTask.call(BackupSessionTask.java:120) 
    at de.javakaffee.web.msm.BackupSessionTask.call(BackupSessionTask.java:51) 
    at de.javakaffee.web.msm.BackupSessionService$SynchronousExecutorService.submit(BackupSessionService.java:339) 
    at de.javakaffee.web.msm.BackupSessionService.backupSession(BackupSessionService.java:198) 
    at de.javakaffee.web.msm.MemcachedSessionService.backupSession(MemcachedSessionService.java:967) 
    at de.javakaffee.web.msm.SessionTrackerValve.backupSession(SessionTrackerValve.java:226) 
    at de.javakaffee.web.msm.SessionTrackerValve.invoke(SessionTrackerValve.java:128) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98) 
    at org.apache.catalina.valves.RemoteIpValve.invoke(RemoteIpValve.java:680) 
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:928) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407) 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:987) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:539) 
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:298) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) 
    at java.lang.Thread.run(Thread.java:636) 
Jun 13, 2012 12:32:28 AM de.javakaffee.web.msm.LockingStrategy onAfterBackupSession 
WARNING: An error occurred during onAfterBackupSession. 
net.spy.memcached.internal.CheckedOperationTimeoutException: Timed out waiting for operation - failing node: sessions.myinstancecode.0001.use1.cache.amazonaws.com/10.194.23.99:11211 
    at net.spy.memcached.internal.OperationFuture.get(OperationFuture.java:73) 
    at de.javakaffee.web.msm.LockingStrategy.onAfterBackupSession(LockingStrategy.java:287) 
    at de.javakaffee.web.msm.MemcachedSessionService.backupSession(MemcachedSessionService.java:970) 
    at de.javakaffee.web.msm.SessionTrackerValve.backupSession(SessionTrackerValve.java:226) 
    at de.javakaffee.web.msm.SessionTrackerValve.invoke(SessionTrackerValve.java:128) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98) 
    at org.apache.catalina.valves.RemoteIpValve.invoke(RemoteIpValve.java:680) 
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:928) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407) 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:987) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:539) 
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:298) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) 
    at java.lang.Thread.run(Thread.java:636) 

Parece que el nodo Amazon ElastiCache está fallando, pero la cosa es que, comprobando en Amazon CloudWatch, puedo ver que la utilización de la CPU nunca superó el 8%. ¿Hay alguna razón por la que falla el nodo Amazon ElastiCache, a pesar de que no se estresa tanto? Además, ¿por qué Amazon decide reiniciar (o mejor: terminar e iniciar una nueva instancia) cuando el nodo Amazon ElastiChace falla?

Cualquier ayuda muy apreciada.

Gracias!

Respuesta

7

Debe aumentar la sessionBackupTimeout de memcached-session-manager, desde el documentation:

sessionBackupTimeout (opcional, por defecto 100)

El tiempo de espera en milisegundos después de que la copia de seguridad de una sesión se considera como fallando. Esta propiedad solo se evalúa si las sesiones son almacenadas sincrónicamente (configuradas a través de sessionBackupAsync). El valor predeterminado es de 100 milisegundos.

Cuestiones relacionadas