Escalar aplicaciones, bendito problema

Lanzar una aplicación a producción conlleva sus riesgos, pero cuando coge la tracción adecuada se convierte en un gran logro. A todos nos gusta ver cómo aumenta el número de visitantes o seguidores a una velocidad pasmosa, ¿no? Pero ¿qué ocurre cuando el tráfico se incrementa tanto que causa una caída en la infraestructura de servidores que soporta la aplicación? No importa qué hora o día sea, el coste de tener tu aplicación offline es demasiado alto, y en muchos casos podría hasta originar pérdidas irreversibles al negocio o empresa.

Si esto ocurre, ¡que no cunda el pánico! Siempre hay maneras de solucionar cualquier problema, y en este caso la solución pasa por hacer que tu aplicación sea mucho más fiable y consistente. En el mundo real decimos que “la unión hace la fuerza“, en la informática hablaremos de aumentar la “escalabilidad” de tu aplicación.

En general, la escalabilidad es la cualidad de un sistema de soportar un incremento considerable en carga de procesamiento y acomodarse a ello mientras mantiene una experiencia de usuario excelente. Existen dos maneras de escalar un sistema: verticalmente y horizontalmente.

El escalado vertical es el método más simple de solventar el problema de rendimiento. Cuando nos quejamos de que el viejo ordenador de casa funciona muy lento, enseguida pensamos en aumentar sus características incrementando la cantidad de memoria RAM, cambiando el procesador o incluso considerando la opción de comprar uno nuevo. Esto es, a grandes rasgos, la definición de escalar verticalmente. Sin embargo, a pesar de que puede ser una solución inmediata al problema realmente podríamos estar ocultando la problemática subyacente del sistema, no hay garantías de que un servidor doblemente potente ejecutará la aplicación el doble de rápido.

El escalado horizontal, por otro lado, se logra añadiendo más servidores al cluster existente. Es en este método donde aplicamos la frase célebre de la escalabilidad que comentábamos antes ¿pero qué significa esto exactamente?

Un cluster es simplemente una agrupación de servidores. Un balanceador de carga distribuye la carga de trabajo entre los servidores de un cluster. En algún punto, un nuevo servidor puede ser añadido al cluster existente para manejar más cantidad de carga de los procesos que requieren uso y acceso a tu aplicación: esto es el escalado horizontal.

Centrándonos en el mundo de internet y en las tecnologías web, añadir un nuevo servidor a tu arquitectura va a permitir desahogar la saturación de carga existente en un servidor debido al incremento puntual (o natural) de tráfico en el tiempo.

load_balancer

El balanceador de carga tiene una sola misión: decidir qué servidor del cluster va a recibir la petición que acaba de interceptar. Básicamente actúa como un proxy inverso, siendo totalmente transparente para el usuario final.

Mientras el escalado horizontal es generalmente el método más fiable y eficiente de escalado, no es tan trivial como el escalado vertical. En general, el principal problema al escalar aplicaciones web es mantener todos los nodos de un cluster actualizados y sincronizados. Veamos un ejemplo:

Cuando un usuario A entra en ejemplo.com, el balanceador de carga redirige la petición al servidor 1. Por el contrario, el usuario B es redireccionado hacia otro nodo del cluster, el servidor 2.

¿Qué ocurriría si el usuario A hace cambios en la aplicación, como añadir contenido a la base de datos o subir un fichero desde su ordenador? ¿Cómo se mantiene la consistencia entre todos los nodos de un cluster? Además, el motor PHP por defecto guarda la sesión de usuario en disco. Si un usuario A se conecta a la aplicación, ¿cómo podemos mantener la sesión de usuario en peticiones subsecuentes, considerando que el balanceador de carga podría enviar ese usuario a otro de los nodos del cluster?

Permaneced atentos al blog porque en los próximos posts analizaremos cada uno de estos problemas en detalle.

arturo.bayo