
En informática , el balanceo de carga es el proceso de distribuir un conjunto de tareas entre un conjunto de recursos (unidades de procesamiento) con el objetivo de hacer que su procesamiento general sea más eficiente. El balanceo de carga puede optimizar el tiempo de respuesta y evitar la sobrecarga desigual de algunos nodos de procesamiento mientras otros permanecen inactivos.
El balanceo de carga es objeto de investigación en el campo de la computación paralela . Existen dos enfoques principales: los algoritmos estáticos, que no tienen en cuenta el estado de las diferentes máquinas, y los algoritmos dinámicos, que suelen ser más generales y eficientes, pero requieren el intercambio de información entre las distintas unidades de cálculo, con el riesgo de una pérdida de eficiencia.
Descripción general del problema
Un algoritmo de balanceo de carga siempre intenta resolver un problema específico. Entre otros factores, deben tenerse en cuenta la naturaleza de las tareas, la complejidad algorítmica , la arquitectura de hardware en la que se ejecutarán los algoritmos y la tolerancia a errores requerida . Por lo tanto, es necesario encontrar un equilibrio para satisfacer de la mejor manera los requisitos específicos de la aplicación.
Naturaleza de las tareas
La eficiencia de los algoritmos de balanceo de carga depende fundamentalmente de la naturaleza de las tareas. Por lo tanto, cuanta más información se tenga sobre las tareas en el momento de la toma de decisiones, mayor será el potencial de optimización.
Tamaño de las tareas
El conocimiento preciso del tiempo de ejecución de cada tarea permite alcanzar una distribución de carga óptima (véase el algoritmo de suma de prefijos ). [ 1 ] Desafortunadamente, este es un caso idealizado. Conocer el tiempo de ejecución exacto de cada tarea es una situación extremadamente rara.
Por este motivo, existen diversas técnicas para estimar los diferentes tiempos de ejecución. En primer lugar, cuando las tareas tienen un tamaño relativamente homogéneo, se puede considerar que cada una requerirá aproximadamente el tiempo de ejecución promedio. Si, por el contrario, el tiempo de ejecución es considerablemente irregular, se pueden utilizar otras técnicas. Una de ellas consiste en añadir metadatos a cada tarea. Basándose en el tiempo de ejecución previo para metadatos similares, es posible realizar inferencias para una tarea futura a partir de estadísticas. [ 2 ]
Dependencias
En algunos casos, las tareas dependen unas de otras. Estas interdependencias pueden ilustrarse mediante un grafo dirigido acíclico . Intuitivamente, algunas tareas no pueden comenzar hasta que otras hayan finalizado.
Suponiendo que se conoce de antemano el tiempo requerido para cada tarea, un orden de ejecución óptimo debe minimizar el tiempo total de ejecución. Sin embargo, este es un problema NP-difícil y, por lo tanto, puede ser difícil de resolver con exactitud. Existen algoritmos, como el planificador de tareas , que calculan distribuciones óptimas de tareas mediante métodos metaheurísticos .
Segregación de tareas
Otra característica fundamental de las tareas para el diseño de un algoritmo de balanceo de carga es su capacidad para dividirse en subtareas durante la ejecución. El algoritmo de cálculo en forma de árbol que se presenta más adelante aprovecha al máximo esta particularidad.
Algoritmos estáticos y dinámicos
Estático
Un algoritmo de balanceo de carga es "estático" cuando no considera el estado del sistema para la distribución de tareas. El estado del sistema incluye parámetros como el nivel de carga (e incluso la sobrecarga) de ciertos procesadores. En cambio, se hacen suposiciones previas sobre el sistema en general, como los tiempos de llegada y los requisitos de recursos de las tareas entrantes. Además, se conoce el número de procesadores, su potencia y sus velocidades de comunicación. Por lo tanto, el balanceo de carga estático busca asociar un conjunto conocido de tareas con los procesadores disponibles para minimizar una función de rendimiento determinada. La función de rendimiento es la clave del diseño.
Las técnicas de balanceo de carga estático suelen estar centralizadas en torno a un enrutador , o maestro , que distribuye las cargas y optimiza la función de rendimiento. Esta minimización puede tener en cuenta información relacionada con las tareas que se van a distribuir y calcular un tiempo de ejecución previsto.
La ventaja de los algoritmos estáticos radica en su facilidad de configuración y su eficiencia en tareas relativamente regulares (como el procesamiento de solicitudes HTTP de un sitio web). Sin embargo, aún existe cierta variabilidad estadística en la asignación de tareas, lo que puede provocar la sobrecarga de algunas unidades de procesamiento.
Dinámica
A diferencia de los algoritmos de distribución de carga estática, los algoritmos dinámicos tienen en cuenta la carga actual de cada una de las unidades de computación (también llamadas nodos) del sistema. Con este enfoque, las tareas se pueden mover dinámicamente de un nodo sobrecargado a uno con menor carga para que se procesen más rápidamente. Si bien el diseño de estos algoritmos es mucho más complejo, pueden mejorar el rendimiento, en particular cuando el tiempo de ejecución varía considerablemente entre las distintas tareas.
La arquitectura de balanceo de carga dinámico puede ser más modular, ya que no es obligatorio tener un nodo específico dedicado a la distribución del trabajo. Cuando las tareas se asignan de forma única a un procesador según su estado en un momento dado, se trata de una asignación única. Si, por otro lado, las tareas pueden redistribuirse permanentemente según el estado del sistema y su evolución, se habla de asignación dinámica. [ 3 ] Un algoritmo de balanceo de carga que requiere demasiada comunicación para tomar decisiones corre el riesgo de ralentizar la resolución del problema general.
Arquitectura de hardware
Máquinas heterogéneas
Las infraestructuras de computación paralela suelen estar compuestas por unidades con diferente capacidad de procesamiento , lo que debe tenerse en cuenta para la distribución de la carga.
Por ejemplo, las unidades de menor potencia pueden recibir solicitudes que requieren una menor cantidad de cálculo o, en el caso de solicitudes de tamaño homogéneo o desconocido, recibir menos solicitudes que las unidades más grandes.
Memoria compartida y distribuida
Los ordenadores paralelos suelen dividirse en dos grandes categorías: aquellos en los que todos los procesadores comparten una única memoria común en la que leen y escriben en paralelo ( modelo PRAM ), y aquellos en los que cada unidad de cálculo tiene su propia memoria ( modelo de memoria distribuida ), y en los que la información se intercambia mediante mensajes.
En los ordenadores con memoria compartida , la gestión de conflictos de escritura ralentiza considerablemente la ejecución individual de cada unidad de procesamiento. Sin embargo, pueden funcionar perfectamente en paralelo. Por el contrario, en el caso del intercambio de mensajes, cada procesador puede trabajar a máxima velocidad. En cambio, en el intercambio colectivo de mensajes, todos los procesadores se ven obligados a esperar a que los más lentos inicien la comunicación.
En realidad, pocos sistemas se ajustan exactamente a una de las categorías. Por lo general, cada procesador dispone de una memoria interna para almacenar los datos necesarios para los cálculos posteriores y se organiza en clústeres sucesivos . A menudo, estos elementos de procesamiento se coordinan mediante memoria distribuida y paso de mensajes . Por lo tanto, el algoritmo de balanceo de carga debe estar específicamente adaptado a una arquitectura paralela. De lo contrario, existe el riesgo de que la eficiencia de la resolución de problemas en paralelo se vea considerablemente reducida.
Jerarquía
Adaptados a las estructuras de hardware descritas anteriormente, existen dos categorías principales de algoritmos de balanceo de carga. Por un lado, está aquel en el que las tareas son asignadas por el "maestro" y ejecutadas por los "trabajadores", quienes mantienen al maestro informado del progreso de su trabajo. En el caso del algoritmo dinámico, el maestro puede entonces encargarse de asignar o reasignar la carga de trabajo. La literatura se refiere a esto como arquitectura maestro-trabajador . Por otro lado, el control puede distribuirse entre los diferentes nodos. El algoritmo de balanceo de carga se ejecuta en cada uno de ellos y la responsabilidad de asignar tareas (así como reasignarlas y dividirlas según corresponda) se comparte. La última categoría asume un algoritmo de balanceo de carga dinámico.
Dado que el diseño de cada algoritmo de balanceo de carga es único, es necesario matizar la distinción anterior. Así, también es posible adoptar una estrategia intermedia, con, por ejemplo, nodos "maestros" para cada subgrupo, los cuales, a su vez, están sujetos a un "maestro" global. Asimismo, existen organizaciones multinivel, con una alternancia entre estrategias maestro-esclavo y de control distribuido. Estas últimas estrategias se vuelven rápidamente complejas y rara vez se utilizan. Los diseñadores prefieren algoritmos más fáciles de controlar.
Adaptación a arquitecturas más grandes (escalabilidad)
En el contexto de algoritmos que se ejecutan a muy largo plazo (servidores, nube, etc.), la arquitectura informática evoluciona con el tiempo. Sin embargo, es preferible no tener que diseñar un nuevo algoritmo cada vez.
Por lo tanto, un parámetro de un algoritmo de balanceo de carga es su capacidad de adaptación a una arquitectura de hardware escalable. Esto se conoce como la escalabilidad del algoritmo. Un algoritmo se considera escalable para un parámetro de entrada cuando su rendimiento permanece relativamente independiente del tamaño de dicho parámetro.
Cuando un algoritmo es capaz de adaptarse a un número variable de unidades de cómputo, pero dicho número debe fijarse antes de su ejecución, se denomina moldeable. Si, por el contrario, el algoritmo es capaz de gestionar una cantidad fluctuante de procesadores durante su ejecución, se dice que es maleable. La mayoría de los algoritmos de balanceo de carga son, como mínimo, moldeables. [ 4 ]
Tolerancia a fallos
Especialmente en clústeres de computación a gran escala , no es tolerable ejecutar un algoritmo paralelo que no pueda soportar la falla de un solo componente. Por lo tanto, se están desarrollando algoritmos tolerantes a fallas que pueden detectar interrupciones de procesadores y recuperar el cálculo. [ 5 ]
Aproches
Distribución estática con pleno conocimiento de las tareas: suma de prefijos
Si las tareas son independientes entre sí, y si su tiempo de ejecución respectivo y las tareas se pueden subdividir, se dispone de un algoritmo óptimo bajo estas suposiciones.

