¿Cómo se determina la selección de infraestructura adecuada para una aplicación web en AWS?

No existe una regla mágica o un algoritmo simple que le permita elegir exactamente la infraestructura adecuada para todas sus necesidades de hardware / software (este no es un problema exclusivo de AWS). La estrategia habitual es usar algo como el siguiente árbol de decisión:

1) ¿Tiene suficiente experiencia para conocer las características exactas necesarias para el estado deseado? En caso afirmativo, impleméntelos y vaya al paso (3). Si no, vaya al paso (2).

2) Realice algunos cálculos al final del sobre para satisfacer sus requisitos de hardware. Esto significa mirar las tasas de solicitud, los patrones de tráfico, la utilización esperada de recursos por solicitud y luego extrapolar. Elija hardware basado en estas estimaciones. Ve a (3).

3) Monitoree su aplicación y determine cómo está funcionando. Esto le permitirá ajustar las “cosas” necesarias. Por lo tanto, si observa que el uso de la memoria está aumentando, puede optar por obtener cuadros con más memoria o volver a diseñar partes de su aplicación. Siga haciendo esto (es decir, vaya a (3)) mientras su aplicación está en estado estable. Si algo cambia drásticamente (aparece en Wired, desea agregar muchas más funciones), vaya al paso (1).

Algunas cosas que puedo decirte para tu caso de uso exacto:

  1. 2k visitantes únicos por día son pequeños . Aquí no estás pisando exactamente un territorio nuevo, por lo que no hay razón para que no puedas tener una aplicación sólida como una roca si planeas con anticipación e inviertes tiempo en la infraestructura.
  2. La mitad del tiempo probablemente tenga un cuello de botella en E / S y acceso a la base de datos de todos modos. Por lo tanto, sus núcleos, ram, etc. en su instancia EC2 no son realmente relevantes.
  3. El mejor consejo de optimización que puedo darle para EC2 es que si nota que su CPU se está disparando de manera extraña o está obteniendo un comportamiento inesperado, y este es un gran problema para usted, lo más probable es que su VM esté colocada en una caja con otra VM, y el hipervisor Xen les está dando más prioridad periódicamente. Esta es una realidad para casi todos los hosts compartidos, virtuales o no. La mejor manera de evitar esto en EC2 es obtener las instancias más gordas posibles (instancias extragrandes) para que no haya una ubicación conjunta. EC2 siempre mantendrá solo una instancia Extra-Large en un host en particular: es * efectivamente * una caja dedicada.
  4. Pero tenga en cuenta que todavía está virtualizado, por lo que aún incurrirá en los gastos generales asociados con el hipervisor al ejecutar su aplicación.
  5. Evitar EBS. Solo … evítalo. (A menos que * realmente * lo necesite). Ha sido una gran fuente de consternación para mucha gente. Use almacenamiento efímero, S3 y CDN (CloudFront) cuando sea posible.
  6. Tu tiempo es valioso. El hardware es barato en comparación (hasta cierto punto), por lo que a veces arrojar máquinas a un problema * es * la mejor manera de hacer las cosas.

Para hacerse eco de las otras respuestas, probablemente debería comenzar con la instancia más barata / más pequeña para ver cómo le va, pero asegúrese de diseñar su código para que sea fácil hacer la transición a otra cosa si y cuando llegue el momento. Por ejemplo, es posible que desee reemplazar su base de datos con una de Amazon (RDS quizás) y debe asegurarse de que su código le permita pasar fácilmente a ella. Si tiene procesos de fondo como colas y tareas, también debe asegurarse de que puedan ejecutarse de forma independiente en otra máquina.

Recientemente cambiamos Glossi a AWS desde Linode y terminamos comenzando con dos instancias pequeñas, pero después de monitorear un poco, terminamos agregando algunas instancias más baratas y también una CPU más alta para nuestra cola y tareas.

Yo diría que comience con algo pequeño solo para ahorrar dinero y tener una idea de cómo funciona AWS y luego monitorear activamente para ver dónde están los cuellos de botella. Puede resultar que mejorar su código sería una mejor apuesta que actualizar instancias.

Lo que dijo Vaibhav. Además, agregaré algunas cosas.

2,000 – 3,000 únicos al día es realmente pequeño. Es posible que AWS no sea su mejor candidato a menos que espere que necesite aumentar ese número realmente rápido (como 100,000 durante la noche) o experimente muchos picos de tráfico. La razón por la que digo esto es que los servicios de AWS son excepcionalmente inestables y cualquier arquitectura que los use DEBE implementar las mejores prácticas de alta disponibilidad y recuperación ante desastres. Dependiendo de su modelo de ingresos y el tamaño de la organización, eso puede no ser factible.

