Autor original: Adam Charnock
Enlace original: La guía del autoestopista para el equilibrio de carga de PHP
Traducción: Koda
solía referirse a ejecutar un servidor web grande cuando se ejecuta una aplicación web grande. Debido a que su aplicación atrae a una gran cantidad de usuarios, tendrá que agregar más memoria y procesadores a su servidor.
Hoy en día, el modelo de 'gran servidor' ha desaparecido y ha sido reemplazado por una gran cantidad de servidores pequeños, que utilizan una variedad de técnicas de equilibrio de carga. Este es un enfoque más factible que mantendrá los costos de hardware al mínimo.
La ventaja de "servidores más pequeños" sobre el modelo anterior de "servidores grandes" se refleja en dos aspectos:
si el servidor deja de funcionar, el sistema de equilibrio de carga dejará de realizar solicitudes al servidor caído y en su lugar distribuirá la carga a otros servidores que funcionan normalmente. . superior.
Escalar su servidor es más fácil. Todo lo que tienes que hacer es agregar nuevos servidores al sistema de equilibrio de carga. No es necesario interrumpir su aplicación.
Entonces, aproveche esta oportunidad :). La desventaja, por supuesto, es que requiere un poco más de complejidad en el desarrollo de su aplicación. Eso es lo que cubrirá este artículo.
En este punto puede que te estés preguntando: '¿Pero cómo sé que estoy usando el equilibrio de carga? '. La respuesta más honesta, si hace esta pregunta, es que probablemente no esté utilizando un sistema de equilibrio de carga y su sistema no necesita considerarlo. En la mayoría de los casos, cuando la aplicación crece lo suficiente, es necesario proponer y configurar explícitamente el equilibrio de carga. Sin embargo, de vez en cuando veo empresas de alojamiento web que realizan este equilibrio de carga para las aplicaciones de los clientes o lo hacen ellas mismas como se describe a continuación.
Antes de continuar, me gustaría señalar que este artículo describe principalmente el equilibrio de carga en PHP. Quizás escriba sobre el equilibrio de carga de datos en el futuro, pero por ahora tendrás que esperar.
Tenga en cuenta que sigo mencionando "aplicaciones web" en lugar de sitios web. Esto es para distinguir que las "aplicaciones web" son sitios complejos que a menudo involucran programación y bases de datos del lado del servidor, en lugar de sitios web que solo muestran contenido estático simple.
1. Archivos PHP La primera pregunta es, si tiene una gran cantidad de servidores pequeños, ¿cómo carga sus archivos php en todos los servidores? Existe el siguiente método para su referencia:
cargue todos los archivos en cada servidor por separado. El problema con este método es: imagine que tiene 20 servidores, esto fácilmente provocará errores durante el proceso de carga y el tiempo de actualización será muy largo. rápido. Es posible tener diferentes versiones de archivos en diferentes servidores.
Utilice 'rsync' (o software similar). Una herramienta de este tipo puede sincronizar archivos en un directorio local y directorios en varios hosts remotos.
Utilice software de control de versiones (como subversion). Este es mi método favorito. Me permite mantener muy bien mi código y, cuando publico mi aplicación, puedo ejecutar el comando svn update en cada servidor para sincronizarla. Este enfoque también facilita el cambio de servidores a una versión anterior del código.
Utilice un servidor de archivos (es posible que NFS sea excelente para esto). Este enfoque consiste en utilizar un servidor de archivos para alojar su aplicación web. Por supuesto, si su servidor de archivos deja de funcionar, todos sus sitios no estarán disponibles. En este momento, necesitarás gastar más dinero para restaurarlo.
El método que elija dependerá de sus necesidades y de las habilidades que tenga. Si utiliza un sistema de control de versiones, es posible que desee planificar una forma de actualizar el código en todos los servidores ejecutando un comando de actualización al mismo tiempo. Sin embargo, si utiliza un servidor de archivos, deberá implementar algún mecanismo de recuperación de fallas para evitar fallas en las solicitudes en caso de que el servidor falle.
2. Carga de archivos Cuando solo hay un servidor, la carga de archivos no es un problema. Pero cuando tenemos varios servidores, ¿cómo se deben almacenar los archivos cargados? El problema de cargar archivos es similar al almacenamiento de archivos PHP entre servidores. Aquí hay varias soluciones posibles:
Almacene el archivo en una base de datos. La mayoría de los datos permiten almacenar datos binarios. Cuando solicita la descarga de un archivo, los datos de acceso envían los datos binarios y el nombre y tipo de archivo correspondiente al usuario. Debe considerar cómo la base de datos almacenará sus archivos antes de utilizar esta solución. El problema con este enfoque es que si el servidor de la base de datos deja de funcionar, los archivos no estarán disponibles.
Almacene los archivos cargados en un servidor de archivos. Como en la introducción anterior, debe instalar un servidor de archivos para que todos los servidores web lo compartan. Después de cargarlo, todos los servidores web pueden usarlo. Sin embargo, si el servidor de archivos no funciona, es posible que se produzcan interrupciones en la descarga de archivos de imágenes.
Diseñe su propio mecanismo de carga para transferir archivos a cada servidor. Este enfoque no tiene los inconvenientes de un único servidor de archivos o solución de base de datos, pero aumentará la complejidad de su código. Por ejemplo, si el servidor se cae durante la carga en varios servidores, ¿qué hará?
Usar una base de datos para almacenar archivos cargados pero diseñar un mecanismo de almacenamiento en caché de archivos es una buena solución. Cuando el servidor recibe una solicitud de descarga de archivo, primero verifica si el archivo existe en el sistema de caché. Si lo encuentra, lo descarga del sistema de caché. De lo contrario, lo lee de la base de datos y lo almacena en caché en el sistema de archivos.
3. Sesiones
Si está familiarizado con el manejo de sesiones de PHP, probablemente sabrá que, de forma predeterminada, almacena los datos de la sesión en archivos temporales en el servidor. Además, este archivo sólo está en el servidor donde lo solicitó, pero las solicitudes posteriores pueden ser procesadas por otro servidor, lo que generará una nueva sesión en el otro servidor. Esto hace que las sesiones con frecuencia no sean reconocidas, como que a los usuarios que han iniciado sesión siempre se les pide que inicien sesión nuevamente.
Mi solución recomendada es restablecer el mecanismo de procesamiento de sesiones integrado de PHP para almacenar datos de la sesión en la base de datos, o implementar su propio mecanismo para garantizar que la solicitud de un usuario se envíe al mismo servidor.
4. Configuración
Aunque este tema no está específicamente relacionado con PHP, creo que es necesario mencionarlo. Cuando se ejecutan servidores en clúster, es una buena idea tener alguna forma de mantener sincronizados los archivos de configuración entre servidores. Si los archivos de configuración son inconsistentes, puede resultar en un comportamiento intermitente muy extraño que puede ser difícil de solucionar.
Recomiendo gestionarlos individualmente mediante un sistema de control de versiones. De esta manera, puede almacenar diferentes archivos de configuración de php para diferentes instalaciones de proyectos y también mantener sincronizados todos los archivos de configuración del servidor.
5. Registro
Al igual que los problemas de configuración, el registro no está sólo relacionado con PHP. Pero sigue siendo muy importante mantener su servidor funcionando correctamente. Sin un sistema de registro adecuado, ¿cómo sabría si su código PHP comienza a generar errores (siempre desactiva la configuración display_errors cuando el sistema está activo, ¿no?)
Hay algunas maneras de implementar el registro:
Inicie sesión cada servidor. Ésta es la forma más sencilla. Cada máquina graba sólo un archivo. La ventaja es que es sencillo y puede requerir muy poca configuración. Sin embargo, a medida que aumenta el número de servidores, monitorear los archivos de registro en cada servidor se vuelve muy difícil.
Registro en un recurso compartido Este enfoque todavía tiene los archivos de registro en cada servidor, pero se almacenan en un servidor de archivos central a través del mecanismo compartido, lo que facilita el monitoreo de los registros. El problema con esta solución es que si el servidor de archivos no está disponible, un simple problema de escritura de registros eventualmente provocará que toda la aplicación falle.
Registro en un servidor de registro Puede utilizar un software de registro como syslog para escribir todos los registros en un servidor central. Aunque este método requiere más configuración, también proporciona la solución más sólida.
phpv agregó: Otro punto importante es la administración de la base de datos, que puede involucrar mucho contenido, por lo que el autor no lo escribió.