2009-10-20 10 views
30

que recientemente experimentó una inundación de tráfico en una aplicación de Facebook que he creado (sobre todo por el bien de la educación, no con la intención de comercialización)Arquitectura de una aplicación PHP en Amazon EC2

Ni que decir tiene, no lo hice pensar en la escalabilidad cuando creé la aplicación. Ahora estoy en una posición en la que mi exiguo servidor virtual alojado por MediaTemple no lo está cortando, y realmente se trata de E/S en bruto de la máquina. Dado que este proyecto me ha sido tan educativo hasta ahora, pensé que tomaría esto como una oportunidad para comprender la plataforma Amazon EC2.

La aplicación en sí se crea en PHP (utilizando Zend Framework) con un back-end MySQL. Utilizo el almacenamiento en caché de la aplicación siempre que sea posible con memcached. Pasé el fin de semana jugando con EC2, creando instancias, instalando los paquetes que deseo y montando un volumen de EBS en una instancia.

Pero, ¿cuál es el próximo paso lógico que dará buenos resultados para la escalabilidad? ¿Arranco una instancia AMI para MySQL y otra para el servicio Apache? ¿O acabo de replicar las instancias tantas veces como las necesito y luego hago algún tipo de equilibrio de carga en la interfaz? Idealmente, me gustaría tener una base de datos centralizada porque agrego estadísticas en todas las filas de bases de datos, sin embargo, este no es un requisito difícil (probablemente haya algunas soluciones específicas de aplicaciones que podría encontrar para solucionar esto)

Sé que esto probablemente no es una respuesta directa, por lo que las opiniones y sugerencias son bienvenidas.

Respuesta

14

Tantas preguntas, todas buenas.

En términos de escala, tiene algunas opciones.

El primero es comenzar con una sola caja. Puede escalar hacia arriba, con una caja más poderosa. EC2 tiene varias instancias de tamaño. Esto implica una migración de servidor cada vez que desea una caja más grande.

Más fácil es agregar servidores. Puede comenzar con una sola instancia para Apache & MySQL. Luego, cuando el tráfico aumente, cree una instancia separada para MySQL y apunte su aplicación a esta nueva instancia. Esto crea una buena capa entre la aplicación y la base de datos. Parece que este es un buen punto de partida basado en su tráfico.

A continuación, probablemente necesite más poder de aplicación (servidores web) o más potencia de base de datos (clúster MySQL, etc.). Puede hacer que sus registros DNS apunten a un par de recuadros frontales que ejecutan software de equilibrio de carga (intente Pound). Estos servidores de equilibrio de carga distribuyen solicitudes a sus servidores web. EC2 tiene Elastic Load Balancing que es una alternativa a la administración de esto usted mismo, y probablemente sea más fácil, no lo he usado personalmente.

Algo más que tener en cuenta: EC2 no tiene almacenamiento persistente. Tienes que administrar los datos persistentes tú mismo usando Elastic Block Store. This guide es un excelente tutorial sobre cómo hacer esto, con copias de seguridad automatizadas.

Le recomiendo que compre algunas instancias reservadas si decide que EC2 es el camino a seguir. ¡Te ahorrarás un 50% en 3 años!

Finalmente, puede que le interesen los servicios como RightScale que ofrecen servicios de gestión a un costo. Hay otros proveedores disponibles.

+0

Esto suena como mis primeros pasos exactos para tomar. Pregunta: ¿se puede montar un volumen EBS en varias instancias? Estoy pensando que podría almacenar el directorio/var/www en el servidor apache en EBS y los datos mysql en el servidor mysql en un EBS. –

+0

Desafortunadamente no. Piense en un EBS como un disco duro, solo puede adjuntarse a una instancia a la vez. Puede clonarlos, pero el EBS clonado no obtiene ningún cambio ni nuevos datos. Su tarea es escribir un script que configure nuevas instancias automáticamente: verifica su código de subversión, configura apache, informa al equilibrador de carga que está listo para recibir solicitudes. Servicios como RightScale hacen esta parte más fácil, creo. –

10

El primer paso es separar las preocupaciones. Me separaría con un servidor MySQL por separado y posiblemente una caja de memcached dedicada, dependiendo de qué tan alta esté tu carga allí.Luego controlaría la memoria y el uso de la CPU en cada cuadro y vería dónde puede optimizar, siempre que sea posible. Esto se puede hacer girando los nuevos cuadros de Media Temple. También sugeriría Slicehost para una alternativa más barata y más amigable para los desarrolladores.

Algunas de bajo presupuesto optimizaciones más despliegue de PHP:

  • Uso de un servidor web más eficiente como nginx para manejar archivos estáticos servir y luego revertir las solicitudes de aplicaciones proxy para una instancia de Apache separada
  • Implementar PHP con FastCGI encima de nginx usando algo como PHP-FPM, eliminando por completo a Apache. Esta puede ser una excelente alternativa si sus necesidades de Apache no van más allá de mod_rewrite y de los módulos de Apache más sencillos.

Si prefiere un nivel más alto, hágalo usted mismo enfoque, es posible que desee echa un vistazo a Scalr (code at Google Code). Vale la pena ver el video en su sitio web. Ofrece un entorno de alojamiento escalable con Amazon EC2. La tecnología es de código abierto, por lo que puede descargarla e implementarla usted mismo en su propio servidor de administración. (¿Su caja de Media Temple, quizás?) Scalr tiene AMI (aparatos EC2) preconstruidos disponibles para algunos casos de uso común.

  • web: Utiliza nginx y sus muchas capacidades: el equilibrio de carga de software, archivos estáticos de servir, etc. lo que probablemente sólo tiene uno de estos, y probablemente aplicar algún tipo de conexión a EBS de Amazon, o solución de almacenamiento persistente, como lo menciona dcaunt.
  • aplicación: Un servidor de aplicaciones con Apache y PHP. Probablemente tenga muchos de estos y se crearán automáticamente si se necesita manejar más carga. Este tipo de servidor contiene copias de su aplicación ZF.
  • db: Un servidor de base de datos con MySQL. Nuevamente, probablemente tenga muchos de estos y se crearán más instancias de esclavo automáticamente si se necesita manejar más carga.
  • memcached: Un servidor de memcached dedicado que puede usar para tener caché centralizado, administración de sesiones, etc. en todas sus instancias de aplicaciones.

La opción Scalr probablemente requerirá más cambios de configuración, pero si cree que su escala necesita acelerarse rápidamente, puede valer la pena el tiempo y el esfuerzo.

+0

Scalr se ve muy interesante. Sin embargo, es un paso por encima de las necesidades que tengo. Probablemente voy a comenzar con su primera recomendación e ir a partir de ahí –

+0

Me alegra mucho poder ayudar – patcoll