stringtranslate.com

Equilibrio de carga (informática)

Diagrama que ilustra las solicitudes de los usuarios a un clúster de Elasticsearch distribuido por un balanceador de carga. (Ejemplo para Wikipedia ).

En informática , el equilibrio de carga es el proceso de distribuir un conjunto de tareas sobre un conjunto de recursos (unidades informáticas), con el objetivo de hacer más eficiente su procesamiento general. El equilibrio de carga puede optimizar el tiempo de respuesta y evitar la sobrecarga desigual de algunos nodos informáticos mientras otros nodos informáticos 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 sufrir pérdidas. de eficiencia.

Resumen del problema

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 satisfacer mejor los requisitos específicos de la aplicación.

Naturaleza de las tareas

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.

Tamaño de las tareas

El 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 prefijos ). [1] Desafortunadamente, este es en realidad 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 hacernos 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 promedio de ejecución. Si por el contrario el tiempo de ejecución es muy irregular, se deberán utilizar técnicas más sofisticadas. Una técnica consiste en agregar algunos metadatos a cada tarea. Dependiendo del tiempo de ejecución anterior de metadatos similares, es posible hacer inferencias para una tarea futura basada en estadísticas. [2]

Dependencias

En algunos casos, las tareas dependen unas de otras. Estas interdependencias se pueden ilustrar mediante un gráfico acíclico dirigido . Intuitivamente, algunas tareas no pueden comenzar hasta que se completen otras.

Suponiendo que se conoce de antemano el tiempo requerido para cada una de las tareas, 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 exactamente. Existen algoritmos, como el programador de trabajos , que calculan distribuciones óptimas de tareas utilizando métodos metaheurísticos .

Segregación de tareas

Otra característica de las tareas críticas para el diseño de un algoritmo de equilibrio de carga es su capacidad de 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.

Algoritmos estáticos y dinámicos.

Estático

Un algoritmo de equilibrio de carga es "estático" cuando no tiene en cuenta el estado del sistema para la distribución de tareas. De este modo, el estado del sistema incluye medidas como el nivel de carga (y a veces incluso la sobrecarga) de determinados procesadores. En cambio, se hacen suposiciones de antemano sobre el sistema 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 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 está en el concepto de esta función de desempeño.

Las técnicas de equilibrio de carga estática suelen centralizarse 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 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 el procesamiento de solicitudes HTTP desde un sitio web). Sin embargo, todavía existe cierta variación estadística en la asignación de tareas que puede provocar la sobrecarga de algunas unidades informáticas.

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 informáticas (también llamadas nodos) del sistema. En este enfoque, las tareas se pueden mover dinámicamente desde un nodo sobrecargado a un nodo poco cargado para recibir un procesamiento más rápido. Si bien estos algoritmos son mucho más complicados de diseñar, pueden producir resultados excelentes, en particular, cuando el tiempo de ejecución varía mucho de una tarea a otra.

La arquitectura de equilibrio 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 según su estado en un momento determinado, se trata de una asignación única. Si, por el contrario, las tareas pueden redistribuirse permanentemente según el estado del sistema y su evolución, a esto se le llama asignación dinámica. [3] 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.

Arquitectura de hardware

Máquinas heterogéneas

Las infraestructuras informáticas paralelas suelen estar compuestas por unidades de distinta potencia informática , que conviene tener en cuenta a la hora de distribuir 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.

Memoria compartida y distribuida

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 mediante mensajes.

Para las computadoras con memoria compartida , la gestión de conflictos de escritura ralentiza en gran medida la velocidad de ejecución individual de cada unidad informática. Sin embargo, pueden funcionar perfectamente en paralelo. Por el contrario, en el caso del intercambio de mensajes, cada uno de los procesadores puede trabajar a máxima 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. Por lo general, los procesadores cuentan cada uno con una memoria interna para almacenar los datos necesarios para los siguientes cálculos y están organizados en clusters sucesivos . A menudo, estos elementos de procesamiento se coordinan mediante memoria distribuida y 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 considerablemente.

Jerarquía

