viernes, 27 de noviembre de 2009

Load Balancing

Load Balancing o Balanceo de Carga, es una técnica aplicada a través de software o hardware (routers, switches), para la distribución de trabajo entre dos o más dispositivos, con el fin de maximizar el rendimiento, este es un término que muchas veces se confunde con Clustering, para aclarar un poco este punto, las técnicas de Clustering son mayormente aplicadas para asegurar una alta disponibilidad y confiabilidad, y se da principalmente en los que respecta a bases de datos; en cuanto al balanceo de carga, es un concepto que es mejor conocido en aplicaciones Web, en donde se desea mejorar el rendimiento de la aplicación a través de una distribución del procesamiento a través de N servidores, conformando lo que se conoce también como granja de servidores (Web Farm).

Uno de los grandes temas cuando se habla de balanceo de carga en aplicaciones Web, es lo concerniente al manejo del estado, como es bien sabido, un sitio Web es una aplicación Stateless (o sea que no mantiene información de estado por sí sola), para esto han existido innumerables técnicas ya sean desde el lado del cliente o el servidor, donde podríamos decir que la más popular es una técnica de servidor denominada Session State. El Session State consiste el almacenar en la memoria del servidor Web información de estado por cada cliente. En un ambiente de granjas esto puede acarrear inconvenientes, debido a que si un cliente hizo una solicitud al sitio que se procesó por el Nodo X, puede ser que la siguiente solicitud se haya procesado por el Nodo Y, y al ser estos dos nodos servidores diferentes, cada uno con su memoria propia, es imposible para ellos compartir dicha información, por lo que se perdería. Algunas de las técnicas utilizadas para solventar esto es la Persistencia, que consiste en que una vez que se ha creado una sesión para un cliente, el balanceador debe ser responsable de manejar los siguientes requests en el mismo servidor que lo atendió hasta que la sesión del mismo haya expirado. Talvez los dos principales inconvenientes achacados a esta técnica son las siguientes: primero, que si el servidor que estuvo atendiendo al cliente, falla, toda la información del mismo se perdería; y segundo, que no se estaría explotando el concepto de balanceo, sobre todo en aplicaciones que manejen pocos usuario que realizan muchos requests, aunque este último caso conformarían un escenario realmente atípico. Volviendo al primer inconveniente, igualmente en un ambiente en el que no existiese balanceo de carga, el problema de pérdida de sesión en caso de fallo se daría, por lo que esta situación no es achacable al uso de un balanceador. Una técnica de balanceo muy conocida que es propietaria de Microsoft es el NLBS (Network Load Balancing Service), esta técnica es por software y maneja persistencia a través del concepto de Afinidad del Cliente (Client Affinity), la cual se puede manejar por cliente (Para Intranet) o por dirección IP de clase C (para Internet).

Otra opción para evitar el problema de pérdida de información de estado, es almacenar dicha información en un servidor dedicado; ya sea este una base de datos, otro servidor Web, o un servidor con algún tipo de servicio o demonio, accesado a través de un puerto. Principalmente con la solución de base de datos se resuelve el problema de la pérdida de información en caso de fallo. Con las otras técnicas la caída de un servidor Web no acarrearía la pérdida de información, pero sí la caída del servidor dedicado, a no ser que dicha información no se almacene en memoria, si no en algún repositorio de información persistente como un archivo o una base de datos.

Un tema interesante al que se le puede seguir el rastro es el concepto de Application Delivery Controller, que ha sido nombrado Next Generation Load Balancer (balanceador de carga de la siguiente generación), el cual consiste en un dispositivo de red que a la hora de asignar un servidor busca el servidor más rápido que esté disponible y maneja aspectos tales como caché y seguridad.