2010-10-07 16 views
12

Actualmente tengo un gran problema. Hace dos días, mi sitio que se ejecutaba en un servidor era demasiado, así que compré dos más y los tuve agrupados (rsync y carga equilibrada).¿Cómo usar Memcache como una tienda de sesiones?

entonces empiezo a notar que un usuario golpearía server1 y luego en la siguiente solicitud golpeó servidor3 pero que su sesión fue todavía en server1 en lugar de servidor3 y ya no se ha autentificado.

Me recomendaron para usar Memcache para tiendas de sesión.

Mi secuencia de comandos ya usa $_SESSION.

  • podemos obtener Memcache instalado y habilitar el soporte de gestor de sesiones y establecer session.save_handler = "memcache" para forzar php para usar memcache?

  • ¿Hay alguna programación de aplicación que deba hacerse para usar Memcache?

  • ¿Esto resolverá mi sesión entre el problema del servidor?

  • ¿Los almacenes de sesión están almacenados en todos los servidores cuando se crean o es uno como un servidor maestro Memcache?

estoy usando el marco codeiginiter

Respuesta

2

Usted tendría que configurar Memcache para funcionar en uno de los servidores y tienen todos los servidores usar esa misma instancia Memcache para las sesiones. De lo contrario, si cada uno ejecuta su propia instancia de Memcache, tendrá el mismo problema que antes.

Aparte de configurar Memcache en consecuencia y decirle a PHP que lo use como su manejador de sesión, no debería tener que hacer ningún cambio en su código.

~

Para aclarar el consejo que dio aquí, si agrupa los tres servidores en un solo grupo, no tendrá ningún problema, siempre y cuando todos los casos PHP hace referencia a esos servidores en el mismo orden. Memcache usa client side hashing, por lo que se le garantiza que la misma clave se lee/escribe en el mismo servidor. Por supuesto, si altera esa lista de alguna manera, las sesiones quedarán invalidadas.

Los desarrolladores de Memcache en realidad ni siquiera recomiendan que use Memcache para almacenar datos de la sesión porque no es persistente, y si tiene que reiniciar Memcache (o sucede algo), entonces todos sus usuarios serán registrados fuera.

+0

¿Crees que dedicar 4 gb de memoria de nuestro servidor es suficiente?tenemos 24 gb cada servidor –

+1

Parece un número enorme, pero depende de la cantidad de sesiones simultáneas que tenga y de la cantidad de datos que almacene en ellas. Simplemente haciendo una lista de directorio de/tmp (o dondequiera que estén actualmente almacenados los archivos) debería darle una buena idea de cuán grandes son los datos de su sesión. Acabo de comprobar un sitio que ejecuto y usa ~ 1MB por 200 usuarios, con el tamaño de la sesión mediana solo de 85 bytes. Pero obviamente esos números solo son aplicables a ese sitio en particular. – Matthew

+1

Eek! Antigua como es, esta respuesta es completamente errónea y no entiende completamente cómo funciona Memcache. – Synchro

5

Las dos principales extensiones memcache PHP PECL tienen controladores de sesión. O requerirá que instale un módulo PECL antes de su uso.

El Memcache PECL gestor de sesiones de extensión está habilitado con la siguiente en php.ini:

session.save_handler = "memcache" 
session.save_path = "tcp://memcacheServerAddressHere:11211?persistent=1&weight=2&timeout=2&retry_interval=10" 

El Memcached PECL gestor de sesiones de extensión está habilitado con la siguiente en php.ini:

session.save_handler = "memcached" 
session.save_path = "memcacheServerAddressHere:11211" 

Tenga en cuenta que la extensión Memcache parece permitir más configuración del entorno Memcache.

1

Quiere tener cuidado al hacer esto. Una cosa a tener en cuenta es no alojar la información de la sesión con otros datos que no sean de sesión. No es lo más importante borrar su caché cuando solo contiene los datos de su propio sitio, pero no desea eliminar las sesiones de las personas junto con él.

Siempre que use la misma clave con Memcache, debe presionar el mismo servidor cada vez. Entonces ese problema debería desaparecer.

+0

Exactamente, el servidor solo tiene 1 sitio en él, así que ¿cree que eso será un problema? estamos haciendo memoria caché de mem con un servidor db –

+2

Debería estar bien. Solo debe tener cuidado cuando desee actualizar el servidor. Hemos puesto una de las sesiones de nuestra aplicación en Memcache y somos muy cuidadosos al respecto. – Wix

+0

Gracias por el consejo –

14

Hay dos partes a la pregunta:

cómo hacer frente a las solicitudes que van a diferentes servidores?

Esto se debe a su balanceador de carga/proxy inverso. Es común hacer que los clientes se adhieran a un servidor, generalmente por una dirección IP o una cookie transparente establecida por el proxy. Sin embargo, no es necesario tener rigidez del cliente por el bien de las sesiones si tiene una tienda de sesión distribuida, lo que nos lleva a Memcache.

¿Cómo se usa Memcache para el almacenamiento de la sesión en varios servidores?

memcache tiene una arquitectura propia distribuida compartida, por lo que la mayor parte de la inteligencia está en el extremo del cliente. Entonces, lo que debe hacer es seguir adelante y usar el almacenamiento de la sesión de Memcache, pero en lugar de apuntar a un servidor, apúntelo al ALL de ellos. Esto está cubierto in the docs. En su php.ini, debe establecer session.save_path en la lista de servidores memcached, por ejemplo server1:11211, server2:11211.

Tenga en cuenta que hay dos bibliotecas de cliente Memcache distintas disponibles en PHP llamadas memcache y memcached y tienen una sintaxis diferente para esta propiedad.

Debido a la forma en que funciona Memcache, no importa dónde se almacenan los datos de la sesión: se ocupa de usted.

Como señala NathanD, Memcache es volátil y pierde datos en un reinicio, y cuando tiene varios servidores esto significa que algunos (pero no todos) de sus usuarios se desconectarían si uno se reiniciara. Si un servidor muere completamente , el almacenamiento de la sesión seguirá funcionando. Los usuarios cuyos datos de sesión estaban en el servidor inactivo se iniciarán, pero pueden volver a iniciar sesión y continuar sin que el servidor esté presente.

0

es mejor utilizar memcachedb como un almacenamiento persistente para memcache en sí o incluso utilizar los Redis más inteligentes que recomiendo altamente en su caso

0

También puede escribir sus sesiones a una base de datos SQL. Esto también le dará sesiones persistentes en todos los servidores. Ver el tutorial a continuación: http://culttt.com/2013/02/04/how-to-save-php-sessions-to-a-database/

Si insiste en funcionamiento de las sesiones en memcached (con el fin de tener un mejor rendimiento, pero menor consistencia) puede simplemente volver a escribir su código en un par de lugares

0

Puede sincronizar archivos sesiones basadas también. Lo hago en mis dos servidores con equilibrio de carga. En Ubuntu y muchos otros Linux, las sesiones se almacenan en /var/lib/php5.

Seguí los pasos over here on Superuser, montando la carpeta de sesión de PHP desde un servidor en el otro.

Cuestiones relacionadas