Adaptándose a las estructuras de hardware vistas anteriormente, existen dos categorías principales de algoritmos de equilibrio de carga. Por un lado, aquel en el que las tareas son asignadas por el “maestro” y ejecutadas por “trabajadores” que mantienen al maestro informado del progreso de su trabajo, y el maestro puede entonces encargarse de asignar o reasignar la carga de trabajo en caso de Algoritmo dinámico. La literatura se refiere a esto como arquitectura "maestro-trabajador" . Por otro lado, el control se puede distribuir entre los diferentes nodos. Luego se ejecuta el algoritmo de equilibrio de carga 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 supone un algoritmo de equilibrio de carga dinámico.

Dado que el diseño de cada algoritmo de equilibrio de carga es único, se debe matizar la distinción anterior. Por lo tanto, también es posible tener una estrategia intermedia, con, por ejemplo, nodos "maestros" para cada subclúster, que a su vez están sujetos a un "maestro" global. También existen organizaciones multinivel, con una alternancia entre estrategias de control maestro-esclavo y distribuidas. Estas últimas estrategias rápidamente se vuelven complejas y rara vez se encuentran. Los diseñadores prefieren algoritmos que sean más fáciles de controlar.

Adaptación a arquitecturas más grandes (escalabilidad)

En el contexto de los algoritmos que funcionan a muy largo plazo (servidores, nube...), la arquitectura informática evoluciona con el tiempo. Sin embargo, es preferible no tener que diseñar un algoritmo nuevo cada vez.

Por 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 sigue siendo 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 ser fijo antes de la ejecución, se denomina moldeable. Si, por el contrario, el algoritmo es capaz de manejar 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. [4]

Tolerancia a fallos

Especialmente en clústeres informáticos a gran escala , no es tolerable ejecutar un algoritmo paralelo que no pueda soportar el fallo de un solo componente. Por lo tanto, se están desarrollando algoritmos tolerantes a fallas que puedan detectar fallas en los procesadores y recuperar el cálculo. [5]

Enfoques

Distribución estática con pleno conocimiento de las tareas: suma de prefijos

Si las tareas son independientes entre sí, y si su respectivo tiempo de ejecución y las tareas se pueden subdividir, existe un algoritmo simple y óptimo.

Algoritmo de equilibrio de carga en función de la divisibilidad de tareas.

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. Utilizando un algoritmo de suma de prefijos , esta división se puede calcular en tiempo logarítmico con respecto al número de procesadores. [ cita necesaria ]

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, todavía es posible aproximarse a 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]

La mayoría de las veces, se desconoce el tiempo de ejecución de una tarea y sólo se dispone de aproximaciones aproximadas. Este algoritmo, aunque particularmente eficiente, no es viable para estos escenarios.

Distribución de carga estática sin conocimientos previos

Incluso si el tiempo de ejecución no se conoce de antemano, la distribución estática de la carga siempre es posible.

Programación por turnos

En un algoritmo de operación 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.

estática aleatoria

El equilibrio de carga estático aleatorio es simplemente una cuestión de asignar tareas aleatoriamente a los diferentes servidores. Este método funciona bastante bien. Si, por el contrario, se conoce de antemano el número de tareas, es aún más eficiente calcular de antemano una permutación aleatoria. 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 ha asignado. Incluso aunque se desconozca el número de tareas, es posible evitar la comunicación con una generación de asignaciones pseudoaleatorias conocida por todos los procesadores.

El rendimiento de esta estrategia (medido en el tiempo total de ejecución de un conjunto fijo de tareas determinado) disminuye con el tamaño máximo de las tareas.

Otros

Por supuesto, también existen otros métodos de asignación:

Esquema maestro-trabajador

Los esquemas Master-Worker se encuentran entre los algoritmos de equilibrio de carga dinámico más simples. Un maestro distribuye la carga de trabajo a todos los trabajadores (a veces también denominados "esclavos"). Inicialmente, todos los trabajadores están inactivos y lo informan al maestro. El maestro responde a las solicitudes de los trabajadores y les distribuye las tareas. Cuando ya no tiene más tareas que dar, informa a los trabajadores para que dejen de pedir tareas.

