Equilibrio de carga (informática)
En informática, el equilibrio de carga es el proceso de distribuir un conjunto de tareas entre 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 otros nodos de cómputo se dejan inactivos.
El balanceo 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 eficientes pero requieren intercambios de información entre las diferentes unidades informáticas, a riesgo de pérdida. 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 cumplir mejor con los requisitos específicos de la aplicación.
Naturaleza de las tareas
La eficiencia de los algoritmos de balanceo de carga depende de manera crítica de la naturaleza de las tareas. Por lo 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 llegar a una distribución de carga óptima (ver algoritmo de suma de prefijos). 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 escenario afortunado 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 deben utilizar técnicas más sofisticadas. Una técnica es agregar algunos metadatos a cada tarea. Dependiendo del tiempo de ejecución anterior para metadatos similares, es posible hacer inferencias para una tarea futura en base a estadísticas.
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 otras se completen.
Asumiendo 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 con exactitud. Hay algoritmos, como el planificador de trabajos, que calculan distribuciones de tareas óptimas 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 para dividirse en subtareas durante la ejecución. El "Cálculo en forma de árbol" El algoritmo que se presenta más adelante saca gran ventaja de 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. Por lo tanto, el estado del sistema incluye medidas como el nivel de carga (y, a veces, incluso la sobrecarga) de ciertos procesadores. En cambio, se hacen suposiciones sobre el sistema general 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 rendimiento.
Las técnicas de balanceo de carga estática se suelen centralizar 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 hay alguna variación estadística en la asignación de tareas que puede conducir a la sobrecarga de algunas unidades informáticas.
Dinámico
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 denominadas 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 manera ú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, esto 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.
Arquitectura de hardware
Máquinas heterogéneas
Las infraestructuras informáticas paralelas suelen estar compuestas por unidades de diferente potencia informática, 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ómputo 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 grandes categorías: 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 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 trabajar a toda velocidad. Por otro lado, cuando se trata de intercambio de mensajes colectivos, 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 entran exactamente en una de las categorías. En general, los procesadores tienen cada uno una memoria interna para almacenar los datos necesarios para los siguientes cálculos y están organizados en clústeres 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 únicamente 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
Al adaptarse a las estructuras de hardware vistas anteriormente, existen dos categorías principales de algoritmos de equilibrio de carga. Por un lado, aquella donde las tareas son asignadas por “maestro” y ejecutadas por “trabajadores” quienes mantienen informado al maestro del avance de su trabajo, pudiendo luego el maestro encargarse de asignar o reasignar la carga de trabajo en caso de algoritmo dinámico. La literatura se refiere a esto como "Maestro-Trabajador" arquitectura. Por otro lado, el control se puede distribuir entre los diferentes nodos. A continuación, se ejecuta el algoritmo de equilibrio de carga en cada uno de ellos y se comparte la responsabilidad de asignar tareas (así como 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 balanceo de carga es único, la distinción anterior debe matizarse. Así, también es posible tener una estrategia intermedia, con, por ejemplo, "maestro" nodos para cada subclúster, que a su vez están sujetos a un 'maestro' global. También hay organizaciones multinivel, con una alternancia entre estrategias de control maestro-esclavo y distribuidas. Las últimas estrategias se vuelven rápidamente 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 algoritmos que se ejecutan a muy largo plazo (servidores, nube...), 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 extremadamente importante de un algoritmo de equilibrio de carga es su capacidad para adaptarse a una arquitectura de hardware escalable. Esto se llama la escalabilidad del algoritmo. Se dice que un algoritmo es escalable para un parámetro de entrada cuando su desempeño 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 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.
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 los procesadores y recuperar la computación.
Enfoques
Distribución estática con pleno conocimiento de las tareas: prefijo suma
Si las tareas son independientes entre sí, y si se pueden subdividir sus respectivos tiempos de ejecución y las tareas, existe un algoritmo simple y óptimo.
Al dividir las tareas de tal manera que proporcione la misma cantidad de cómputo a cada procesador, todo lo que queda por hacer es agrupar los resultados. Usando 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 la optimización de 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 es 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 aproximaciones aproximadas. Este algoritmo, aunque particularmente eficiente, no es viable para estos escenarios.
Distribución de cargas estáticas sin conocimientos previos
Incluso si el tiempo de ejecución no se conoce de antemano, la distribución de carga estática 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 manera que las unidades más poderosas reciban la mayor cantidad de solicitudes y las reciban primero.
Estático aleatorio
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, se conoce de antemano el número de tareas, es aún más eficiente calcular una permutación aleatoria de antemano. Esto evita costes de comunicación para cada encargo. 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 de ejecución total para un conjunto fijo de tareas dado) disminuye con el tamaño máximo de las tareas.
Otros
Por supuesto, también hay otros métodos de asignación:
- Menos trabajo: Asignar más tareas a los servidores realizando menos (el método también se puede ponderar).
- Hash: asigna las consultas según una tabla de hash.
- Potencia de dos opciones: elegir dos servidores al azar y elegir el mejor de las dos opciones.
Esquema Maestro-Trabajador
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 (a veces también denominados "esclavos"). Inicialmente, todos los trabajadores están inactivos e informan esto al maestro. El maestro responde a las solicitudes de los trabajadores y les distribuye las tareas. Cuando 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 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 que se ve arriba.
El problema de este algoritmo es que tiene dificultad 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 computadoras paralelas muy grandes. El maestro actúa como un cuello de botella.
Sin embargo, la calidad del algoritmo se puede mejorar mucho reemplazando el maestro con una lista de tareas que pueden usar 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 cómputo 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 una cierta cantidad de tareas de forma aleatoria o predefinida, y luego permitir que los procesadores inactivos "roben" trabajo de 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 eficaz, 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 poca 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 apoyo de los más inactivos. Esta regla general limita el número de mensajes intercambiados.
En el caso de que uno comience con una sola 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 trabajo árbol.
Principio
Al principio, 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 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 finalización global. Al final, es necesario ensamblar los resultados volviendo a subir en el árbol.
Eficiencia
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.
Casos de uso
Además de la resolución eficiente de problemas a través de cálculos paralelos, los algoritmos de equilibrio de carga se usan ampliamente en la administració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 de carga balanceada comúnmente incluyen sitios web populares, grandes redes de Internet Relay Chat, 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
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, varias direcciones IP se asocian con un solo nombre de dominio; a los clientes se les da IP en forma rotativa. La IP se asigna a los clientes con una caducidad 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 solicitado.
Delegación de DNS
Otra técnica más efectiva para equilibrar la carga usando DNS es delegar www.example.org como un subdominio cuya zona es atendida por cada uno de los mismos servidores que están sirviendo el sitio web. Esta técnica funciona especialmente bien cuando los servidores individuales están dispersos geográficamente en Internet. Por ejemplo:
one.example.org A 192.0.2.1 dos.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 registro A. En el servidor one, 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 manera, cuando un servidor está caído, su DNS no responderá y el servicio web no recibirá ningún tráfico. Si la línea a un servidor está congestionada, la falta de confiabilidad de DNS asegura que llegue menos tráfico HTTP 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 geosensible. Un TTL corto en el registro A ayuda a garantizar que el tráfico se desvíe rápidamente cuando un servidor deja de funcionar. Se debe considerar la posibilidad de que esta técnica pueda causar que los clientes individuales cambien entre servidores individuales en medio de la sesión.
Equilibrio de carga aleatorio del lado del cliente
Otro enfoque para equilibrar la carga es entregar una lista de direcciones IP del servidor al cliente y luego hacer que el cliente seleccione aleatoriamente la dirección 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 uniforme entre los servidores. Se ha afirmado que el equilibrio de carga aleatorio del lado del cliente tiende a proporcionar una mejor distribución de la carga que el DNS de turno rotativo; esto se ha atribuido a problemas de almacenamiento en caché con DNS de turno rotatorio, que en el caso de grandes servidores de almacenamiento en caché de DNS, tienden a sesgar la distribución para DNS de turno rotativo, 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 una lista de direcciones 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 codificarla en la lista. Si un "cliente inteligente" se usa, detectando que un servidor seleccionado aleatoriamente está inactivo y conectándose aleatoriamente nuevamente, 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 las solicitudes a uno de los "backend" servidores, que generalmente responde al equilibrador de carga. Esto permite que el balanceador de carga responda al cliente sin que el cliente sepa sobre 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 brindan 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 balanceador 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 error. 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 la aplicación específica lo requiere. Ciertas aplicaciones están programadas con inmunidad a este problema, compensando el punto de equilibrio de carga sobre plataformas de uso compartido diferencial más allá de la red definida. Los algoritmos secuenciales emparejados con estas funciones están definidos por parámetros flexibles exclusivos de la base de datos específica.
Algoritmos de programación
Los balanceadores de carga utilizan numerosos algoritmos de programación, también llamados métodos de balanceo de carga, para determinar a qué servidor back-end enviar una solicitud. Los algoritmos simples incluyen elección aleatoria, turnos rotativos o conexiones mínimas. Los balanceadores 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 arriba/abajo (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
Un problema importante al operar un servicio de equilibrio de carga es cómo manejar la información que se debe mantener a través de 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. Esta podría ser información almacenada en caché que se puede volver a calcular, en cuyo caso el equilibrio de carga de una solicitud a un servidor back-end diferente solo presenta un problema de rendimiento.
Idealmente, el grupo de servidores detrás del equilibrador de carga no debe 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 ve 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 "pegajosidad". Una desventaja importante de esta técnica es la falta de conmutación por error automática: si un servidor de back-end deja de funcionar, su información por sesión se vuelve inaccesible y se pierde cualquier sesión que dependa de ella. El mismo problema suele ser relevante para los servidores de bases de datos centrales; incluso si los servidores web son "sin estado" y no "sticky", la base de datos central 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 aleatoria. Debido a los cambios en la dirección percibida del cliente como resultado de DHCP, la traducción de direcciones de red y los proxies web, este método puede no ser confiable. El balanceador 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 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 balanceadores de carga sofisticados usan 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 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 punto único de falla y para 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 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 lograr esto es utilizar una cookie de navegador, debidamente codificada y con marca de tiempo. Otro es la reescritura de URL. Almacenar los datos de la sesión en el cliente es generalmente la solución preferida: luego, el balanceador de carga es libre de elegir cualquier servidor back-end para manejar una solicitud. Sin embargo, este método de manejo de datos de estado no se adapta bien a algunos escenarios de lógica comercial compleja, 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 modificar 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.
Características del balanceador 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 en una cantidad de 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 relación para que algunos servidores de backend obtengan una mayor parte del volumen de trabajo que otros. Esto se utiliza a veces como una forma cruda de contabilizar algunos servidores que tienen más capacidad que otros y no siempre funcionan como se desea.
- Activación prioritaria
- Cuando el número de servidores disponibles cae por debajo de cierto número, o la carga es demasiado alta, los servidores de reserva se pueden traer en línea.
- TLS Offload and Acceleration
- La aceleración TLS (o su predecesor SSL) es una técnica de descarga de cálculos de protocolos criptográficos en hardware especializado. Dependiendo de la carga de trabajo, el procesamiento de los requisitos de cifrado y autenticación de una solicitud TLS puede convertirse en una parte importante de la demanda en la CPU del Servidor Web; a medida que aumenta la demanda, los usuarios verán tiempos de respuesta más lentos, ya que la TLS se distribuye entre servidores Web. Para eliminar esta demanda en servidores Web, un balanceador puede terminar las conexiones TLS, pasando solicitudes HTTPS como solicitudes HTTP a los servidores Web. Si el balanceador en sí 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 balanceador) que puede convertirse en un nuevo cuello de botella. Algunos aparatos de balanza de carga incluyen hardware especializado para procesar TLS. En lugar de actualizar el balanceador de carga, que es un hardware dedicado bastante caro, puede ser más barato para descargar TLS y añadir algunos servidores web. Además, algunos proveedores de servidores como Oracle/Sun ahora incorporan hardware de aceleración criptográfico en sus CPU, como el T2000. F5 Networks incorpora una tarjeta de hardware de aceleración TLS dedicada en su gestor de tráfico local (LTM) que se utiliza para encriptar y descifrar el tráfico TLS. Un beneficio claro para la descarga de TLS en el balanceador es que le permite hacer equilibrio o conmutación de contenido basado en datos en la solicitud HTTPS.
- Distributed Denial of Service (DDoS) attack protection
- Los balanceadores de carga pueden proporcionar características como las cookies SYN y la unión retardada (los servidores de back-end no ven al cliente hasta que termine su apretón de manos TCP) para mitigar los ataques de inundación SYN y generalmente descargar trabajo de los servidores a una plataforma más eficiente.
- Compresión HTTP
- La compresión HTTP reduce la cantidad de datos que deben transferirse para objetos HTTP utilizando la compresión gzip disponible en todos los navegadores web modernos. Cuanto más grande sea la respuesta y más lejos esté el cliente, más puede mejorar los tiempos de respuesta. La compensación es que esta función pone demanda adicional de CPU en el balanceador de carga y podría ser hecha por servidores web en su lugar.
- Descarga de TCP
- Los diferentes proveedores utilizan diferentes términos para esto, pero la idea es que normalmente cada solicitud HTTP de cada cliente es una conexión TCP diferente. Esta función utiliza HTTP/1.1 para consolidar múltiples solicitudes de HTTP de varios clientes en un solo socket TCP a los servidores de back-end.
- TCP buffering
- El balanceador de carga puede amortiguar las respuestas del servidor y entregar los datos a clientes lentos, permitiendo al servidor web liberar un hilo para otras tareas más rápido de lo que sería si tuviera que enviar toda la solicitud al cliente directamente.
- Direct Server Return
- Una opción para la distribución de carga asimétrica, donde la solicitud y respuesta tienen diferentes vías de red.
- Control de salud
- El balanceador encuesta servidores para la salud de capa de aplicación y elimina servidores fallidos de la piscina.
- Caché de HTTP
- El balanceador almacena contenido estático para que algunas solicitudes se puedan manejar sin contactar con los servidores.
- Filtro de contenidos
- Algunos balanceadores pueden modificar arbitrariamente el tráfico en el camino.
- Seguridad HTTP
- Algunos balanceadores pueden ocultar las páginas de error HTTP, eliminar los encabezados de identificación del servidor de las respuestas HTTP y encriptar las cookies para que los usuarios finales no puedan manipularlas.
- Solución de prioridades
- También conocido como configuración de tarifas, la capacidad de dar diferentes prioridades al tráfico diferente.
- Cambio de contenido
- La mayoría de los balanceadores de carga pueden enviar solicitudes a diferentes servidores sobre la base de la URL que se solicita, asumiendo que la solicitud no está encriptada (HTTP) o si está encriptada (a través de HTTPS) que la solicitud HTTPS se termina (descifrado) en el balanceador de carga.
- autenticación del cliente
- Autentice a los usuarios contra diversas fuentes de autenticación antes de permitirles acceder a un sitio web.
- Manipulación del tráfico programático
- Al menos un balanceador permite el uso de un lenguaje de scripting para permitir métodos de equilibrio personalizados, manipulaciones de tráfico arbitrarios, y más.
- Firewall
- Firewalls puede prevenir conexiones directas a servidores backend, por razones de seguridad de red.
- Sistema de prevención de intrusiones
- Los sistemas de prevención de la intrusión ofrecen seguridad de capas de aplicación además de la capa de red/transportación ofrecida por seguridad de cortafuegos.
Telecomunicaciones
El equilibrio de carga puede ser ú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 falla una de las conexiones. Un acuerdo 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 supervisa la disponibilidad de todos los enlaces y selecciona la ruta para enviar paquetes. El uso de múltiples enlaces aumenta simultáneamente el ancho de banda disponible.
Puente de ruta más corta
TRILL (interconexión transparente de muchos enlaces) facilita que Ethernet tenga una topología arbitraria y permite la división de carga por pares de 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. El concepto de Rbridges [sic] se propuso por primera vez al Instituto de Ingenieros Eléctricos y Electrónicos en el año 2004, quienes en 2005 rechazaron lo que llegó a ser ser conocido como TRILL, y en los años 2006 a 2012 ideó una variación incompatible conocida como Shortest Path Bridging.
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 balanceo de carga en topologías de red en malla (parcialmente conectadas o completamente conectadas) al permitir que el tráfico se cargue compartido entre todos. caminos de una red. SPB está diseñado para eliminar virtualmente el error humano durante la configuración y conserva la naturaleza plug-and-play que estableció a Ethernet como el protocolo de facto en la Capa 2.
Enrutamiento 1
Muchas empresas de telecomunicaciones tienen múltiples rutas a través de sus redes o hacia redes externas. Usan 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 usar el balanceo de carga es en 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 los datos puede no ser posible a la velocidad del cable.
Redes de centros de datos
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 flujos de tráfico a las rutas al monitorear 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 hecha, 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.
Conmutaciones por error
El equilibrio de carga se usa a menudo para implementar la conmutación por error: la continuación del servicio después de la falla de uno o más de sus componentes. Los componentes se monitorean continuamente (p. ej., los servidores web pueden monitorearse al obtener 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 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 en vivo se combina con un único componente de respaldo que se hace cargo en caso de falla (redundancia modular dual). Algunos sistemas RAID también pueden utilizar repuesto dinámico para lograr un efecto similar.
Contenido relacionado
Lenguaje sensible al contexto
Propulsor de iones
Lista de inventores