Cosas que descubrimos:

  1. Utilice siempre grupos de Auto Scaling. Nunca confíes en una sola instancia para hacer algo. Al azar dejan de responder sin una buena razón.
  2. Si usa EBS RAID 10, hágalo.
  3. Todos los servicios deben ser redundantes y reconfigurables sobre la marcha. Entonces, por ejemplo, su enrutador multidb django necesita saber que si un db deja de responder, debería fallar a otro. (Resolvimos esto poniendo pgpool2 en cada servidor web y haciendo que django se conectara a eso)
  4. Nuestros puntos de referencia mostraron que los pequeños EC2 no valen la pena. Una aplicación django dada que recibe 5 solicitudes por segundo en una pequeña obtendrá aproximadamente 30 en un medio de CPU alta. 6 veces el rendimiento por el doble del precio … bien vale la pena.
  5. El tiempo de ampliación es muy variable. Nuevas instancias en AutoScale Groups aparecerán entre 2 y 15 minutos … no hay forma de predecir esto … Los ELB son de la misma manera, así que asegúrese de que su umbral de CPU sea de aproximadamente 40% y gire más de lo necesario, luego retroceda. Activamos 8 servidores nuevos y luego los desactivamos 2 a la vez en intervalos de 5 minutos si la CPU promedio está por debajo del 20%
  6. Instantánea regularmente. Te cobrarán mucho dinero por esto, pero vale la pena.

Todo lo dicho … tu pregunta es bastante general, por lo que es difícil de responder. Para nosotros, una configuración mínima en AWS debería verse así:

1 IP estática
1 ELB
2 servidores de aplicaciones medianas de CPU alta de 1 GB (con almacenamiento en caché) en el grupo de Auto Scalling
2 servidores DB. (elige la replicación y la conmutación por error)
1 Cloudfront para servicios CDN
1 S3 para respaldar cosas

No usamos pasajeros, usamos gunicorn y uWSGI y tendemos a generar entre 4 y 8 procesos en cada uno de los servidores de aplicaciones … solo depende de lo que esté haciendo la aplicación, tendrá que determinar el número óptimo mediante pruebas de carga de su aplicación.

Eso le dará alrededor de 200-500 solicitudes por segundo en una aplicación django bien escrita. Aunque lo he visto tan bajo 3 y tan alto como 1000 dependiendo de lo que estés haciendo. Si obtienes 3, debes despedir a tus desarrolladores.

Última palabra de consejo. Evite AWS y Rackspace a menos que estén ofreciendo algo sin lo que realmente no pueda vivir. Linode y Joyent ofrecen plataformas mucho más estables que también son mucho mejores y mucho más simples. Si su presupuesto es inferior a $ 500 al mes, use esos servicios.

Use RightScale para construir una plantilla de servicio, y luego puede relanzar trivialmente en diferentes servidores a través de diferentes nubes para encontrar la configuración óptima. Ejecutar en la nube sin una plataforma de administración en la nube es solo una mala idea; Mata los principales beneficios de la arquitectura en la nube.

En BuildFax, ejecutamos nuestro servicio de entrega en Django / nginx / Memcached / Rabbit / MySQL / Solr en RightScale en nubes públicas y privadas. Es una cosa maravillosa.

More Interesting

¿Cuál puede ser la mejor estrategia de diseño a seguir para diseñar un marco de automatización para una aplicación web usando webdriver (python)?

Cómo copiar mi página de inicio de WordPress a una página estática para poder configurar la página de inicio como Estática y señalarla sin los blogs

¿Puedo centrarme solo en javascript?

¿Cuál es el archivo de texto IO más rápido o MySQL?

¿Qué es Knex.js?

¿Alguien está usando UDDI? ¿Se está muriendo UDDI?

Cómo omitir a un usuario en un marco Laravel para un desarrollador, para que el desarrollador pueda iniciar sesión en otro usuario

¿Por qué alguien compraría plantillas de sitios web HTML en lugar de simplemente descargarlas guardándolas con fines educativos?

¿Cómo encuentro la posición de la última aparición de un carácter en una cadena sin usar .lastIndexOf ()?

Cómo crear una lista desplegable de tres temas usando HTML + Css + Java Script

¿Cuáles son algunos UserScript útiles para Tampermonkey? ¿Cuéntame sobre algún usuario interesante que hayas escrito?

¿Cómo se ha visto afectado el desarrollo de software de TI empresarial por la tendencia hacia las API RESTful?

¿Existe un marco PHP que realice consultas a bases de datos (MySQL preferiblemente) sin que el desarrollador construya las consultas por sí mismo (preferiblemente uno que sea independiente y no sea parte de Zend, Laravel, etc.)?

¿Existe un tema de sitio web de WordPress que tenga una configuración incorporada para garantizar una carga rápida, y también un complemento de carrito de compras rápido que pueda usar con él?

¿Qué es la noción de directivas en AngularJS?