La ventaja de este sistema es que distribuye la carga de forma muy justa. De hecho, si no se tiene en cuenta el tiempo necesario para la tarea, el tiempo de ejecución sería comparable a la suma del prefijo vista 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 lo hace rápidamente inoperable en servidores muy grandes o en computadoras paralelas muy grandes. El maestro actúa como cuello de botella .

Maestro-Trabajador y cuello de botella

Sin embargo, la calidad del algoritmo se puede mejorar enormemente reemplazando el maestro con una lista de tareas que puedan utilizar 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 de computación muy grandes.

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 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 de 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álculo 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 [8] que cuando la red está muy cargada es más eficiente que las unidades menos cargadas ofrezcan su disponibilidad y cuando la red está ligeramente cargada son los procesadores sobrecargados los que requieren apoyo de los más inactivos. Esta regla general limita la cantidad de mensajes intercambiados.

En el caso en el que se parte de una sola tarea grande que no se puede dividir más allá de un nivel atómico, existe un algoritmo muy eficiente de "cálculo en forma de árbol", [9] donde la tarea principal se distribuye en un árbol de trabajo.

Principio

Inicialmente, muchos procesadores tienen una tarea vacía, excepto uno que trabaja en ella de forma secuencial. 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 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, el raíz, ha finalizado, se puede transmitir un mensaje de terminación global. Al final, es necesario reunir los resultados volviendo a subir por el árbol.

Eficiencia

La eficiencia de dicho algoritmo se acerca a la suma de prefijos cuando el tiempo de corte y comunicación del trabajo no es demasiado alto en comparación con el trabajo a realizar. Para evitar costes de comunicación demasiado elevados, es posible imaginar una lista de trabajos en la memoria compartida . Por lo tanto, una solicitud simplemente se lee desde una determinada posición en esta memoria compartida a petición del procesador maestro.

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 poder manejar una gran cantidad de solicitudes por segundo.

servicios basados ​​en internet

Una de las aplicaciones de equilibrio de carga más utilizadas es proporcionar un único servicio de Internet desde varios servidores , lo que a veces se conoce como granja de servidores . Los sistemas comúnmente equilibrados de carga incluyen sitios web populares , grandes redes de chat de retransmisión de Internet , sitios de protocolo de transferencia de archivos (FTP) de gran ancho de banda , servidores de protocolo de transferencia de noticias en red (NNTP), servidores de sistema de nombres de dominio (DNS) y bases de datos.

DNS por turnos

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 a un único nombre de dominio ; los clientes reciben IP de forma circular. La IP se asigna a los clientes con una caducidad corta, por lo que es más probable que el cliente utilice una IP diferente la próxima vez que acceda al servicio de Internet solicitado.

delegación DNS

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 atienden el 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.1dos.ejemplo.org A 203.0.113.2www.example.org NS one.example.orgwww.example.org NS dos.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 registro A. [10] En el servidor uno, el archivo de zona para www.example.org informa:

@ en un 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 no funciona, 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 garantiza que llegue menos tráfico HTTP a ese servidor. Además, la respuesta DNS más rápida al solucionador es casi siempre la del servidor más cercano a la red, lo que garantiza un equilibrio de carga geosensible [ cita necesaria ] . Un TTL corto en el registro A ayuda a garantizar que el tráfico se desvíe rápidamente cuando un servidor falla. Se debe considerar la posibilidad de que esta técnica pueda hacer que clientes individuales cambien entre servidores individuales a mitad de sesión.

Equilibrio de carga aleatorio del lado del cliente

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. [11] [12] Esto esencialmente se basa en que todos los clientes generen cargas similares y en la Ley de los Grandes Números [12] 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 de operación por turnos, que en el caso de servidores de almacenamiento en caché de DNS grandes, tienden a sesgar la distribución para DNS de operación por turnos, mientras que la selección aleatoria del lado del cliente no se ve afectada independientemente del almacenamiento en caché de DNS. [12]

