En informática, el equilibrio de carga se refiere al proceso de distribución de un conjunto de tareas sobre un conjunto de recursos (unidades informáticas), con el objetivo de hacer que su procesamiento general sea más eficiente. El equilibrio de carga puede optimizar el tiempo de respuesta y evitar la sobrecarga desigual de algunos nodos de cómputo mientras que otros nodos de cómputo quedan inactivos.
El equilibrio de carga es objeto de investigación en el campo de las computadoras paralelas. 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 más eficientes, pero requieren intercambios de información entre las diferentes unidades informáticas, a riesgo de una pérdida de eficiencia.
Un algoritmo de equilibrio de carga siempre intenta responder a un problema específico. Entre otras cosas, se debe tener 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, se debe encontrar un compromiso para cumplir mejor con los requisitos específicos de la aplicación.
La eficiencia de los algoritmos de equilibrio de carga depende fundamentalmente de la naturaleza de las tareas. Por tanto, cuanta más información sobre las tareas esté disponible en el momento de la toma de decisiones, mayor será el potencial de optimización.
Un perfecto conocimiento del tiempo de ejecución de cada una de las tareas permite alcanzar una distribución óptima de la carga (ver algoritmo de suma de prefijo ). Desafortunadamente, este es de hecho un caso idealizado. Conocer el tiempo exacto de ejecución de cada tarea es una situación extremadamente rara.
Por este motivo, existen varias técnicas para hacerse una idea de los diferentes tiempos de ejecución. En primer lugar, en el afortunado escenario de tener tareas de tamaño relativamente homogéneo, es posible considerar que cada una de ellas requerirá aproximadamente el tiempo medio de ejecución. Si, por el contrario, el tiempo de ejecución es muy irregular, se deben utilizar técnicas más sofisticadas. Una técnica consiste en agregar algunos metadatos a cada tarea. Dependiendo del tiempo de ejecución anterior para metadatos similares, es posible hacer inferencias para una tarea futura basada en estadísticas.
En algunos casos, las tareas dependen unas de otras. Estas interdependencias se pueden ilustrar mediante un gráfico acíclico dirigido. De manera intuitiva, algunas tareas no pueden comenzar hasta que se completan otras.
Suponiendo que el tiempo requerido para cada una de las tareas se conoce de antemano, un orden de ejecución óptimo debe conducir a la minimización del tiempo total de ejecución. Aunque este es un problema NP-difícil y, por lo tanto, puede ser difícil de resolver con exactitud. Existen algoritmos, como el programador de trabajos, que calculan distribuciones óptimas de tareas utilizando métodos metaheurísticos.
Otra característica de las tareas críticas para el diseño de un algoritmo de equilibrio de carga es su capacidad para dividirse en subtareas durante la ejecución. El algoritmo de "Computación en forma de árbol" que se presenta más adelante aprovecha en gran medida esta especificidad.
Un algoritmo de equilibrio de carga es "estático" cuando no tiene en cuenta el estado del sistema para la distribución de tareas. Por lo tanto, el estado del sistema incluye medidas como el nivel de carga (y en ocasiones incluso la sobrecarga) de ciertos procesadores. En cambio, las suposiciones sobre el sistema general se hacen de antemano, como los tiempos de llegada y los requisitos de recursos de las tareas entrantes. Además, se conoce el número de procesadores, su respectiva potencia y velocidades de comunicación. Por lo tanto, el equilibrio de carga estático tiene como objetivo asociar un conjunto conocido de tareas con los procesadores disponibles para minimizar una determinada función de rendimiento. El truco radica en el concepto de esta función de desempeño.
Las técnicas de equilibrio de carga estática se centralizan comúnmente alrededor de 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 a distribuir y derivar un tiempo de ejecución esperado.
La ventaja de los algoritmos estáticos es que son fáciles de configurar y extremadamente eficientes en el caso de tareas bastante regulares (como procesar solicitudes HTTP desde un sitio web). Sin embargo, todavía existe alguna variación estadística en la asignación de tareas que puede conducir a la sobrecarga de algunas unidades informáticas.
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 informáticas (también llamadas nodos) del sistema. En este enfoque, las tareas se pueden mover dinámicamente de un nodo sobrecargado a un nodo subcargado para recibir un procesamiento más rápido. Si bien estos algoritmos son mucho más complicados de diseñar, pueden producir excelentes resultados, en particular, cuando el tiempo de ejecución varía mucho de una tarea a otra.
La arquitectura de balanceo de carga dinámica 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 de acuerdo con su estado en un momento dado, se trata de una asignación única. Si, por el contrario, las tareas se pueden redistribuir permanentemente según el estado del sistema y su evolución, se denomina asignación dinámica. Obviamente, un algoritmo de equilibrio de carga que requiere demasiada comunicación para tomar sus decisiones corre el riesgo de ralentizar la resolución del problema general.
Las infraestructuras de computación paralelas suelen estar compuestas por unidades de diferente potencia de computación, que deben 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 tamaños de solicitud homogéneos o desconocidos, recibir menos solicitudes que las unidades más grandes.
Las computadoras paralelas a menudo se dividen en dos categorías amplias: aquellas en las que todos los procesadores comparten una única memoria común en la que leen y escriben en paralelo ( modelo PRAM ), y aquellas en las que cada unidad informática tiene su propia memoria ( modelo de memoria distribuida ), y donde la información se intercambia por mensajes.
En el caso de las computadoras con memoria compartida, la gestión de los conflictos de escritura ralentiza en gran medida la velocidad de ejecución individual de cada unidad informática. Sin embargo, pueden funcionar perfectamente bien en paralelo. Por el contrario, en el caso del intercambio de mensajes, cada uno de los procesadores puede funcionar a toda velocidad. Por otro lado, cuando se trata de intercambio colectivo de mensajes, todos los procesadores se ven obligados a esperar a que los procesadores más lentos inicien la fase de comunicación.
En realidad, pocos sistemas caen exactamente en una de las categorías. En general, los procesadores tienen cada uno una memoria interna para almacenar los datos necesarios para los próximos cálculos y están organizados en grupos sucesivos. A menudo, estos elementos de procesamiento se coordinan a través de la memoria distribuida y el paso de mensajes. Por lo tanto, el algoritmo de equilibrio de carga debe adaptarse de forma única a una arquitectura paralela. De lo contrario, existe el riesgo de que la eficiencia de la resolución de problemas en paralelo se reduzca en gran medida.
Adaptándose a las estructuras de hardware vistas anteriormente, hay dos categorías principales de algoritmos de equilibrio de carga. Por un lado, aquél donde las tareas son asignadas por “maestro” y ejecutadas por “trabajadores” que mantienen informado al maestro del avance de su trabajo, y el maestro puede entonces encargarse de asignar o reasignar la carga de trabajo en caso de dinámica. algoritmo. La literatura se refiere a esto como arquitectura "Maestro-Trabajador". Por otro lado, el control se puede distribuir entre los diferentes nodos. Luego, el algoritmo de equilibrio de carga se ejecuta en cada uno de ellos y se comparte la responsabilidad de asignar tareas (así como de reasignar y dividir según corresponda). La última categoría asume un algoritmo de equilibrio de carga dinámico.
Dado que el diseño de cada algoritmo de equilibrio de carga es único, se debe calificar la distinción anterior. Por lo tanto, también es posible tener una estrategia intermedia, con, por ejemplo, nodos "maestros" para cada subgrupo, que están sujetos a un "maestro" global. También existen organizaciones multinivel, con una alternancia entre estrategias de control maestro-esclavo y distribuidas. Las últimas estrategias se vuelven complejas rápidamente y rara vez se encuentran. Los diseñadores prefieren algoritmos que sean más fáciles de controlar.
En el contexto de algoritmos que se ejecutan a muy largo plazo (servidores, nube...), la arquitectura de la computadora evoluciona con el tiempo. Sin embargo, es preferible no tener que diseñar un nuevo algoritmo cada vez.
Por lo tanto, un parámetro extremadamente importante de un algoritmo de equilibrio de carga es su capacidad para adaptarse a una arquitectura de hardware escalable. A esto se le llama escalabilidad del algoritmo. Un algoritmo se denomina escalable para un parámetro de entrada cuando su rendimiento permanece relativamente independiente del tamaño de ese parámetro.
Cuando el algoritmo es capaz de adaptarse a un número variable de unidades informáticas, pero el número de unidades informáticas debe fijarse antes de la ejecución, se denomina moldeable. Si, por otro lado, el algoritmo es capaz de lidiar con una cantidad fluctuante de procesadores durante su ejecución, se dice que el algoritmo es maleable. La mayoría de los algoritmos de equilibrio de carga son al menos moldeables.
Especialmente en clústeres de computación a gran escala, no es tolerable ejecutar un algoritmo paralelo que no puede resistir la falla de un solo componente. Por lo tanto, se están desarrollando algoritmos tolerantes a fallas que pueden detectar interrupciones de los procesadores y recuperar el cálculo.
Si las tareas son independientes entre sí, y si su tiempo de ejecución respectivo y las tareas pueden subdividirse, existe un algoritmo simple y óptimo.
Al dividir las tareas de tal manera que se dé la misma cantidad de cálculo a cada procesador, todo lo que queda por hacer es agrupar los resultados. Usando un algoritmo de suma de prefijo, 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 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.
La mayoría de las veces, se desconoce el tiempo de ejecución de una tarea y solo se dispone de una aproximación aproximada. Este algoritmo, aunque particularmente eficiente, no es viable para estos escenarios.
Incluso si el tiempo de ejecución no se conoce de antemano, la distribución de la carga estática siempre es posible.
En un algoritmo por turnos, la primera solicitud se envía al primer servidor, luego la siguiente al segundo y así sucesivamente hasta el último. Luego se vuelve a iniciar, asignando la siguiente solicitud al primer servidor, y así sucesivamente.
Este algoritmo se puede ponderar de modo que las unidades más potentes reciban la mayor cantidad de solicitudes y las reciban primero.
El equilibrio de carga estático aleatorio es simplemente una cuestión de asignar tareas al azar a los diferentes servidores. Este método funciona bastante bien. Si, por el contrario, el número de tareas se conoce de antemano, es aún más eficaz calcular una permutación aleatoria de antemano. Esto evita costos de comunicación para cada tarea. Ya no es necesario un maestro de distribución porque cada procesador sabe qué tarea se le asigna. Incluso si se desconoce el número de tareas, aún es posible evitar la comunicación con 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 determinado) disminuye con el tamaño máximo de las tareas.
Por supuesto, también existen otros métodos de asignación:
Los esquemas maestro-trabajador se encuentran entre los algoritmos de equilibrio de carga dinámica más simples. Un maestro distribuye la carga de trabajo a todos los trabajadores (también denominados a veces "esclavos"). Inicialmente, todos los trabajadores están inactivos e informan de esto al maestro. El maestro responde a las solicitudes de los trabajadores y les distribuye las tareas. Cuando no tiene más tareas para dar, informa a los trabajadores para que dejen de pedir tareas.
La ventaja de este sistema es que distribuye la carga de manera muy justa. De hecho, si no se tiene en cuenta el tiempo necesario para la asignación, el tiempo de ejecución sería comparable a la suma del prefijo visto anteriormente.
El problema de este algoritmo es que tiene dificultades para adaptarse a una gran cantidad de procesadores debido a la gran cantidad de comunicaciones necesarias. Esta falta de escalabilidad hace que sea rápidamente inoperable en servidores muy grandes o en equipos paralelos muy grandes. El maestro actúa como un cuello de botella.
Sin embargo, la calidad del algoritmo se puede mejorar enormemente reemplazando el maestro por una lista de tareas que puede ser utilizada por diferentes procesadores. Aunque este algoritmo es un poco más difícil de implementar, promete una escalabilidad mucho mejor, aunque todavía insuficiente para centros informáticos muy grandes.
Otra técnica para superar los problemas de escalabilidad cuando se desconoce el tiempo necesario para completar la tarea es el robo de trabajo.
El enfoque consiste en asignar a cada procesador un cierto número de tareas de forma aleatoria o predefinida, y luego permitir que los procesadores inactivos "roben" trabajo a los procesadores activos o sobrecargados. Existen varias implementaciones de este concepto, definidas por un modelo de división de tareas y por las reglas que determinan el intercambio entre procesadores. Si bien esta técnica puede ser particularmente efectiva, es difícil de implementar porque es necesario garantizar que la comunicación no se convierta en la ocupación principal de los procesadores en lugar de resolver el problema.
En el caso de las tareas atómicas se pueden distinguir dos estrategias principales, aquellas donde los procesadores con baja carga ofrecen su capacidad de cómputo a los de mayor carga, y aquellas donde las unidades más cargadas desean aligerar la carga de trabajo que se les asigna. Se ha demostrado 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 soporte de los más inactivos. Esta regla general limita el número de mensajes intercambiados.
En el caso en el que se parte de una única tarea grande que no se puede dividir más allá de un nivel atómico, existe un algoritmo muy eficiente "Cálculo en forma de árbol", donde la tarea principal se distribuye en un árbol de trabajo.
Inicialmente, muchos procesadores tienen una tarea vacía, excepto una que trabaja secuencialmente en ella. Los procesadores inactivos envían solicitudes de forma aleatoria a otros procesadores (no necesariamente activos). Si este último es capaz de 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 se completa la subtarea, para que a su vez envíe el mensaje a su padre hasta que llegue a la raíz del árbol. Cuando el primer procesador, es decir, la raíz, ha terminado, se puede transmitir un mensaje de terminación global. Al final, es necesario reunir los resultados subiendo por el árbol.
La eficiencia de dicho algoritmo está cerca de la suma del prefijo cuando el tiempo de corte y comunicación del trabajo no es demasiado alto en comparación con el trabajo a realizar. Para evitar costos de comunicación demasiado altos, es posible imaginar una lista de trabajos en la memoria compartida. Por lo tanto, una solicitud es simplemente leer desde una determinada posición en esta memoria compartida a solicitud del procesador maestro.
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 poder manejar una gran cantidad de solicitudes por segundo.
Una de las aplicaciones de equilibrio de carga más utilizadas es proporcionar un único servicio de Internet desde varios servidores, a veces conocido como granja de servidores. Los sistemas con equilibrio de carga comúnmente incluyen sitios web populares, grandes redes de Internet Relay Chat, sitios de protocolo de transferencia de archivos (FTP) de alto ancho de banda, servidores de protocolo de transferencia de noticias en red (NNTP), servidores del sistema de nombres de dominio (DNS) y bases de datos.
El DNS por turnos es un método alternativo de equilibrio de carga que no requiere un nodo de software o hardware dedicado. En esta técnica, se asocian varias direcciones IP con un solo nombre de dominio ; los clientes reciben IP de forma rotatoria. La IP se asigna a los clientes con un vencimiento breve, por lo que es más probable que el cliente utilice una IP diferente la próxima vez que acceda al servicio de Internet que se solicita.
Otra técnica más eficaz para equilibrar la carga utilizando DNS es delegar www.example.org como un subdominio cuya zona es atendida por cada uno de los mismos servidores que sirven al sitio web. Esta técnica funciona particularmente 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. En el servidor uno, el archivo de zona para los informes de www.example.org:
@ in a 192.0.2.1
En el servidor dos, el mismo archivo de zona contiene:
@ in a 203.0.113.2
De esta forma, cuando un servidor está inactivo, su DNS no responderá y el servicio web no recibirá tráfico. Si la línea a un servidor está congestionada, la falta de confiabilidad del DNS asegura que menos tráfico HTTP llegue a ese servidor. Además, la respuesta de DNS más rápida al resolutor es casi siempre la del servidor más cercano a la red, lo que garantiza un equilibrio de carga sensible a la ubicación geográfica. Un breve TTL en el registro A ayuda a garantizar que el tráfico se desvíe rápidamente cuando un servidor deja de funcionar. Debe tenerse en cuenta la posibilidad de que esta técnica pueda hacer que los clientes individuales cambien entre servidores individuales a mitad de la sesión.
Otro enfoque para el equilibrio de carga es entregar una lista de IP de servidor al cliente y luego hacer que el cliente seleccione aleatoriamente la IP de la lista en cada conexión. Básicamente, esto se basa en que todos los clientes generen cargas similares y en la Ley de los números grandes para lograr una distribución de carga razonablemente plana entre los servidores. Se ha afirmado que el equilibrio de carga aleatorio del lado del cliente tiende a proporcionar una mejor distribución de carga que el DNS por turnos; esto se ha atribuido a problemas de almacenamiento en caché con DNS por turnos, que en el caso de grandes servidores de almacenamiento en caché de DNS, tienden a sesgar la distribución del DNS por turnos, mientras que la selección aleatoria del lado del cliente no se ve afectada independientemente del almacenamiento en caché de DNS.
Con este enfoque, el método de entrega de la lista de IP al cliente puede variar y puede implementarse como una lista de DNS (entregada a todos los clientes sin ningún tipo de operación por turnos), o mediante codificación fija en la lista. Si se utiliza un "cliente inteligente", la detección de que el servidor seleccionado al azar está inactivo y se conecta de nuevo al azar, también proporciona tolerancia a fallas.
Para los servicios de Internet, un equilibrador de carga del lado del servidor suele ser un programa de software que escucha en el puerto donde los clientes externos se conectan para acceder a los servicios. El equilibrador de carga reenvía las solicitudes a uno de los servidores "backend", que normalmente responde al equilibrador de carga. Esto permite que el equilibrador de carga responda al cliente sin que el cliente se entere de la separación interna de funciones. También evita que los clientes se pongan en contacto directamente con los servidores back-end, lo que puede tener beneficios de seguridad al ocultar la estructura de la red interna y evitar ataques a la pila de red del kernel o servicios no relacionados que se ejecutan en otros puertos.
Algunos balanceadores de carga proporcionan un mecanismo para hacer algo especial en caso de que todos los servidores backend no estén disponibles. Esto podría incluir el reenvío a un equilibrador de carga de respaldo o mostrar un mensaje sobre la interrupción.
También es importante que el equilibrador de carga en sí no se convierta en un único punto de falla. Por lo general, los balanceadores de carga se implementan en pares de alta disponibilidad que también pueden replicar los datos de persistencia de la sesión si así lo requiere la aplicación específica. Ciertas aplicaciones se programan con inmunidad a este problema, compensando el punto de equilibrio de carga sobre plataformas de intercambio diferencial más allá de la red definida. Los algoritmos secuenciales emparejados con estas funciones se definen mediante parámetros flexibles únicos para la base de datos específica.
Los equilibradores de carga utilizan numerosos algoritmos de programación, también llamados métodos de equilibrio de carga, para determinar a qué servidor back-end enviar una solicitud. Los algoritmos simples incluyen elección aleatoria, round robin o conexiones mínimas. Los equilibradores de carga más sofisticados pueden tener en cuenta factores adicionales, como la carga informada de un servidor, los tiempos de respuesta mínimos, el estado activo / inactivo (determinado por una encuesta de monitoreo de algún tipo), la cantidad de conexiones activas, la ubicación geográfica, las capacidades o la cantidad tráfico que se le ha asignado recientemente.
Un tema importante cuando se opera un servicio con equilibrio de carga es cómo manejar la información que debe mantenerse en las múltiples solicitudes en la sesión de un usuario. Si esta información se almacena localmente en un servidor backend, las solicitudes posteriores que vayan a diferentes servidores backend no podrán encontrarla. Esto puede ser información almacenada en caché que se puede volver a calcular, en cuyo caso equilibrar la carga de una solicitud a un servidor backend diferente solo presenta un problema de rendimiento.
Idealmente, el clúster de servidores detrás del equilibrador de carga no debería ser consciente de la sesión, 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 para el problema de los datos de la sesión es enviar todas las solicitudes en una sesión de usuario de manera consistente al mismo servidor backend. Esto se conoce como "persistencia" o "adherencia". Una desventaja importante de esta técnica es su falta de conmutación por error automática: si un servidor backend falla, su información por sesión se vuelve inaccesible y las sesiones que dependen de él se pierden. El mismo problema suele ser relevante para los servidores de bases de datos centrales; incluso si los servidores web son "sin estado" y no "pegajosos", la base de datos central lo es (ver más abajo).
La asignación a un servidor en particular puede basarse en un nombre de usuario, dirección IP de cliente o ser aleatoria. Debido a cambios en la dirección percibida del cliente como resultado de DHCP, traducción de direcciones de red y proxies web, este método puede no ser confiable. El equilibrador de carga debe recordar las asignaciones aleatorias, lo que crea una carga para el almacenamiento. Si el equilibrador de carga se reemplaza o falla, esta información se puede perder y es posible que sea necesario eliminar las asignaciones después de un período de tiempo de espera o durante períodos de alta carga para evitar exceder el espacio disponible para la tabla de asignaciones. El método de asignación aleatoria también requiere que los clientes mantengan algún estado, lo que puede ser un problema, por ejemplo, cuando un navegador web ha desactivado el almacenamiento de cookies. Los equilibradores de carga sofisticados utilizan varias técnicas de persistencia para evitar algunas de las deficiencias de cualquier método.
Otra solución es mantener los datos por sesión en una base de datos. Esto generalmente es malo para el rendimiento porque aumenta la carga en la base de datos: la base de datos se usa mejor para almacenar información menos transitoria que los datos por sesión. Para evitar que una base de datos se convierta en un único punto de falla y para mejorar la escalabilidad, la base de datos a menudo se replica en varias máquinas y el equilibrio de carga se utiliza para distribuir la carga de consultas entre esas réplicas. Microsoft 's ASP.net tecnología de servidor de estado es un ejemplo de una 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 recuperar los datos.
En el caso muy común en el que el cliente es un navegador web, un enfoque simple pero eficiente es almacenar los datos por sesión en el propio navegador. Una forma de lograrlo es utilizar una cookie del navegador, debidamente codificada y con sello de tiempo. Otro es la reescritura de URL. El almacenamiento de datos de sesión en el cliente es generalmente la solución preferida: entonces el equilibrador de carga es libre de elegir cualquier servidor backend para manejar una solicitud. Sin embargo, este método de manejo de datos de estado no es adecuado para algunos escenarios de lógica empresarial complejos, donde la carga útil del estado de la sesión es grande y no es factible volver a calcularlo con cada solicitud en un servidor. La reescritura de URL tiene importantes problemas de seguridad, porque el usuario final puede alterar fácilmente la URL enviada y, por lo tanto, cambiar los flujos de sesión.
Otra solución más para almacenar datos persistentes es asociar un nombre con cada bloque de datos y usar una tabla hash distribuida para asignar de forma pseudoaleatoria ese nombre a uno de los servidores disponibles, y luego almacenar ese bloque de datos en el servidor asignado.
Los equilibradores de carga de hardware y software pueden tener una variedad de características especiales. La característica fundamental de un equilibrador de carga es poder distribuir las solicitudes entrantes entre varios servidores backend en el clúster de acuerdo con un algoritmo de programación. La mayoría de las siguientes características son específicas del proveedor:
El equilibrio de carga puede resultar útil en aplicaciones con enlaces de comunicaciones redundantes. Por ejemplo, una empresa puede tener varias conexiones a Internet que garantizan el acceso a la red si una de las conexiones falla. Una disposición de conmutación por error significaría que un enlace está designado para uso normal, mientras que el segundo enlace se usa solo si falla el enlace principal.
Con el equilibrio de carga, ambos enlaces pueden estar en uso todo el tiempo. Un dispositivo o programa monitorea la disponibilidad de todos los enlaces y selecciona la ruta para enviar paquetes. El uso de varios enlaces simultáneamente aumenta el ancho de banda disponible.
El IEEE aprobó el estándar IEEE 802.1aq en mayo de 2012, 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 equilibrio de carga en topologías de red en malla (parcialmente conectadas y / o completamente conectadas) al permitir que el tráfico comparta la carga en todos caminos de una red. SPB está diseñado para eliminar virtualmente el error humano durante la configuración y preserva la naturaleza plug-and-play que estableció Ethernet como el protocolo de facto en la Capa 2.
Muchas empresas de telecomunicaciones tienen múltiples rutas a través de sus redes o hacia redes externas. Utilizan un sofisticado equilibrio de carga para cambiar el tráfico de una ruta a otra para evitar la congestión de la red en cualquier enlace en particular y, a veces, para minimizar el costo del tránsito a través de redes externas o mejorar la confiabilidad de la red.
Otra forma de utilizar el equilibrio de carga es en las actividades de supervisión de la red. Los equilibradores de carga se pueden utilizar para dividir grandes flujos de datos en varios subflujos y utilizar varios analizadores de red, cada uno de los cuales lee una parte de los datos originales. Esto es muy útil para monitorear redes rápidas como 10GbE o STM64, donde el procesamiento complejo de los datos puede no ser posible a la velocidad del cable.
El equilibrio de carga se usa ampliamente en las redes de centros de datos para distribuir el tráfico a través de muchas rutas existentes entre dos servidores. Permite un uso más eficiente del ancho de banda de la red y reduce los costos de aprovisionamiento. En general, el equilibrio de carga en las redes de centros de datos se puede clasificar como estático o dinámico.
El equilibrio 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 usándolo para determinar cómo se asignan los flujos a una de las rutas existentes. El equilibrio de carga dinámico asigna los flujos de tráfico a las rutas mediante la supervisión del uso del ancho de banda en diferentes rutas. La asignación dinámica también puede ser proactiva o reactiva. En el primer caso, la asignación se fija una vez realizada, mientras que en el segundo la lógica de la red sigue monitoreando las rutas disponibles y cambia los flujos a través de 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 puesto a disposición una descripción general completa del equilibrio de carga en las redes de centros de datos.
El equilibrio de carga se utiliza a menudo para implementar la conmutación por error: la continuación de un servicio después de la falla de uno o más de sus componentes. Los componentes se monitorean continuamente (por ejemplo, los servidores web pueden ser monitoreados al buscar páginas conocidas), y cuando uno deja de responder, se informa al balanceador de carga y ya no le envía tráfico. Cuando un componente vuelve a estar en línea, el equilibrador de carga comienza a redirigir el tráfico hacia él. Para que esto funcione, debe haber al menos un componente que exceda 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 en vivo se empareja con un solo componente de respaldo que se hace cargo en caso de falla ( redundancia modular dual ). Algunos sistemas RAID también pueden utilizar el repuesto dinámico para obtener un efecto similar.
El puente de ruta más corta reemplazará al árbol de expansión en la estructura de Ethernet.
![]() | Wikimedia Commons tiene medios relacionados con Equilibrio de carga (informática). |