Estoy pensando en cómo configurar mejor un par de entornos en AWS. Me gustaría configurar dos servidores:
- Servidor de aplicaciones (ejecuta aplicaciones web y servicios REST)
- Servidor de herramientas (ejecuta varios trabajos ETL)
El resultado final debe ser dos servidores de aplicaciones y dos servidores de herramientas (es decir, un servidor de aplicaciones / servidor de herramientas en cada zona de disponibilidad)
- Todos los entornos estarán hablando con la misma base de datos.
- Cada entorno tendrá su propio almacenamiento EBS
- Un único almacenamiento compartido externo (EFS) al que se podrá acceder desde cualquiera de los 4 entornos.
Estoy un poco confundido en términos de cómo configurar el almacenamiento. El objetivo es garantizar que si se pierde una instancia de EC2, no pierdo ningún dato. Para lograr esto, me gustaría configurarlo para que el código se implemente en el almacenamiento local (EBS) y el contenido dinámico se almacene en el almacenamiento externo compartido (EFS).
Todas las aplicaciones estarán en una carpeta con la siguiente estructura
├─ application
├─ bin
├─ lib
├─ config
├─ logs
├─ data
├─ processed
├─ failed
En una instancia EC2 muere, me gustaría conservar la configuración, los registros y la carpeta de datos. Las otras carpetas (bin y lib) contendrán solo código binario que se puede reconstruir desde GIT. Para lograr esto, estoy pensando en el siguiente almacenamiento
EBS en el servidor de aplicaciones 1 y el servidor de aplicaciones 2
├─ applications
├─ finance
├─ appname1
├─ bin
├─ lib
├─ config --> /storage/finance/config
├─ logs --> /storage/finance/logs
├─ data --> /storage/finance/date
Los últimos tres serán enlaces simbólicos a carpetas en el almacenamiento externo.
EFS (almacenamiento compartido)
├─ storage
├─ finance
├─ appname1
├─ config
├─ logs
├─ data
La estructura anterior puede ser una pesadilla de mantenimiento, pero no puedo pensar en otras alternativas. Con el enfoque anterior, el código se implementa en cada servidor de aplicaciones pero los datos se comparten entre dos servidores de aplicaciones. Si un servidor de aplicaciones en una zona AV muere, el otro seguirá siendo funcional.
Otras opciones que he considerado incluyen tener todo en almacenamiento EBS y confiar en copias de seguridad / imágenes. Esto no funcionará porque los archivos de configuración son dinámicos y es posible que la imagen no siempre tenga los datos más recientes.
Al leer sobre el almacenamiento EFS, parece que escribir en él podría ser lento, lo cual es algo que me preocupa un poco. Preguntas:
- ¿Hay alternativas a lo anterior?
- ¿Hay alguna otra desventaja en el enfoque anterior?
- ¿Hay alguna manera de que pueda tener todo (código + datos) en el almacenamiento local de EBS y aún así poder recuperar (al segundo) en caso de un desastre?
Gracias por adelantado