Con este enfoque, el método de entrega de una lista de IP al cliente puede variar y puede implementarse como una lista DNS (entregada a todos los clientes sin ningún round robin) o mediante codificación en la lista. Si se utiliza un "cliente inteligente", que detecta que un servidor seleccionado aleatoriamente está inactivo y se vuelve a conectar aleatoriamente, también proporciona tolerancia a fallas .

Balanceadores de carga del lado del servidor

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 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 éste sepa siquiera la separación interna de funciones. También evita que los clientes se comuniquen 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 propio equilibrador de carga no se convierta en un único punto de fallo . Por lo general, los balanceadores de carga se implementan en pares de alta disponibilidad que también pueden replicar datos de persistencia de sesión si lo requiere la aplicación específica. [13] Ciertas aplicaciones están programadas 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 exclusivos de la base de datos específica. [14]

Algoritmos de programación

Los balanceadores 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. [15] Los balanceadores de carga más sofisticados pueden tener en cuenta factores adicionales, como la carga reportada de un servidor, tiempos de respuesta mínimos, estado activo/inactivo (determinado por una encuesta de monitoreo de algún tipo), una cantidad de conexiones activas, ubicación geográfica, capacidades. , o cuánto tráfico se le ha asignado recientemente.

Persistencia

Una cuestión importante al operar un servicio con equilibrio de carga es cómo manejar la información que debe conservarse en 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 que vayan a diferentes servidores backend no podrán encontrarla. Esta podría 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 sólo introduce un problema de rendimiento. [15]

Idealmente, el grupo de servidores detrás del equilibrador de carga no debería tener en cuenta 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 al 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 "pegajosidad". Una desventaja importante de esta técnica es su falta de conmutación por error automática : si un servidor backend deja de funcionar, su información por sesión se vuelve inaccesible y todas las sesiones que dependan 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 "fijos", la base de datos central sí lo es (ver más abajo).

La asignación a un servidor en particular puede basarse en un nombre de usuario, dirección IP del cliente o aleatoria. Debido a los cambios en la dirección percibida del cliente resultantes del DHCP , la traducción de direcciones de red y los servidores proxy 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 puede perderse y es posible que sea necesario eliminar las asignaciones después de un período de tiempo de espera o durante períodos de carga alta 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 múltiples 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 utiliza 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 mejorar la escalabilidad , la base de datos a menudo se replica en varias máquinas y se utiliza el equilibrio 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 una base de datos de sesión. Todos los servidores de una granja web almacenan los datos de su 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 eficaz es almacenar los datos por sesión en el propio navegador. Una forma de lograrlo es utilizar una cookie del navegador , adecuadamente cifrada y con marca de tiempo. Otra es la reescritura de URL . Almacenar los datos de la sesión en el cliente es generalmente la solución preferida: entonces el balanceador 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 de negocios complejos, donde la carga útil del estado de la sesión es grande y no es factible volver a calcularla 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 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 pseudoaleatoriamente ese nombre a uno de los servidores disponibles y luego almacenar ese bloque de datos en el servidor asignado.

Funciones del equilibrador de carga

Los balanceadores 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:

