8

Ho un sito Web in esecuzione su Amazon Web Services che viene distribuito utilizzando Elastic Beanstalk e viene eseguito su un minimo di 2 istanze micro EC2. È in atto una politica di ridimensionamento automatico, in modo che possa scalare e ridimensionare in base al traffico nel sito Web. A causa di questa politica di ridimensionamento automatico, volevo evitare di usare sessioni appiccicose e per questo motivo sto usando memcached-session-manager. Sto usando Amazon ElastiCache (piccola istanza) per il server memcached.memcached-session-manager su AWS

La configurazione nel context.xml è la seguente:

<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" /> 

Questo funziona bene quando il traffico è basso (vale a dire meno di 10 utenti in linea), ma a volte causa l'istanza EC2 per riavviare. Potete immaginare che se il sito web è attualmente in esecuzione su due istanze e entrambi decidono di riavviarsi contemporaneamente, il sito Web diventa irraggiungibile ed è un grosso problema. Queste sono le ultime righe del tail_catalina.log che viene ruotato su Amazon S3 prima che l'istanza EC2 decide di riavviare:

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) 

Sembra che il nodo Amazon ElastiCache sta fallendo, ma la cosa è che, il controllo su Amazon CloudWatch, posso vedere che l'utilizzo della CPU non è mai andato oltre l'8%. C'è qualche ragione per cui il nodo Amazon ElastiCache fallisce, anche se non viene sottolineato così tanto? Inoltre, perché Amazon decide di riavviare (o meglio: terminare e avviare una nuova istanza) quando il nodo Amazon ElastiChace fallisce?

Qualsiasi aiuto molto apprezzato.

Grazie!

risposta

7

Si dovrebbe aumentare l'sessionBackupTimeout di memcached-session-manager, dal documentation:

sessionBackupTimeout (opzionale, default 100)

il timeout in millisecondi dopo che il backup di una sessione è considerato come essere fallito Questa proprietà viene valutata solo se le sessioni sono memorizzate in modo sincrono (impostate tramite sessionBackupAsync). Il valore predefinito è 100 millisecondi.