Equilibrio de carga
La necesidad de equilibrio de carga en informática deriva de dos requisitos básicos: En primer lugar, la replicación puede mejorar la alta disponibilidad. En segundo lugar, el rendimiento se puede mejorar a través del procesamiento en paralelo. La alta disponibilidad es la propiedad de un servicio que está disponible durante casi el 100 % del tiempo cuando un cliente intenta obtener acceso al servicio. La calidad de servicio (QoS) para un servicio determinado generalmente incluye varias consideraciones, como los requisitos de rendimiento y latencia.
¿Qué es el equilibrio de carga?
La forma más conocida de equilibrio de carga es el "DNS round robin", que emplean muchos servicios web grandes para equilibrar la carga entre varios servidores. En concreto, varios servidores web front-end, cada uno de ellos con una dirección IP única, comparten un nombre DNS. Para equilibrar el número de solicitudes en cada uno de estos servidores web, las grandes empresas como Google mantienen un grupo de direcciones IP asociado a una única entrada DNS. Cuando un cliente realiza una solicitud (por ejemplo, al dominio www.google.com), el DNS de Google selecciona una de las direcciones disponibles del grupo y la envía al cliente. La estrategia más sencilla empleada para enviar direcciones IP consiste en usar una cola round robin sencilla, donde después de cada respuesta DNS, la lista de direcciones se permuta.
Antes de la llegada de la nube, el equilibrio de carga de DNS era una forma sencilla de encargarse de la latencia de las conexiones de larga distancia. El distribuidor en el servidor DNS estaba programado para responder con la dirección IP del servidor que estaba geográficamente más cerca del cliente. La combinación más sencilla para hacerlo intentaba responder con la dirección IP del grupo numéricamente más cercano a la dirección IP del cliente. Por supuesto, este método no era fiable, ya que las direcciones IP no se distribuyen en una jerarquía global. Las técnicas actuales son más sofisticadas y se basan en una asignación de software de direcciones IP a ubicaciones en función de asignaciones físicas de proveedores de servicios de Internet (ISP). Dado que esto se implementa como una búsqueda de software costosa, este método produce resultados más precisos, pero es caro de calcular. Aun así, el coste de una búsqueda lenta se amortiza, ya que la búsqueda DNS solo se produce cuando el cliente realiza la primera conexión a un servidor. Todas las comunicaciones posteriores se producen directamente entre el cliente y el servidor que posee la dirección IP enviada. En la siguiente figura se muestra un ejemplo de un esquema de equilibrio de carga DNS.
Figura 4: Equilibrio de carga en un entorno de hospedaje de nube.
El inconveniente de este método es que, en caso de que se produzca un error del servidor, ya que el cambio a una dirección IP diferente depende de la configuración del período de vida (TTL) de la memoria caché DNS. Se sabe que las entradas DNS tienen una duración prolongada y que las actualizaciones tardan más de una semana en propagarse a través de Internet. Por tanto, es difícil "ocultarle" rápidamente al cliente un error del servidor. Esto se puede mejorar reduciendo la validez (TTL) de una dirección IP en la memoria caché, pero a expensas del rendimiento y el aumento del número de búsquedas.
En la actualidad, el equilibrio de carga suele hacer referencia al uso de una instancia dedicada (o un par de instancias) que dirige el tráfico entrante a los servidores back-end. Para cada solicitud entrante en un puerto especificado, el equilibrador de carga redirige el tráfico a uno de los servidores back-end según una estrategia de distribución. Cuando lo hace, el equilibrador de carga mantiene los metadatos de la solicitud, incluida información como los encabezados del protocolo de aplicación (por ejemplo, los encabezados HTTP). En esta situación, la información obsoleta no supone un problema, ya que todas las solicitudes pasan a través del equilibrador de carga.
Aunque todos los tipos de equilibradores de carga de red simplemente reenvían la información del usuario junto con todo el contexto a los servidores back-end, cuando devuelven la respuesta al cliente, podrían emplear una de las dos estrategias básicas siguientes:1
- Conexiones proxy: según este método, el equilibrador de carga recibe la respuesta del back-end y la retransmite al cliente. El equilibrador de carga se comporta como un proxy web estándar y participa en las dos partes de una transacción de red, ya que reenvía la solicitud al cliente y devuelve la respuesta.
- Entrega TCP Según este método, la conexión TCP con el cliente se entrega al servidor back-end. En consecuencia, el servidor envía la respuesta directamente al cliente, sin pasar por el equilibrador de carga.
Figura 5: Mecanismo de entrega TCP del distribuidor al servidor back-end
Impacto en la disponibilidad y el rendimiento
El equilibrio de carga es una estrategia importante para enmascarar los errores en un sistema. Siempre que el cliente del sistema se exponga a un único punto de conexión que equilibre la carga entre varios recursos, los errores en recursos individuales se pueden enmascarar desde el cliente simplemente atendiendo la solicitud en otro recurso. Pero es importante tener en cuenta que el equilibrador de carga ahora es un único punto de error en el servicio. Si se produce un error por alguna razón, aunque todos los servidores back-end sigan funcionando, no se podrá enviar ninguna solicitud del cliente. Por lo tanto, para lograr una alta disponibilidad, los equilibradores de carga se suelen implementar por parejas.
El equilibrio de carga permite que un servicio distribuya las cargas de trabajo entre varios recursos de proceso en la nube. El hecho de tener una única instancia de proceso en la nube tiene varias limitaciones. Se ha tratado anteriormente el tema de la limitación física del rendimiento, cuando se requieren más recursos para aumentar las cargas de trabajo. Mediante el equilibrio de carga, los volúmenes de cargas de trabajo de mayor tamaño se pueden distribuir entre varios recursos, de modo que cada recurso pueda satisfacer sus solicitudes de forma independiente y en paralelo, por lo que se mejora el rendimiento de la aplicación. Esto también mejora los tiempos de servicio medios, ya que hay más servidores para enviar la carga de trabajo.
Los servicios de comprobación y supervisión son claves para permitir el éxito de las estrategias de equilibrio de carga. Un equilibrador de carga debe cerciorarse de que cada solicitud se cumple, asegurando que cada nodo de recursos esté disponible. En caso contrario, el tráfico no se dirige a ese nodo específico. La supervisión de eco de ping es una de las tácticas más populares que se usan para comprobar el estado de un nodo de recursos específico. Además del estado de un nodo, algunas estrategias de equilibrio de carga requieren información adicional, como el rendimiento, la latencia y el uso de CPU, para evaluar el recurso más adecuado para dirigir el tráfico.
Muchas veces, los equilibradores de carga deben garantizar una alta disponibilidad. La manera más sencilla de hacerlo consiste en crear varias instancias de equilibrio de carga (cada una de ellas con una dirección IP única) y vincular cada una de ellas a una dirección DNS única. Cada vez que se produzca un error en una instancia del equilibrador de carga por cualquier motivo, se reemplazará por una nueva y todo el tráfico se pasará a la instancia de conmutación por error con un impacto de escasa importancia en el rendimiento. Al mismo tiempo, se puede configurar una nueva instancia del equilibrador de carga para reemplazar el que presentó el error, y deberían actualizarse los registros DNS de inmediato.
Estrategias para el equilibrio de carga
En la nube, hay varias estrategias de equilibrio de carga.
Distribución equitativa
Se trata de un enfoque estático para el equilibrio de carga en el que se usa un algoritmo round robin sencillo para dividir el tráfico entre todos los nodos de forma uniforme y no tiene en cuenta la utilización de ningún nodo de recursos individual en el sistema o el tiempo de ejecución de cualquier solicitud. Este enfoque intenta mantener ocupados todos los nodos del sistema y es uno de los enfoques más sencillos de implementar. Una desventaja importante de este enfoque es que las solicitudes de cliente intensas pueden agregar y alcanzar los mismos centros de datos, lo que provoca que algunos nodos se sobrecarguen mientras que otros permanecen infrautilizados. Pero, para ello, se requiere un modelo de carga muy específico algo que no es muy probable que se produzca en la práctica en un gran número de clientes y servidores con una distribución y capacidad de conexión bastante uniformes. Por otro lado, esta estrategia dificulta la implementación de estrategias de almacenamiento en caché en el centro de datos que tienen en cuenta consideraciones como el emplazamiento espacial (dónde se capturan y almacenan en caché los datos cerca de los datos que se capturaron actualmente), ya que la siguiente solicitud realizada por el mismo cliente podría acabar en un servidor diferente.
AWS usa este enfoque en su oferta de ELB (Elastic Load Balancer). ELB de AWS aprovisiona equilibradores de carga que equilibran el tráfico entre las instancias de EC2 asociadas. Los equilibradores de carga son básicamente instancias de EC2 con un servicio para enrutar el tráfico de forma específica. A medida que se escalan horizontalmente los recursos subyacentes al equilibrador de carga, se actualizan las direcciones IP de los nuevos recursos en el registro DNS del equilibrador de carga. Este proceso tarda varios minutos en completarse, ya que requiere tiempo de supervisión y aprovisionamiento. Este período de escalado (el tiempo hasta que el equilibrador de carga puede controlar la carga más alta) se conoce como "preparación" del equilibrador de carga.
Los equilibradores de carga de ELB de AWS también supervisan cada uno de los recursos asociados para la distribución de cargas de trabajo a fin de realizar una comprobación del mantenimiento. Se usa un mecanismo de eco de ping para asegurarse de que todos los recursos se encuentren en un estado correcto. Los usuarios de ELB pueden configurar los parámetros de la comprobación de mantenimiento mediante el establecimiento de los retrasos y el número de reintentos.
Distribución basada en hash
Este enfoque intenta asegurarse de que, en cualquier momento, las solicitudes realizadas por un cliente a través de la misma conexión terminen siempre en el mismo servidor. Además, para equilibrar la distribución del tráfico de las solicitudes, esta se realiza en un orden aleatorio. Esto presenta varias ventajas con respecto al enfoque round robin, ya que ayuda en aplicaciones basadas en sesiones, donde la persistencia de estado y las estrategias de almacenamiento en caché pueden ser mucho más sencillas. También es menos susceptible a los patrones de tráfico que provocarían que un solo servidor se atascase, ya que la distribución es aleatoria, aunque este riesgo todavía existe. En cambio, puesto que cada solicitud debe evaluarse para los metadatos de conexión con el fin de enrutarla a un servidor relevante, introduce una pequeña cantidad de latencia en cada solicitud.
Azure Load Balancer utiliza este mecanismo de distribución basado en hash para distribuir la carga. Este mecanismo crea un hash para cada solicitud en función de la IP de origen, el puerto de origen, la dirección IP de destino, el puerto de destino y el tipo de protocolo. De esta manera, se asegura de que todos los paquetes de la misma conexión siempre llegan al mismo servidor. La función hash se elige de modo que la distribución de las conexiones a los servidores sea bastante aleatoria.
Azure proporciona comprobaciones de estado a través de tres tipos de sondeos: Sondeos de agentes invitados (en máquinas virtuales PaaS), sondeos HTTP personalizados y sondeos TCP personalizados. Los tres sondeos proporcionan una comprobación de estado para los nodos de recursos a través de un mecanismo de eco de ping.
Otras estrategias populares
Hay otras estrategias que se usan para equilibrar la carga entre varios recursos. Cada una de ellas usa diferentes métricas para medir el nodo de recursos más apropiado para una solicitud determinada:
- Estrategias basadas en el tiempo de ejecución de solicitudes: Estas estrategias usan un algoritmo de programación de prioridades, en el que los tiempos de ejecución de las solicitudes se usan para juzgar el orden más adecuado de distribución de la carga. El principal desafío al usar este enfoque consiste en predecir con precisión los tiempos de ejecución de una solicitud en particular.
- Estrategias basadas en el uso de recursos: Estas estrategias utilizan el uso de la CPU en cada nodo de recursos para equilibrar el uso en cada nodo. Los equilibradores de carga mantienen una lista ordenada de recursos en función de su uso y, después, dirigen las solicitudes al nodo menos cargado.
Otras ventajas
Tener un equilibrador de carga centralizado se presta a varias estrategias que pueden aumentar el rendimiento del servicio. Pero es importante tener en cuenta que estas estrategias solo funcionan siempre que el equilibrador de carga no se encuentre bajo una carga insuperable. De lo contrario, el propio equilibrador de carga se convertirá en el cuello de botella. A continuación se enumeran algunas de estas estrategias:
- Descarga SSL: Las transacciones de red a través de SSL tienen un costo adicional asociado, ya que necesitan tener procesamiento para el cifrado y la autenticación. En lugar de atender todas las solicitudes a través de SSL, la conexión de cliente con el equilibrador de carga se puede realizar a través de SSL, mientras que las solicitudes de redireccionamiento a cada servidor individual se pueden realizar a través de HTTP. De esta manera se reduce considerablemente la carga en los servidores. Además, se mantiene la seguridad, siempre y cuando las solicitudes de redireccionamiento no se realicen a través de una red abierta.
- Almacenamiento en búfer de TCP: Esta es una estrategia para descargar clientes con conexiones lentas al equilibrador de carga para aliviar los servidores que atienden las respuestas a estos clientes.
- Almacenamiento en caché: en algunas situaciones, el equilibrador de carga puede mantener una memoria caché para las solicitudes más populares (o para las solicitudes que se pueden controlar sin recurrir a los servidores, como el contenido estático) de forma que se reduzca la carga en los servidores.
- Conformado de tráfico: En el caso de algunas aplicaciones, se puede usar un equilibrador de carga para retrasar o volver a priorizar el flujo de paquetes de modo que el tráfico se pueda moldear para adaptarse a la configuración del servidor. Esto afecta a la calidad del servicio en algunas solicitudes, pero garantiza que se pueda atender la carga entrante.
Referencias
- Aron, Mohit; Sanders, Darren; Druschel, Peter; y Zwaenepoel, Willy (2000). Scalable content-aware request distribution in cluster-based network servers (Distribución de solicitudes con reconocimiento de contenido escalable en servidores de red basados en clúster), en las actas de la conferencia técnica anual USENIX de 2000.