Estamos pasando de una configuración de 1 servidor web a una configuración de dos servidores web y necesito comenzar a compartir sesiones PHP entre las dos máquinas con equilibrio de carga. Ya hemos instalado memcached ( y empezamos ) y, por lo tanto, me sorprendió gratamente que pudiera lograr compartir sesiones entre los nuevos servidores cambiando solo 3 líneas en el php.ini
archivo ( session.save_handler y session.save_path ):
Reemplacé:
session.save_handler = files
con:
session.save_handler = memcache
Luego, en el servidor web maestro, configuré session.save_path
para que apunte a localhost:
session.save_path="tcp://localhost:11211"
y en el servidor web esclavo configuré session.save_path
para que apunte al maestro:
session.save_path="tcp://192.168.0.1:11211"
Trabajo hecho, lo probé y funciona. Pero...
Obviamente, usar memcache significa que las sesiones están en RAM y se perderán si se reinicia una máquina o el demonio memcache se bloquea: estoy un poco preocupado por esto, pero estoy un poco más preocupado por el tráfico de red entre los dos servidores web (especialmente porque escalamos) porque cada vez que alguien tiene una carga equilibrada en el servidor web esclavo, sus sesiones se recuperarán a través de la red desde el servidor web maestro. Me preguntaba si podría definir dos save_paths
para que las máquinas busquen en su propio almacenamiento de sesión antes de usar la red. Por ejemplo:
Dominar:
session.save_path="tcp://localhost:11211, tcp://192.168.0.2:11211"
Esclavo:
session.save_path="tcp://localhost:11211, tcp://192.168.0.1:11211"
¿Compartiría con éxito las sesiones entre los servidores Y ayudaría al rendimiento? es decir, ahorrar tráfico de red el 50% del tiempo. ¿O es esta técnica solo para failovers (por ejemplo, cuando un demonio memcache no está disponible)?
Nota : Realmente no estoy preguntando específicamente sobre la replicación de Memcache, más acerca de si el cliente PHP Memcache puede alcanzar el máximo dentro de cada demonio Memcache en un grupo, devolver una sesión si encuentra una y solo crear una nueva sesión si no encuentra una En todas las tiendas. Mientras escribo esto, creo que estoy pidiendo un poco de PHP, jajaja ...
Suponga : sin sesiones fijas, balanceo de carga round-robin, servidores LAMP
Respuestas:
Descargo de responsabilidad: te enojaría escucharme sin hacer una tonelada de pruebas Y obtener una segunda opinión de alguien calificado: soy nuevo en este juego .
La idea de mejora de eficiencia propuesta en esta pregunta no funcionará. El principal error que cometí fue pensar que el orden en que se definen los almacenes de memoria caché en el grupo dicta algún tipo de prioridad. Este no es el caso . Cuando define un grupo de demonios combinados (por ejemplo, usando
session.save_path="tcp://192.168.0.1:11211, tcp://192.168.0.2:11211"
), no puede saber qué tienda se usará. Los datos se distribuyen de manera uniforme, lo que significa que un elemento podría almacenarse en el primero, o podría ser el último (o podría ser ambos si el cliente memcache está configurado para replicarse; tenga en cuenta que es el cliente que maneja la replicación, el servidor memcached lo hace). no hacerlo por sí mismo). De cualquier manera significará que usar localhost como el primero en el grupo no mejorará el rendimiento: hay un 50% de posibilidades de llegar a cualquiera de las tiendas.Después de haber hecho un poco de pruebas e investigaciones, he concluido que PUEDES compartir sesiones entre servidores usando Memcache PERO probablemente no quieras, no parece ser popular porque no se escala tan bien como el uso compartido la base de datos no es tan robusta. Agradecería comentarios sobre esto para poder aprender más ...
Consejo 1: si desea compartir sesiones en 2 servidores usando memcache:
Asegúrese de haber respondido Sí a "¿ Habilitar la compatibilidad con el controlador de sesión de memcache? " Cuando instaló el cliente PHP memcache y agregue lo siguiente en su
/etc/php.d/memcache.ini
archivo:En el servidor web 1 (IP: 192.168.0.1):
En el servidor web 2 (IP: 192.168.0.2):
Consejo 2: si desea compartir sesiones en 2 servidores utilizando memcache Y tener soporte de conmutación por error:
Agregue lo siguiente a su
/etc/php.d/memcache.ini
archivo:En el servidor web 1 (IP: 192.168.0.1):
En el servidor web 2 (IP: 192.168.0.2):
Notas:
session.save_path
en todos los servidores.Consejo 3: si desea compartir sesiones usando memcache Y tener soporte transparente de conmutación por error:
Igual que el consejo 2, excepto que necesita agregar lo siguiente a su
/etc/php.d/memcache.ini
archivo:Notas:
get's
se vuelvan a intentar en los espejos. Esto significará que los usuarios no perderán su sesión en el caso de una falla del demonio memcache.memcache.session_redundancy
es para redundancia de sesión pero también hay unmemcache.redundancy
opción ini que puede ser utilizada por el código de su aplicación PHP si desea que tenga un nivel diferente de redundancia.fuente
ext/memcache
versión 3.x. También estamos jugando con esa opción y decidí recorrer la lista de servidores y escribirla yo mismo.Re: Consejo 3 anterior (para cualquier otra persona que se encuentre con esto a través de Google), parece que al menos actualmente para que esto funcione debe usar
memcache.session_redundancy = N+1
N servidores en su grupo , al menos ese parece ser el umbral mínimo valor que funciona. (Probado con php 5.3.3 en Debian estable, pecl memcache 3.0.6, dos servidores memcached. Fallaríasession_redundancy=2
tan pronto como apague el primer servidor en elsave_path
,session_redundancy=3
funciona bien).Esto parece ser capturado en estos informes de errores:
fuente
Junto con la configuración de php.ini que se muestra arriba, asegúrese de que también se configure lo siguiente:
Entonces obtendrá una conmutación por error completa y redundancia del lado del cliente. La advertencia con este enfoque es que si memcached está inactivo en localhost siempre habrá una falta de lectura antes de que el cliente php memcache intente el siguiente servidor en el grupo especificado en session.save_path
Solo tenga en cuenta que esto afecta la configuración global del cliente php memcache que se ejecuta en su servidor web.
fuente
consistent
estrategia de hashing teniendo en cuenta quesession.save_path
es diferente en cada servidor web?memcached no funciona de esa manera (¡corrígeme si me equivoco!)
Si desea que su aplicación tenga almacenamiento de sesión redundante, debe crear algo que altere / agregue / elimine entradas en ambas instancias de memoria caché. memcached no maneja esto, lo único que proporciona es como almacenamiento de hash clave. Entonces no hay replicación, sincronización, nada, nada.
Espero no estar equivocado en este asunto, pero esto es lo que sé de memcached, han pasado algunos años desde que lo toqué.
fuente
memcached no se replica fuera de la caja, pero lo hace repcached (un memcached parcheado). Sin embargo, si ya está utilizando mysql, ¿por qué no usar su funcionalidad de replicación con la replicación maestro-maestro y obtener el beneficio de la replicación de datos completa?
DO.
fuente