Al dividir las tareas de forma que cada procesador reciba la misma cantidad de cálculo, solo queda agrupar los resultados. Mediante un algoritmo de suma de prefijos , esta división se puede calcular en tiempo logarítmico con respecto al número de procesadores.
Sin embargo, si las tareas no se pueden subdividir (es decir, son atómicas ), aunque optimizar la asignación de tareas es un problema difícil, aún es posible aproximar una distribución relativamente justa de las tareas, siempre que el tamaño de cada una de ellas sea mucho menor que el cálculo total realizado por cada uno de los nodos. [ 1 ]
En la mayoría de los casos, se desconoce el tiempo de ejecución de una tarea y solo se dispone de aproximaciones generales. Este algoritmo puede ser eficiente bajo estas suposiciones, pero resulta menos aplicable cuando se desconoce la duración de las tareas.
Distribución de carga estática sin conocimiento previo
Aunque no se conozca de antemano el tiempo de ejecución, siempre es posible la distribución estática de la carga.
En un algoritmo round-robin, la primera solicitud se envía al primer servidor, la siguiente al segundo, y así sucesivamente hasta el último. Luego, el ciclo se reinicia, asignando la siguiente solicitud al primer servidor, y así sucesivamente.
Este algoritmo puede ponderarse de tal manera que las unidades más potentes reciban el mayor número de solicitudes y las reciban primero.
Estático aleatorio
El balanceo de carga estático aleatorio consiste simplemente en asignar tareas al azar a los distintos servidores. Este método funciona bastante bien. Si, por otro lado, se conoce de antemano el número de tareas, resulta aún más eficiente calcular una permutación aleatoria con antelación. Esto evita los costes de comunicación para cada asignación. Ya no es necesario un maestro de distribución, puesto que cada procesador sabe qué tarea se le ha asignado. Incluso si se desconoce el número de tareas, aún es posible evitar la comunicación mediante una generación de asignación pseudoaleatoria conocida por todos los procesadores.
El rendimiento de esta estrategia (medido en tiempo total de ejecución para un conjunto fijo de tareas) disminuye con el tamaño máximo de las tareas.
Otros
También existen otros métodos de asignación:
- Menos conexiones: asigna las nuevas solicitudes al servidor con el menor número de conexiones activas; el método también puede ponderarse. [ 6 ]
- Hash: asigna las consultas según una tabla hash .
- Poder de dos opciones: elige dos servidores al azar y elige la mejor de las dos opciones. [ 7 ] [ 8 ]
Plan de maestro-trabajador
Los esquemas maestro-trabajador se encuentran entre los algoritmos de balanceo de carga dinámico más sencillos. Un maestro distribuye la carga de trabajo entre todos los trabajadores (también llamados a veces "esclavos"). Inicialmente, todos los trabajadores están inactivos e informan de ello al maestro. El maestro responde a las solicitudes de los trabajadores y les asigna las tareas. Cuando ya no tiene más tareas disponibles, informa a los trabajadores para que dejen de solicitarlas.
Este esquema permite distribuir el trabajo de manera uniforme cuando la sobrecarga de asignación es baja. Sin tener en cuenta el tiempo necesario para la asignación, el tiempo de ejecución sería comparable a la suma de prefijos mostrada anteriormente.
El problema con este algoritmo es que tiene dificultades para adaptarse a un gran número de procesadores debido a la gran cantidad de comunicaciones necesarias. Esta falta de escalabilidad lo vuelve rápidamente inoperable en servidores muy grandes o en supercomputadoras paralelas muy grandes. El nodo maestro actúa como un cuello de botella .