Carga asimétrica
Se puede asignar manualmente una proporción para hacer que algunos servidores backend obtengan una mayor proporción de la carga de trabajo que otros. A veces, esto se utiliza como una forma burda de tener en cuenta que algunos servidores tienen más capacidad que otros y es posible que no siempre funcionen como se desea.
Activación prioritaria
Cuando la cantidad de servidores disponibles cae por debajo de un número determinado, o la carga aumenta demasiado, los servidores en espera se pueden poner en línea.
Descarga y aceleración de TLS
La aceleración TLS (o su predecesor SSL) es una técnica para descargar cálculos de protocolos criptográficos en hardware especializado. Dependiendo de la carga de trabajo, procesar los requisitos de cifrado y autenticación de una solicitud TLS puede convertirse en una parte importante de la demanda de la CPU del servidor web; A medida que aumenta la demanda, los usuarios verán tiempos de respuesta más lentos, ya que la sobrecarga de TLS se distribuye entre los servidores web. Para eliminar esta demanda en los servidores web, un equilibrador puede finalizar las conexiones TLS y pasar solicitudes HTTPS como solicitudes HTTP a los servidores web. Si el propio equilibrador no está sobrecargado, esto no degrada notablemente el rendimiento percibido por los usuarios finales. La desventaja de este enfoque es que todo el procesamiento TLS se concentra en un solo dispositivo (el equilibrador), lo que puede convertirse en un nuevo cuello de botella. Algunos dispositivos de equilibrio de carga incluyen hardware especializado para procesar TLS. En lugar de actualizar el equilibrador de carga, que es un hardware dedicado bastante caro, puede resultar más económico renunciar a la descarga de TLS y agregar algunos servidores web. Además, algunos proveedores de servidores como Oracle/Sun ahora incorporan hardware de aceleración criptográfica en sus CPU, como el T2000. F5 Networks incorpora una tarjeta de hardware de aceleración TLS dedicada en su administrador de tráfico local (LTM) que se utiliza para cifrar y descifrar el tráfico TLS. Un beneficio claro de la descarga de TLS en el equilibrador es que le permite realizar equilibrios o cambios 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 retardado (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 transferirán para los objetos HTTP mediante la utilización de la compresión gzip disponible en todos los navegadores web modernos. Cuanto mayor sea la respuesta y más lejos esté el cliente, más puede mejorar esta característica los tiempos de respuesta. La desventaja es que esta característica impone una demanda adicional de CPU al equilibrador de carga y, en su lugar, los servidores web podrían realizarla.
descarga TCP
Diferentes proveedores utilizan diferentes términos para esto, pero la idea es que normalmente cada solicitud HTTP de cada cliente sea una conexión TCP diferente. Esta característica utiliza HTTP/1.1 para consolidar múltiples solicitudes HTTP de múltiples clientes en un único socket TCP para los servidores back-end.
Almacenamiento en búfer TCP
El equilibrador de carga puede almacenar en búfer las respuestas del servidor y enviar los datos a los clientes lentos, lo que permite al servidor web liberar un hilo para otras tareas más rápido de lo que lo haría si tuviera que enviar la solicitud completa al cliente directamente.
Devolución directa del servidor
Una opción para la distribución de carga asimétrica, donde la solicitud y la respuesta tienen diferentes rutas de red.
control de salud
El equilibrador sondea los servidores para determinar el estado de la capa de aplicación y elimina los servidores fallidos del grupo.
almacenamiento en caché HTTP
El equilibrador almacena contenido estático para que algunas solicitudes puedan manejarse sin contactar a los servidores.
Filtrado de contenidos
Algunos balanceadores pueden modificar arbitrariamente el tráfico en el camino.
seguridad HTTP
Algunos balanceadores pueden ocultar páginas de error HTTP, eliminar encabezados de identificación del servidor de las respuestas HTTP y cifrar cookies para que los usuarios finales no puedan manipularlas.
cola prioritaria
También conocida como configuración de tarifas , la capacidad de dar diferentes prioridades a diferentes tráficos.
Cambio según el contenido
La mayoría de los balanceadores de carga pueden enviar solicitudes a diferentes servidores según la URL que se solicita, asumiendo que la solicitud no está cifrada (HTTP) o, si está cifrada (a través de HTTPS), la solicitud HTTPS finaliza (descifrada) en el balanceador de carga.
Autenticación de cliente
Autentique a los usuarios con una variedad de fuentes de autenticación antes de permitirles acceder a un sitio web.
Manipulación programática del tráfico
Al menos un equilibrador permite el uso de un lenguaje de secuencias de comandos para permitir métodos de equilibrio personalizados, manipulaciones de tráfico arbitrarias y más.
Cortafuegos
Los firewalls pueden impedir conexiones directas a servidores backend, por razones de seguridad de la red.
Sistema de Prevención de Intrusión
Los sistemas de prevención de intrusiones ofrecen seguridad en la capa de aplicación además de la capa de red/transporte que ofrece la seguridad del firewall.

Telecomunicaciones

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 garanticen el acceso a la red si una de las conexiones falla. Un acuerdo de conmutación por error significaría que un enlace se designa para uso normal, mientras que el segundo enlace se utiliza sólo si falla el enlace principal.

Al utilizar 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 múltiples enlaces simultáneamente aumenta el ancho de banda disponible.

Puente del camino más corto

TRILL (Interconexión transparente de muchos enlaces) facilita que Ethernet tenga una topología arbitraria y permite la división de carga por pares por flujo mediante el 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. [16] [17] El concepto de Rbridges [18] [sic] se propuso por primera vez al Instituto de Ingenieros Eléctricos y Electrónicos en el año 2004, [19] quien en 2005 [20] rechazó lo que se conoció como TRILL, y en los años 2006 a 2012 [21] ideó una variación incompatible conocida como Shortest Path Bridging .

El IEEE aprobó el estándar IEEE 802.1aq en mayo de 2012, [22] 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 totalmente conectadas) al permitir que el tráfico comparta la carga en todas partes. caminos de una red. [23] [24] 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. [25]

Ruta 1

Muchas empresas de telecomunicaciones tienen múltiples rutas a través de sus redes o hacia redes externas. Utilizan un equilibrio de carga sofisticado 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 monitoreo de red . Los balanceadores de carga se pueden usar para dividir grandes flujos de datos en varios subflujos y usar 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 datos puede no ser posible a velocidad de cable . [26]

Redes de centros de datos

El equilibrio de carga se utiliza ampliamente en las redes de centros de datos para distribuir el tráfico a través de muchas rutas existentes entre dos servidores cualesquiera. [27] 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 utilizándolo para determinar cómo se asignan los flujos a una de las rutas existentes. El equilibrio de carga dinámico asigna flujos de tráfico a rutas monitoreando el uso del ancho de banda en diferentes rutas. Las asignaciones dinámicas también 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 la red sigue monitoreando las rutas disponibles y desplaza 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 redes de centros de datos. [27]

Conmutaciones por error

El equilibrio de carga se utiliza a menudo para implementar la conmutación por error : la continuación del servicio después del fallo de uno o más de sus componentes. Los componentes se monitorean continuamente (por ejemplo, los servidores web se pueden monitorear buscando 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 por encima de 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 asume el control en caso de una falla ( redundancia modular dual ). Algunos sistemas RAID también pueden utilizar repuestos dinámicos para lograr un efecto similar. [28]

Ver también

Referencias

  1. ^ ab Sanders, Peter; Mehlhorn, Kurt; Dietzfelbinger, Martín; Dementiev, Roman (11 de septiembre de 2019). Algoritmos y estructuras de datos secuenciales y paralelos: la caja de herramientas básica . Saltador. ISBN 978-3-030-25208-3.
  2. ^ 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". Sensores . 16 (9): 1386. Código bibliográfico : 2016Senso..16.1386L. doi : 10.3390/s16091386 . PMC 5038664 . PMID  27589753. S2CID  391429. 
  3. ^ Alakeel, Ali (noviembre de 2009). "Una guía para el equilibrio de carga dinámico en sistemas informáticos distribuidos". Revista Internacional de Ciencias de la Computación y Seguridad de Redes (IJCSNS) . 10 .
  4. ^ Asghar, Sajjad; Aubanel, Eric; Bremner, David (octubre de 2013). "Un solucionador SAT paralelo basado en programación de trabajos dinámico y moldeable". 2013 42ª Conferencia Internacional sobre Procesamiento Paralelo . págs. 110-119. doi :10.1109/ICPP.2013.20. ISBN 978-0-7695-5117-3. S2CID  15124201.
  5. ^ Punetha Sarmila, G.; Gnanambigai, N.; Dinadayalan, P. (2015). "Encuesta sobre tolerancia a fallas: algoritmos de equilibrio de carga en computación en la nube". 2015 2do Congreso Internacional de Electrónica y Sistemas de Comunicaciones (ICECS) . págs. 1715-1720. doi :10.1109/ECS.2015.7124879. ISBN 978-1-4799-7225-8. S2CID  30175022.
  6. ^ "NGINX y el algoritmo de equilibrio de carga" el poder de dos opciones ". nginx.com . 2018-11-12. Archivado desde el original el 12 de diciembre de 2019.
  7. ^ "Prueba de conducción" Poder de dos opciones aleatorias "Equilibrio de carga". haproxy.com . 2019-02-15. Archivado desde el original el 15 de febrero de 2019.
  8. ^ Ansioso, Derek L; Lazowska, Edward D; Zahorjan, John (1 de marzo de 1986). "Una comparación del reparto de carga adaptativo iniciado por el receptor y el remitente". Evaluación del desempeño . 6 (1): 53–68. doi :10.1016/0166-5316(86)90008-8. ISSN  0166-5316.
  9. ^ 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.
  10. ^ Registro de dirección IPv4 (A)
  11. ^ Patrón: equilibrio de carga del lado del cliente
  12. ^ Arquitectura del lado del servidor abc MMOG. Servidores front-end y equilibrio de carga aleatorio del lado del cliente
  13. ^ "Alta disponibilidad". linuxvirtualserver.org . Consultado el 20 de noviembre de 2013 .
  14. ^ Ranjan, R (2010). "Aprovisionamiento de nube punto a punto: descubrimiento de servicios y equilibrio de carga". Computación en la nube .
  15. ^ ab "Equilibrio de carga 101: tuercas y tornillos". Redes F5 . 2017-12-05. Archivado desde el original el 5 de diciembre de 2017 . Consultado el 23 de marzo de 2018 .
  16. ^ "Todos los sistemas caídos" (PDF) . cio.com . IDG Communications, Inc. Archivado desde el original (PDF) el 23 de septiembre de 2020 . Consultado el 9 de enero de 2022 .
  17. ^ "Todos los sistemas caídos". cio.com . IDG Communications, Inc. Archivado desde el original el 9 de enero de 2022 . Consultado el 9 de enero de 2022 .
  18. ^ "Rbridges: enrutamiento transparente" (PDF) . cursos.cs.washington.edu . Radia Perlman, Laboratorios Sun Microsystems. Archivado desde el original (PDF) el 9 de enero de 2022 . Consultado el 9 de enero de 2022 .
  19. ^ "Rbridges: enrutamiento transparente". researchgate.net . Radia Perlman, Sun Microsystems; Donald Eastlake 3º, Motorola.
  20. ^ "Tutorial TRILL" (PDF) . postel.org . Donald E. Eastlake 3.º, Huawei.
  21. ^ "IEEE 802.1: 802.1aq: puente de ruta más corta". ieee802.org . Instituto de Ingenieros Eléctricos y Electrónicos.
  22. ^ 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 desde el original el 14 de mayo de 2013 . Consultado el 2 de junio de 2012 .
  23. ^ Peter Ashwood-Smith (24 de febrero de 2011). "Descripción general del camino más corto para unir IEEE 802.1aq" (PDF) . Huawei. Archivado desde el original (PDF) el 15 de mayo de 2013 . Consultado el 11 de mayo de 2012 .
  24. ^ Jim Duffy (11 de mayo de 2012). "El sistema de salud más grande de Illinois desarraiga a Cisco para construir una nube privada de 40 millones de dólares". Asesor de PC . Consultado el 11 de mayo de 2012 . El puente de ruta más corto reemplazará al árbol de expansión en la estructura Ethernet.
  25. ^ "IEEE aprueba el nuevo estándar de puente de ruta más corta IEEE 802.1aq". Encendido tecnológico. 7 de mayo de 2012 . Consultado el 11 de mayo de 2012 .
  26. ^ Mohammad Noormohammadpour, Cauligi S. Raghavendra Minimización de los tiempos de finalización del flujo mediante enrutamiento adaptativo a través de redes de área amplia entre centros de datos Sesiones de carteles de IEEE INFOCOM 2018, DOI:10.13140/RG.2.2.36009.90720 6 de enero de 2019
  27. ^ ab M. Noormohammadpour, CS Raghavendra, "Control del tráfico del centro de datos: comprensión de técnicas y compensaciones", Encuestas y tutoriales de comunicaciones IEEE , vol. PP, no. 99, págs. 1-1.
  28. ^ Conmutación por error y equilibrio de carga IBM 6 de enero de 2019

enlaces externos