Sin embargo, la calidad del algoritmo puede mejorarse considerablemente reemplazando el nodo maestro por una lista de tareas que puedan utilizar diferentes procesadores. Si bien este algoritmo puede ser algo más complejo de implementar, mejora la escalabilidad, aunque sigue siendo insuficiente para centros de computación de gran tamaño.
Arquitectura no jerárquica, sin conocimiento del sistema: robo de trabajo.
Otra técnica para superar los problemas de escalabilidad cuando se desconoce el tiempo necesario para completar una tarea es el robo de trabajo .
Este enfoque consiste en asignar a cada procesador un número determinado de tareas de forma aleatoria o predefinida, permitiendo luego que los procesadores inactivos «roben» trabajo a los procesadores activos o sobrecargados. Existen diversas implementaciones de este concepto, definidas por un modelo de división de tareas y por las reglas que rigen el intercambio entre procesadores. Si bien esta técnica puede ser particularmente eficaz, su implementación resulta compleja, ya que es necesario garantizar que la comunicación no se convierta en la principal ocupación de los procesadores en lugar de la resolución del problema.
En el caso de tareas atómicas, se pueden distinguir dos estrategias principales: aquellas en las que los procesadores con baja carga ofrecen su capacidad de cómputo a los de mayor carga, y aquellas en las que las unidades más cargadas desean aligerar la carga de trabajo asignada. Se ha demostrado [ 9 ] que cuando la red está muy cargada, es más eficiente que las unidades menos cargadas ofrezcan su disponibilidad, y cuando la red está poco cargada, son los procesadores sobrecargados los que requieren el apoyo de los menos activos. Esta regla general limita el número de mensajes intercambiados.
En el caso de que se parta de una única tarea grande que no se puede dividir más allá de un nivel atómico, se puede utilizar un algoritmo de "computación en forma de árbol" [ 10 ] donde la tarea principal se distribuye en un árbol de trabajo.
Principio
Inicialmente, muchos procesadores tienen una tarea vacía, excepto uno que trabaja secuencialmente en ella. Los procesadores inactivos emiten solicitudes aleatoriamente a otros procesadores (no necesariamente activos). Si este último puede subdividir la tarea en la que está trabajando, lo hace enviando parte de su trabajo al nodo que realiza la solicitud. De lo contrario, devuelve una tarea vacía. Esto induce una estructura de árbol . Entonces es necesario enviar una señal de terminación al procesador padre cuando la subtarea se completa para que, a su vez, envíe el mensaje a su padre hasta llegar a la raíz del árbol. Cuando el primer procesador, es decir, la raíz, ha terminado, se puede difundir un mensaje de terminación global. Finalmente, es necesario ensamblar los resultados recorriendo el árbol de vuelta hacia arriba.
Eficiencia
La eficiencia de dicho algoritmo se aproxima a la suma de prefijos cuando el tiempo de procesamiento y comunicación no es demasiado elevado en comparación con la carga de trabajo. Para evitar costes de comunicación excesivos, se puede imaginar una lista de tareas en memoria compartida . Por lo tanto, una solicitud consiste simplemente en leer desde una posición específica de esta memoria compartida a petición del procesador principal.
Casos de uso
Además de la resolución eficiente de problemas mediante cálculos paralelos, los algoritmos de equilibrio de carga se utilizan ampliamente en la gestión de solicitudes HTTP , donde un sitio con una gran audiencia debe ser capaz de manejar una gran cantidad de solicitudes por segundo.
Servicios basados en Internet
Una de las aplicaciones más comunes del balanceo de carga es proporcionar un único servicio de Internet desde múltiples servidores , lo que a veces se conoce como granja de servidores . Los sistemas que suelen utilizar balanceo de carga incluyen sitios web populares , grandes redes de Internet Relay Chat (IRC), sitios FTP ( Protocolo de Transferencia de Archivos ) de alto ancho de banda , servidores NNTP ( Protocolo de Transferencia de Noticias de Red ), servidores DNS ( Sistema de Nombres de Dominio ) y bases de datos.
DNS de tipo round-robin
El DNS round-robin es un método alternativo de balanceo de carga que no requiere un nodo de software o hardware dedicado. En esta técnica, se asocian varias direcciones IP a un único nombre de dominio ; a los clientes se les asigna una IP de forma rotativa. La IP se asigna a los clientes con una caducidad corta, de modo que es más probable que utilicen una IP diferente la próxima vez que accedan al servicio de Internet solicitado.
delegación DNS
Otra técnica más eficaz para el balanceo de carga mediante DNS consiste en delegar www.example.org como un subdominio cuya zona sea gestionada por cada uno de los mismos servidores que alojan el sitio web. Esta técnica funciona especialmente bien cuando los servidores individuales están distribuidos geográficamente en Internet. Por ejemplo:
- one.example.org A 192.0.2.1
- two.example.org A 203.0.113.2
- www.example.org NS one.example.org
- www.example.org NS two.example.org
Sin embargo, el archivo de zona para www.example.org en cada servidor es diferente, de modo que cada servidor resuelve su propia dirección IP como el registro A. [ 11 ] En el servidor uno, el archivo de zona para www.example.org informa:
- @ en 192.0.2.1
En el servidor dos, el mismo archivo de zona contiene:
- @ en un 203.0.113.2
De esta forma, cuando un servidor falla, su DNS no responde y el servicio web no recibe tráfico. Si la conexión a un servidor está congestionada, la inestabilidad del DNS garantiza que llegue menos tráfico HTTP a ese servidor. Además, la respuesta DNS más rápida al resolvedor casi siempre proviene del servidor más cercano a la red, lo que asegura un equilibrio de carga georreferenciado . Un TTL corto en el registro A ayuda a redirigir rápidamente el tráfico cuando un servidor falla. Es importante considerar la posibilidad de que esta técnica provoque que los clientes cambien de servidor durante la sesión.
Balanceo de carga aleatorio del lado del cliente
Otro enfoque para el balanceo de carga consiste en entregar una lista de direcciones IP de servidores al cliente y, posteriormente, permitir que este seleccione aleatoriamente la IP de la lista en cada conexión. [ 12 ] [ 13 ] Esto se basa esencialmente en que todos los clientes generen cargas similares y en la ley de los grandes números [ 13 ] para lograr una distribución de carga razonablemente uniforme entre los servidores. Se ha afirmado que el balanceo de carga aleatorio del lado del cliente tiende a proporcionar una mejor distribución de carga que el DNS round-robin; esto se ha atribuido a problemas de almacenamiento en caché con el DNS round-robin, que, en el caso de grandes servidores de caché DNS, tienden a distorsionar la distribución para el DNS round-robin, mientras que la selección aleatoria del lado del cliente permanece inalterada independientemente del almacenamiento en caché DNS. [ 13 ]
Con este enfoque, el método de entrega de una lista de direcciones IP al cliente puede variar y puede implementarse como una lista DNS (entregada a todos los clientes sin ningún tipo de distribución equitativa) o mediante su codificación directa en la lista. Si se utiliza un "cliente inteligente" que detecta que un servidor seleccionado aleatoriamente está caído y se conecta de nuevo aleatoriamente, también proporciona tolerancia a fallos .
Balanceadores de carga del lado del servidor
En los servicios de Internet, un balanceador de carga del lado del servidor suele ser un programa que escucha en el puerto donde los clientes externos se conectan para acceder a los servicios. El balanceador de carga reenvía las solicitudes a uno de los servidores de backend, que normalmente responde al balanceador. Esto permite que el balanceador de carga responda al cliente sin que este tenga conocimiento de la separación interna de funciones. Además, impide que los clientes contacten directamente con los servidores de backend, lo que puede ofrecer ventajas de seguridad al ocultar la estructura de la red interna y prevenir ataques a la pila de red del kernel o a servicios no relacionados que se ejecutan en otros puertos.
Algunos balanceadores de carga ofrecen un mecanismo para realizar acciones especiales en caso de que todos los servidores backend no estén disponibles. Esto podría incluir el reenvío a un balanceador de carga de respaldo o la visualización de un mensaje sobre la interrupción del servicio.
También es importante que el propio balanceador de carga no se convierta en un punto único de fallo . Por lo general, los balanceadores de carga se implementan en pares de alta disponibilidad que también pueden replicar los datos de persistencia de sesión si la aplicación específica lo requiere. [ 14 ] Ciertas aplicaciones se programan para ser inmunes a este problema, desplazando el punto de balanceo de carga a través de plataformas de compartición diferencial más allá de la red definida. Los algoritmos secuenciales asociados a estas funciones se definen mediante parámetros flexibles únicos para la base de datos específica. [ 15 ]
Algoritmos de planificación
Los balanceadores de carga utilizan numerosos algoritmos de planificación , también llamados métodos de equilibrio de carga, para determinar a qué servidor back-end enviar una solicitud. Los algoritmos simples incluyen selección aleatoria, round robin o menor número de conexiones. [ 16 ] Los balanceadores de carga más sofisticados pueden tener en cuenta factores adicionales, como la carga reportada de un servidor, los tiempos de respuesta mínimos, el estado activo/inactivo (determinado por algún tipo de sondeo de monitoreo), el número de conexiones activas, la ubicación geográfica, las capacidades o la cantidad de tráfico que se le ha asignado recientemente.
Persistencia
Un aspecto importante al operar un servicio con balanceo de carga es cómo gestionar la información que debe conservarse entre las múltiples solicitudes de la sesión de un usuario. Si esta información se almacena localmente en un servidor backend, las solicitudes posteriores dirigidas a diferentes servidores backend no podrán acceder a ella. Podría tratarse de información almacenada en caché que se puede recalcular, en cuyo caso el balanceo de carga de una solicitud a un servidor backend diferente solo genera un problema de rendimiento. [ 16 ]
Idealmente, el clúster de servidores detrás del balanceador de carga no debería tener en cuenta las sesiones, de modo que si un cliente se conecta a cualquier servidor backend en cualquier momento, la experiencia del usuario no se vea afectada. Esto generalmente se logra con una base de datos compartida o una base de datos de sesión en memoria como Memcached .
Una solución básica al problema de los datos de sesión consiste en enviar todas las solicitudes de una sesión de usuario de forma consistente al mismo servidor backend. Esto se conoce como «persistencia» o «fijación». Una desventaja importante de esta técnica es la falta de conmutación por error automática : si un servidor backend falla, su información de sesión se vuelve inaccesible y se pierden todas las sesiones que dependen de ella. Este mismo problema suele afectar a los servidores de bases de datos centrales; aunque los servidores web no tengan estado y no sean «fijos», la base de datos central sí lo es (véase más abajo).
La asignación a un servidor específico puede basarse en un nombre de usuario, la dirección IP del cliente o ser aleatoria. Debido a los cambios en la dirección percibida por el cliente como resultado de DHCP , la traducción de direcciones de red y los proxies web , este método puede ser poco fiable. El balanceador de carga debe recordar las asignaciones aleatorias, lo que supone una carga para el almacenamiento. Si el balanceador de carga se reemplaza o falla, esta información puede perderse y las asignaciones podrían tener que eliminarse después de un período de tiempo de espera o durante períodos de alta carga para evitar exceder el espacio disponible en la tabla de asignaciones. El método de asignación aleatoria también requiere que los clientes mantengan cierto estado, lo que puede ser un problema, por ejemplo, cuando un navegador web ha deshabilitado el almacenamiento de cookies. Los balanceadores de carga sofisticados utilizan múltiples técnicas de persistencia para evitar algunas de las deficiencias de cualquier método individual.
Otra solución consiste en almacenar los datos de cada sesión en una base de datos . Esto puede reducir el rendimiento, ya que aumenta la carga en la base de datos: esta se utiliza mejor para almacenar información menos transitoria que los datos de cada sesión. Para evitar que una base de datos se convierta en un punto único de fallo y para mejorar la escalabilidad , a menudo se replica en varias máquinas y se utiliza el balanceo de carga para distribuir la carga de consultas entre esas réplicas. La tecnología ASP.NET State Server de Microsoft es un ejemplo de base de datos de sesión. Todos los servidores de una granja web almacenan sus datos de sesión en State Server y cualquier servidor de la granja puede recuperarlos.
Cuando el cliente es un navegador web, una opción es almacenar los datos de sesión en el propio navegador. Una forma de lograrlo es mediante una cookie del navegador , debidamente marcada con fecha y hora y encriptada. Otra opción es la reescritura de URL . Almacenar los datos de sesión en el cliente suele ser la solución preferida: así, el balanceador de carga puede elegir cualquier servidor backend para gestionar una solicitud. Sin embargo, este método de gestión de datos de estado puede resultar inadecuado para algunos escenarios de lógica empresarial complejos , donde la carga útil del estado de la sesión es grande y recalcularla con cada solicitud en un servidor no es factible. La reescritura de URL presenta importantes problemas de seguridad, ya que el usuario final puede modificar fácilmente la URL enviada y, por lo tanto, cambiar los flujos de sesión.
Otra solución para almacenar datos persistentes consiste en asociar un nombre a cada bloque de datos y utilizar una tabla hash distribuida para asignar ese nombre de forma pseudoaleatoria a uno de los servidores disponibles, y luego almacenar ese bloque de datos en el servidor asignado.
Características del balanceador de carga
Los balanceadores de carga de hardware y software pueden tener diversas características especiales. La característica fundamental de un balanceador de carga es la capacidad de distribuir las solicitudes entrantes entre varios servidores backend del clúster según un algoritmo de planificación. La mayoría de las siguientes características son específicas del proveedor:
- carga asimétrica
- Se puede asignar manualmente una proporción para que algunos servidores backend reciban una mayor parte de la carga de trabajo que otros. Esto se utiliza a veces como una forma sencilla de compensar la mayor capacidad de algunos servidores, aunque no siempre funciona como se desea.
- Activación prioritaria
- Cuando el número de servidores disponibles cae por debajo de una determinada cantidad, o la carga es demasiado alta, se pueden poner en funcionamiento servidores de reserva.
- Descarga y aceleración de TLS
- La aceleración TLS (o su predecesor SSL) es una técnica que descarga los cálculos del protocolo criptográfico en hardware especializado. Dependiendo de la carga de trabajo, el procesamiento de los requisitos de cifrado y autenticación de una solicitud TLS puede representar una parte importante de la demanda de la CPU del servidor web; a medida que aumenta la demanda, los usuarios experimentarán tiempos de respuesta más lentos, ya que la sobrecarga de TLS se distribuye entre los servidores web. Para reducir esta demanda en los servidores web, un balanceador de carga puede finalizar las conexiones TLS, pasando las solicitudes HTTPS como solicitudes HTTP a los servidores web. Si el balanceador no está sobrecargado, esto no degrada notablemente el rendimiento percibido por los usuarios finales. La desventaja de este enfoque es que todo el procesamiento de TLS se concentra en un solo dispositivo (el balanceador), lo que puede convertirse en un nuevo cuello de botella. Algunos balanceadores de carga incluyen hardware especializado para procesar TLS. En lugar de actualizar el balanceador de carga, que es un hardware dedicado bastante costoso, puede resultar más económico prescindir de la descarga de TLS y añadir algunos servidores web. Además, algunos proveedores de servidores, como Oracle/Sun, incorporan ahora hardware de aceleración criptográfica en sus CPU, como la T2000. F5 Networks integra una tarjeta de hardware de aceleración TLS dedicada en su gestor de tráfico local (LTM), que se utiliza para cifrar y descifrar el tráfico TLS. Una clara ventaja de la descarga de TLS en el balanceador es que le permite realizar el balanceo o la conmutación de contenido en función de los datos de la solicitud HTTPS.
- Protección contra ataques de denegación de servicio distribuido (DDoS).
- Los balanceadores de carga pueden proporcionar funciones como cookies SYN y enlace diferido (los servidores back-end no ven al cliente hasta que finaliza su protocolo de enlace TCP) para mitigar los ataques de inundación SYN y, en general, descargar el trabajo de los servidores a una plataforma más eficiente.
- compresión HTTP
- La compresión HTTP reduce la cantidad de datos que se transfieren para los objetos HTTP mediante la compresión gzip , disponible en todos los navegadores web modernos. Cuanto mayor sea la respuesta y más lejos esté el cliente, mayor será la mejora en los tiempos de respuesta gracias a esta función. Sin embargo, como contrapartida, esta función incrementa la carga de CPU del balanceador de carga, una tarea que podrían realizar los servidores web.
- Descarga TCP
- Los distintos proveedores utilizan términos diferentes para esto, pero la idea es que, normalmente, cada solicitud HTTP de cada cliente constituye una conexión TCP distinta. Esta función utiliza HTTP/1.1 para consolidar múltiples solicitudes HTTP de varios clientes en un único socket TCP hacia los servidores back-end.
- Almacenamiento en búfer TCP
- El balanceador de carga puede almacenar en búfer las respuestas del servidor y enviar los datos gradualmente a los clientes lentos, lo que permite al servidor web liberar un hilo para otras tareas más rápidamente que si tuviera que enviar la solicitud completa directamente al cliente.
- Devolución directa del servidor
- Una opción para la distribución asimétrica de la carga, donde la solicitud y la respuesta tienen rutas de red diferentes.
- chequeo médico
- El balanceador consulta a los servidores para comprobar el estado de la capa de aplicación y elimina los servidores que han fallado del grupo.
- almacenamiento en caché HTTP
- El balanceador almacena contenido estático para que algunas solicitudes puedan gestionarse sin necesidad de contactar con los servidores.
- Filtrado de contenido
- Algunos balanceadores pueden modificar arbitrariamente el tráfico durante su paso.
- seguridad HTTP
- Algunos balanceadores de carga pueden ocultar las páginas de error HTTP, eliminar los encabezados de identificación del servidor de las respuestas HTTP y cifrar las cookies para que los usuarios finales no puedan manipularlas.
- Cola de prioridad
- También conocida como modelado de velocidad , es la capacidad de dar diferentes prioridades a diferentes tipos de tráfico.
- conmutación con reconocimiento de contenido
- La mayoría de los balanceadores de carga pueden enviar solicitudes a diferentes servidores en función de la URL solicitada, siempre que la solicitud no esté cifrada (HTTP) o, si lo está (a través de HTTPS), que la solicitud HTTPS se finalice (descifre) en el balanceador de carga.
- Autenticación del cliente
- Autentique a los usuarios comparándolos con diversas fuentes de autenticación antes de permitirles el acceso a un sitio web.
- Manipulación programática del tráfico
- Al menos un balanceador permite el uso de un lenguaje de scripting para habilitar métodos de balanceo personalizados, manipulaciones de tráfico arbitrarias y más.
- Cortafuegos
- Los cortafuegos pueden impedir las conexiones directas a los servidores backend por motivos de seguridad de la red.
- Sistema de prevención de intrusiones
- Los sistemas de prevención de intrusiones ofrecen seguridad a nivel de aplicación, además de la seguridad a nivel de red/transporte que ofrece la seguridad del firewall.
Telecomunicaciones
El balanceo de carga puede ser útil en aplicaciones con enlaces de comunicación redundantes. Por ejemplo, una empresa puede tener varias conexiones a Internet para garantizar el acceso a la red si una de ellas falla. Un sistema de conmutación por error implicaría que un enlace se utilice normalmente, mientras que el segundo se activaría únicamente si el enlace principal falla.
Mediante el balanceo de carga, ambos enlaces pueden estar en uso permanentemente. Un dispositivo o programa supervisa la disponibilidad de todos los enlaces y selecciona la ruta para el envío de paquetes. El uso simultáneo de múltiples enlaces aumenta el ancho de banda disponible.
Puente de ruta más corta
TRILL (Interconexión transparente de muchos enlaces) facilita que una Ethernet tenga una topología arbitraria y permite la división de carga por pares de flujo a través del algoritmo de Dijkstra , sin configuración ni intervención del usuario. El catalizador de TRILL fue un evento en el Centro Médico Beth Israel Deaconess que comenzó el 13 de noviembre de 2002. [ 17 ] [ 18 ] El concepto de Rbridges [ 19 ] [sic] se propuso por primera vez al Instituto de Ingenieros Eléctricos y Electrónicos en el año 2004, [ 20 ] quien en 2005 [ 21 ] rechazó lo que llegó a conocerse como TRILL, y en los años 2006 a 2012 [ 22 ] ideó una variación incompatible conocida como Shortest Path Bridging .
El IEEE aprobó el estándar IEEE 802.1aq en mayo de 2012, [ 23 ] también conocido como Shortest Path Bridging (SPB). SPB permite que todos los enlaces estén activos a través de múltiples rutas de igual costo, proporciona tiempos de convergencia más rápidos para reducir el tiempo de inactividad y simplifica el uso del balanceo de carga en topologías de red en malla (parcialmente conectadas y/o totalmente conectadas) al permitir que el tráfico comparta la carga a través de todas las rutas de una red. [ 24 ] [ 25 ] SPB está diseñado para reducir los errores de configuración y preserva la naturaleza plug-and-play que estableció a Ethernet como el protocolo de facto en la capa 2. [ 26 ]
Enrutamiento 1
Muchas empresas de telecomunicaciones cuentan con múltiples rutas a través de sus redes o hacia redes externas. Utilizan sistemas sofisticados de balanceo de carga para redirigir el tráfico de una ruta a otra, evitando así la congestión de la red en cualquier enlace en particular y, en ocasiones, minimizando el coste de tránsito a través de redes externas o mejorando la fiabilidad de la red .
Otra forma de utilizar el balanceo de carga es en las actividades de monitorización de red . Los balanceadores de carga pueden utilizarse para dividir grandes flujos de datos en varios subflujos y emplear varios analizadores de red, cada uno de los cuales lee una parte de los datos originales. Esto puede utilizarse para monitorizar redes rápidas como 10GbE o STM64, donde el procesamiento complejo de los datos puede no ser posible a la velocidad de la línea . [ 27 ]
Redes de centros de datos
El balanceo de carga se utiliza ampliamente en redes de centros de datos para distribuir el tráfico a través de múltiples rutas existentes entre dos servidores cualesquiera. [ 28 ] Permite un uso más eficiente del ancho de banda de la red y reduce los costos de aprovisionamiento. En general, el balanceo de carga en redes de centros de datos se puede clasificar como estático o dinámico.
El balanceo de carga estático distribuye el tráfico calculando un hash de las direcciones de origen y destino y los números de puerto de los flujos de tráfico, y utilizándolo para determinar cómo se asignan los flujos a una de las rutas existentes. El balanceo de carga dinámico asigna los flujos de tráfico a las rutas monitorizando el uso del ancho de banda en diferentes rutas. Las asignaciones dinámicas pueden ser proactivas o reactivas. En el primer caso, la asignación se fija una vez realizada, mientras que en el segundo, la lógica de red monitoriza continuamente las rutas disponibles y redistribuye los flujos entre ellas a medida que cambia la utilización de la red (con la llegada de nuevos flujos o la finalización de los existentes). Se ha publicado una descripción general completa del balanceo de carga en redes de centros de datos. [ 28 ]
Conmutaciones por fallo
El balanceo de carga se utiliza a menudo para implementar la conmutación por error (failover ), es decir, la continuidad del servicio tras el fallo de uno o más de sus componentes. Los componentes se supervisan continuamente (por ejemplo, los servidores web pueden supervisarse mediante la obtención de páginas conocidas), y cuando uno deja de responder, el balanceador de carga recibe la notificación y deja de enviarle tráfico. Cuando un componente vuelve a estar en línea, el balanceador de carga comienza a redirigir el tráfico hacia él. Para que esto funcione, debe haber al menos un componente que supere la capacidad del servicio ( redundancia N+1 ). Esto puede ser mucho menos costoso y más flexible que los enfoques de conmutación por error en los que cada componente activo se combina con un único componente de respaldo que toma el control en caso de fallo ( redundancia modular dual ). Algunos sistemas RAID también pueden utilizar discos de reserva en caliente para lograr un efecto similar. [ 29 ]
Esta técnica puede aumentar la tolerancia a fallos al permitir sustituciones rápidas para las partes más complejas y propensas a fallos de un sistema. Sin embargo, puede convertir al propio balanceador de carga en un punto único de fallo .
Ingesta de datos para el entrenamiento de modelos de IA
Cada vez más, se utilizan técnicas de balanceo de carga para gestionar grandes volúmenes de datos que alimentan sistemas de entrenamiento e inferencia de inteligencia artificial , a veces denominados "fábricas de IA". Estos entornos impulsados por IA requieren el procesamiento continuo de grandes cantidades de datos estructurados y no estructurados , lo que impone una gran demanda a los recursos de red, almacenamiento y computación. [ 30 ] Para mantener el alto rendimiento y la baja latencia necesarios, las organizaciones suelen implementar herramientas de balanceo de carga capaces de realizar optimizaciones TCP avanzadas, agrupación de conexiones y programación adaptativa. Estas características ayudan a distribuir las solicitudes de datos entrantes de manera uniforme entre servidores o nodos, previenen la congestión y garantizan que los recursos de computación se utilicen de manera eficiente. [ 31 ]
Cuando se implementan en entornos de IA a gran escala o de alto rendimiento, los balanceadores de carga también mitigan las limitaciones de ancho de banda y se adaptan a los diferentes requisitos de gobernanza de datos, especialmente cuando no es posible enviar datos de entrenamiento confidenciales a servicios en la nube de terceros. Al enrutar los datos localmente (en las instalaciones) o a través de nubes privadas, los balanceadores de carga permiten que los flujos de trabajo de IA eviten las limitaciones de ancho de banda de la nube pública, reduzcan los costos de tránsito y mantengan el cumplimiento de las normas regulatorias. A medida que los modelos de IA aumentan de tamaño (a menudo medidos en miles de millones o incluso billones de parámetros), el balanceo de carga para la ingesta de datos ha cobrado mayor importancia para mantener la confiabilidad, la escalabilidad y la rentabilidad de las fábricas de IA.
Véase también
- Máscara Affinity
- controlador de entrega de aplicaciones
- Escalado automático
- computación en la nube
- Balanceo de carga en la nube
- Protocolo de redundancia de direcciones comunes
- computación de borde
- Sistema de archivos interplanetario
- Balanceo de carga de red
- Planificación óptima de tareas : el problema computacional de encontrar una planificación óptimamente equilibrada.
- Registro SRV
Referencias
- 1 2 Sanders, Peter; Mehlhorn, Kurt; Dietzfelbinger, Martin; Dementiev, Roman (11 de septiembre de 2019). Algoritmos y estructuras de datos secuenciales y paralelos : la caja de herramientas básica . Springer. ISBN 978-3-030-25208-3.
- ↑ Liu, Qi; Cai, Weidong; Jin, Dandan; Shen, Jian; Fu, Zhangjie; Liu, Xiaodong; Linge, Nigel (30 de agosto de 2016). "Precisión de la estimación del tiempo de ejecución de tareas en tiempo de ejecución en un entorno distribuido heterogéneo" . Sensors . 16 ( 9): 1386. Bibcode : 2016Senso..16.1386L . doi : 10.3390/s16091386 . PMC 5038664. PMID 27589753. S2CID 391429 .
- ↑ Alakeel, Ali (noviembre de 2009). "Una guía para el equilibrio de carga dinámico en sistemas informáticos distribuidos" . Revista internacional de informática y seguridad de redes . 10 .
- ↑ Asghar, Sajjad; Aubanel, Eric; Bremner, David (octubre de 2013). "Un solucionador SAT paralelo basado en programación dinámica y moldeable de trabajos". 42.ª Conferencia Internacional sobre Procesamiento Paralelo de 2013. págs. 110–119 . doi : 10.1109/ICPP.2013.20 . ISBN 978-0-7695-5117-3. S2CID 15124201 .
- ↑ Punetha Sarmila, G.; Gnanambigai, N.; Dinadayalan, P. (2015). "Estudio sobre algoritmos de equilibrio de carga tolerantes a fallos en la computación en la nube". 2.ª Conferencia Internacional sobre Sistemas Electrónicos y de Comunicación (ICECS) de 2015. pp. 1715–1720 . doi : 10.1109/ECS.2015.7124879 . ISBN 978-1-4799-7225-8. S2CID 30175022 .
- ↑ "Módulo ngx_http_upstream_module" . nginx.org . Consultado el 7 de abril de 2026 .
- ↑ "NGINX y el algoritmo de equilibrio de carga "El poder de dos opciones" . nginx.com . 12 de noviembre de 2018. Archivado del original el 12 de diciembre de 2019.
- ↑ "Prueba de manejo del balanceo de carga "Power of Two Random Choices"" . haproxy.com . 15 de febrero de 2019. Archivado del original el 15 de febrero de 2019.
- ↑ Eager, Derek L; Lazowska, Edward D; Zahorjan, John (1 de marzo de 1986). "Una comparación del reparto adaptativo de carga iniciado por el receptor y el emisor". Performance Evaluation . 6 (1): 53– 68. doi : 10.1016/0166-5316(86)90008-8 . ISSN 0166-5316 .
- ^ Lijadoras, Peter (1998). "Computaciones en forma de árbol como modelo para aplicaciones paralelas". Taller sobre equilibrio de carga basado en aplicaciones (Alv '98), Múnich, 25 - 26 de marzo de 1998 - Veranst. Vom Sonderforschungsbereich 342 "Werkzeuge und Methoden für die Nutzung Paralleler Rechnerarchitekturen". Ed.: A. Bode : 123. doi : 10.5445/ir/1000074497 .
- ↑ "Capítulo 8 - Registro de dirección IPv4 (A)" . www.zytrax.com .
- ↑ "Patrón: Balanceo de carga del lado del cliente" . 15 de octubre de 2015. Archivado del original el 29 de noviembre de 2020.
- 1 2 3 "Arquitectura del lado del servidor. Servidores front-end y balanceo de carga aleatorio del lado del cliente" . IT Hare en Soft.ware . 28 de diciembre de 2015.
- ↑ "Alta disponibilidad" . linuxvirtualserver.org . Consultado el 20 de noviembre de 2013 .
- ↑ Ranjan, R (2010). "Provisión de nube peer-to-peer: descubrimiento de servicios y equilibrio de carga". Computación en la nube .
- 1 2 "Equilibrio de carga 101: Fundamentos" . F5 . 05/12/2017. Archivado del original el 05/12/2017 . Recuperado el 23/03/2018 .
- ↑ "Todos los sistemas caídos" (PDF) . cio.com . IDG Communications, Inc. Archivado del original (PDF) el 23 de septiembre de 2020. Consultado el 9 de enero de 2022 .
- ↑ "Todos los sistemas caídos" . cio.com . IDG Communications, Inc. Archivado del original el 9 de enero de 2022. Consultado el 9 de enero de 2022 .
- ↑ "Rbridges: Enrutamiento transparente" (PDF) . courses.cs.washington.edu . Radia Perlman, Sun Microsystems Laboratories. Archivado del original (PDF) el 9 de enero de 2022. Consultado el 9 de enero de 2022 .
- ↑ "Rbridges: Enrutamiento transparente" . researchgate.net . Radia Perlman, Sun Microsystems; Donald Eastlake 3rd, Motorola.
- ↑ "Tutorial TRILL" (PDF) . postel.org . Donald E. Eastlake 3rd, Huawei. Archivado del original (PDF) el 29 de marzo de 2023. Consultado el 14 de enero de 2022 .
- ↑ "IEEE 802.1: 802.1aq - Conexión de ruta más corta" . ieee802.org . Instituto de Ingenieros Eléctricos y Electrónicos.
- ↑ Shuang Yu (8 de mayo de 2012). "IEEE APRUEBA EL NUEVO ESTÁNDAR DE PUENTE DE RUTA MÁS CORTA IEEE 802.1aq™" . IEEE. Archivado del original el 14 de mayo de 2013. Consultado el 2 de junio de 2012 .
- ↑ Peter Ashwood-Smith (24 de febrero de 2011). "Descripción general de la conexión de ruta más corta IEEE 802.1aq" (PDF) . Huawei. Archivado del original (PDF) el 15 de mayo de 2013. Recuperado el 11 de mayo de 2012 .
- ↑ Jim Duffy (11 de mayo de 2012). "El sistema de salud más grande de Illinois reemplaza a Cisco para construir una nube privada de 40 millones de dólares" . PC Advisor . Consultado el 11 de mayo de 2012.
El protocolo Shortest Path Bridging reemplazará a Spanning Tree en la estructura Ethernet.
- ↑ "IEEE aprueba el nuevo estándar de puenteo de ruta más corta IEEE 802.1aq" . Tech Power Up. 7 de mayo de 2012. Consultado el 11 de mayo de 2012 .
- ↑ Noormohammadpour, Mohammad; Raghavendra, Cauligi S. (2018). "Resumen del póster: Minimización de los tiempos de finalización del flujo mediante enrutamiento adaptativo en redes de área amplia entre centros de datos". IEEE INFOCOM 2018 - Talleres de la Conferencia IEEE sobre Comunicaciones Informáticas (INFOCOM WKSHPS) . IEEE. págs. 1–2 . arXiv : 1802.09080 . doi : 10.1109/INFCOMW.2018.8406853 . ISBN 978-1-5386-5979-3.
- 1 2 Noormohammadpour, Mohammad; Raghavendra, Cauligi S. (2018). "Control de tráfico en centros de datos: comprensión de técnicas y compensaciones" . IEEE Communications Surveys & Tutorials . 20 (2): 1492– 1525. arXiv : 1712.03530 . doi : 10.1109/COMST.2017.2782753 . ISSN 1553-877X .
- ↑ "Conmutación por error y equilibrio de carga" . IBM . Consultado el 6 de enero de 2019 .
- ↑ "Optimizar la gestión del tráfico para la ingesta de datos de AI Factory" . F5, Inc. Recuperado el 30 de enero de 2025 .
- ↑ "Optimizar, escalar y asegurar las interacciones de IA" . F5, Inc. Consultado el 30 de enero de 2025 .
Enlaces externos
- Enrutamiento de servidores para equilibrio de carga con recuperación automática completa ante fallos en Wayback Machine (archivado el 29/03/2023).
- Servidores (informática)
- Enrutamiento
- Balanceo de carga (informática)
- Tecnología de equilibrio