Panorama de la tecnología de equilibrio de carga: teoría, práctica y estudios de casos.

En la era actual de Internet, con el aumento del número de usuarios y la expansión de la escala empresarial, un solo servidor ya no puede satisfacer las necesidades de alta concurrencia y gran tráfico. Para resolver este problema, surgió la tecnología de equilibrio de carga. El equilibrio de carga puede distribuir una gran cantidad de solicitudes de red a múltiples servidores para su procesamiento, mejorando así las capacidades de procesamiento del sistema y garantizando una alta disponibilidad de los servicios. El núcleo del equilibrio de carga es el algoritmo de equilibrio de carga, que determina cómo distribuir las solicitudes a varios servidores. Este artículo presentará en detalle el principio del algoritmo de equilibrio de carga y explorará su aplicación en la práctica basándose en escenarios de aplicación reales.



1. Introducción al equilibrio de carga.
1.1 Desafíos de desarrollo de grandes sitios web

En los primeros días de Internet, los grandes sitios web enfrentaban enormes desafíos. A medida que aumenta el número de usuarios y la cantidad de datos se dispara, un solo servidor a menudo no puede soportar una presión tan enorme. Esto conduce a la aparición de cuellos de botella en el rendimiento, tiempos de respuesta del servidor más prolongados y una experiencia de usuario degradada. Al mismo tiempo, la escalabilidad de un solo servidor también es limitada: a medida que el negocio se desarrolla, el tráfico puede aumentar drásticamente y es difícil para un solo servidor satisfacer la demanda agregando recursos de hardware. Lo que es más grave es que todas las solicitudes se envían al mismo servidor y, una vez que ese servidor falla, todo el servicio se interrumpirá.

Para resolver estos problemas, los sitios web comenzaron a intentar adoptar la expansión vertical y la expansión horizontal.

La expansión vertical mejora las capacidades de procesamiento al aumentar el rendimiento del hardware del servidor, pero este método tiene cuellos de botella en el rendimiento y altos costos.

La expansión horizontal aumenta las capacidades de procesamiento del sistema al aumentar la cantidad de servidores y distribuir la carga a múltiples servidores. Sin embargo, cómo distribuir eficazmente las solicitudes de los usuarios a diferentes servidores para que la carga de cada servidor se mantenga dentro de un rango razonable se ha convertido en un nuevo problema.

Esto nos lleva al tema que queremos discutir hoy: el equilibrio de carga.

1.2 ¿Qué es el equilibrio de carga?

Wikipedia: el equilibrio de carga (inglés: equilibrio de carga) es una tecnología informática que se utiliza para distribuir la carga entre varias computadoras (grupos de computadoras), conexiones de red, CPU, unidades de disco u otros recursos para optimizar el uso de recursos y maximizar el rendimiento, minimizando el tiempo de respuesta y evitando sobrecarga. El uso de varios componentes de servidor con equilibrio de carga en lugar de un solo componente puede mejorar la confiabilidad mediante la redundancia. Los servicios de equilibrio de carga suelen ser realizados por software y hardware especializados. Su función principal es asignar razonablemente una gran cantidad de trabajos a múltiples unidades operativas para su ejecución y se utiliza para resolver problemas de alta concurrencia y alta disponibilidad en la arquitectura de Internet.

Enciclopedia Baidu: el equilibrio de carga se basa en la estructura de red existente y proporciona un método económico, eficaz y transparente para ampliar el ancho de banda de los dispositivos y servidores de red, aumentar el rendimiento, mejorar las capacidades de procesamiento de datos de la red y mejorar la flexibilidad y disponibilidad de la red.

El equilibrio de carga es una tecnología informática que se utiliza para distribuir la carga de trabajo entre varias computadoras (como un grupo de computadoras), conexiones de red, CPU, discos duros u otros recursos. Su objetivo principal es optimizar el uso de recursos, maximizar el rendimiento, minimizar el tiempo de respuesta y evitar sobrecargar cualquier recurso.

En aplicaciones prácticas, el equilibrio de carga suele utilizar varios componentes de servidor en lugar de un solo componente para mejorar la confiabilidad y la redundancia del sistema. Estos componentes del servidor pueden ser servidores físicos o máquinas virtuales. Los servicios de equilibrio de carga suelen realizarse mediante software y hardware dedicados (como equilibradores de carga).

En la arquitectura de Internet, el equilibrio de carga se utiliza principalmente para resolver problemas de alta concurrencia y alta disponibilidad. Por ejemplo, cuando el número de visitas a un sitio web aumenta repentinamente, el equilibrio de carga puede distribuir estas solicitudes de acceso a múltiples servidores para garantizar el funcionamiento normal del sitio web.

imagen-20230922184707769

Cuando un usuario solicita un servicio remoto, la solicitud se envía primero al servidor DNS. El servidor DNS resolverá el nombre de dominio en la dirección IP correspondiente y la solicitud se enviará a esta dirección IP, que suele ser una puerta de enlace o un equilibrador de carga. El equilibrador de carga enruta las solicitudes a un servidor en el backend según algún algoritmo (como round robin, mínimas conexiones, etc.). De esta manera, las solicitudes de los usuarios se pueden distribuir de manera efectiva a diferentes servidores, logrando así equilibrio de carga y mejorando el rendimiento y la disponibilidad del sistema.

1.2 Por qué es necesario el equilibrio de carga

El equilibrio de carga juega un papel importante en los sistemas informáticos modernos. Sus funciones principales incluyen:

  1. Mejore el rendimiento y el rendimiento: el equilibrio de carga puede distribuir solicitudes a múltiples servidores back-end, lo que hace que la carga manejada por cada servidor sea más equilibrada. Esto puede mejorar el rendimiento general y el rendimiento del sistema, acortar el tiempo de espera del usuario y mejorar la experiencia del usuario;
  2. Mejorar la disponibilidad del sistema: por ejemplo, al distribuir la carga entre varios servidores, incluso si un servidor falla, otros servidores aún pueden continuar procesando solicitudes, mejorando así la disponibilidad y confiabilidad del sistema. El equilibrador de carga puede detectar fallas automáticamente y reenviar solicitudes a los servidores disponibles, lo que reduce el riesgo de interrupción del servicio;
  3. Logre la escalabilidad del sistema: el equilibrador de carga puede agregar o eliminar dinámicamente servidores back-end en función de las condiciones de carga reales para lograr una expansión elástica del sistema. Cuando la carga aumenta, se pueden agregar más servidores para compartir la carga; cuando la carga disminuye, se puede reducir la cantidad de servidores para ahorrar recursos;
  4. Resuelva los problemas de alta concurrencia y alta disponibilidad: en la arquitectura de Internet, el equilibrio de carga puede resolver eficazmente los problemas de alta concurrencia y alta disponibilidad. Al distribuir solicitudes a múltiples servidores, puede equilibrar la carga y evitar sobrecargar un solo servidor, brindando así una mejor experiencia de usuario;
  5. Mejore la utilización de recursos: el equilibrio de carga puede distribuir solicitudes al servidor más adecuado en función de los indicadores de rendimiento y las condiciones de carga del servidor. Esto puede hacer un mejor uso de los recursos del servidor y mejorar la utilización de los recursos.

En resumen, el equilibrio de carga juega un papel importante en la mejora del rendimiento, la disponibilidad, la confiabilidad y la utilización de recursos, y es una de las tecnologías clave para construir sistemas informáticos eficientes y confiables.

1.4 Principio de funcionamiento del equilibrio de carga

El principio de funcionamiento del equilibrio de carga se puede resumir brevemente en los siguientes pasos:

  1. Recepción de solicitudes: cuando un usuario realiza una solicitud, la solicitud se envía primero al equilibrador de carga.
  2. Distribución de solicitudes: el equilibrador de carga distribuirá la solicitud a un servidor en el backend en función de un determinado algoritmo de equilibrio de carga, como round robin, conexión mínima, hash de dirección de origen, etc. Durante este proceso, el equilibrador de carga tendrá en cuenta la carga actual de los servidores back-end para garantizar que la carga de todos los servidores permanezca dentro de un rango razonable.
  3. Devolución de respuesta: después de que el servidor backend procesa la solicitud del usuario, devolverá la respuesta al equilibrador de carga, y el equilibrador de carga devolverá la respuesta al usuario;
  4. Comprobación de estado: el equilibrador de carga realizará periódicamente comprobaciones de estado en los servidores backend. Si se descubre que un servidor está defectuoso, el equilibrador de carga eliminará el servidor de la lista de servicios y ya no le distribuirá solicitudes. Cuando el servidor vuelva a la normalidad, el equilibrador de carga lo agregará nuevamente a la lista de servicios.

A través de los pasos anteriores, el equilibrador de carga puede distribuir eficazmente las solicitudes de los usuarios a múltiples servidores, logrando así el equilibrio de carga y mejorando el rendimiento y la disponibilidad del sistema.


2. Clasificación del equilibrio de carga.

Podemos clasificar las muchas tecnologías que admiten el equilibrio de carga desde múltiples dimensiones.

2.1 Equilibrio de carga de DNS

El equilibrio de carga de DNS es un método de equilibrio de carga simple y común, que se utiliza principalmente para lograr el equilibrio de carga a nivel geográfico. A través del equilibrio de carga de DNS, las solicitudes de los usuarios pueden dirigirse al servidor con la ubicación geográfica más cercana, reduciendo así la latencia de la red y mejorando la experiencia del usuario. Específicamente, el servidor DNS resolverá el mismo nombre de dominio en diferentes direcciones IP según la ubicación geográfica del usuario.

imagen-20230922182820776

Por ejemplo, para el mismo nombre de dominio www.baidu.com, los usuarios del norte pueden obtener la dirección IP de la sala de informática de Beijing, mientras que los usuarios del sur pueden obtener la dirección IP de la sala de informática de Shanghai. De esta manera, las solicitudes de los usuarios se pueden distribuir de manera efectiva a diferentes servidores para lograr el equilibrio de carga.

El equilibrio de carga de DNS puede lograr un equilibrio de carga global. Porque el servidor DNS puede seleccionar la IP del servidor más adecuada y devolverla al cliente en función de la ubicación geográfica del cliente, las condiciones de la red y otros factores, logrando así la distribución global del tráfico. Por ejemplo, las solicitudes de usuarios de Europa se pueden distribuir a servidores en Europa y las solicitudes de usuarios de Estados Unidos se pueden distribuir a servidores en Estados Unidos.

Sin embargo, el equilibrio de carga de DNS también tiene algunas limitaciones. Por ejemplo, el cliente o los dispositivos de red intermedios pueden almacenar en caché los resultados de la consulta DNS, lo que hace que la política de equilibrio de carga no entre en vigor en tiempo real. Además, el equilibrio de carga de DNS no puede lograr la persistencia de la sesión y no puede ajustarse dinámicamente en función de las condiciones de carga en tiempo real del servidor. Por lo tanto, el equilibrio de carga DNS generalmente se usa junto con otras tecnologías de equilibrio de carga (como el equilibrio de carga de cuatro capas, el equilibrio de carga de siete capas) para lograr un equilibrio de carga más eficiente.

2.2 Clasificación según el método de implementación

Según el método de implementación, el equilibrio de carga se puede dividir principalmente en dos categorías: equilibrio de carga de hardware y equilibrio de carga de software:

  1. Equilibrio de carga de hardware: Los equilibradores de carga de hardware son dispositivos físicos especializados. Estos dispositivos son potentes, potentes, de alto rendimiento y altamente confiables. Son adecuados para manejar tráfico de red a gran escala. Sin embargo, no son baratos y generalmente solo están disponibles para gente "rica" ​​Sólo las empresas considerarán el uso de dichos equipos;

  2. Equilibrio de carga de software: los equilibradores de carga de software son software que se ejecutan en servidores normales, son de bajo costo y tienen buena escalabilidad. Los balanceadores de carga de software se pueden ampliar o reducir fácilmente según sea necesario, lo que los hace adecuados para la computación en la nube y los entornos virtualizados. Los más comunes son Nginx y LVS: Nginx es un software de equilibrio de carga de 7 capas y LVS es un equilibrio de carga de 4 capas del kernel de Linux.

2.3 Clasificación según nivel de trabajo

El equilibrio de carga se puede dividir principalmente en dos categorías: equilibrio de carga de cuatro capas y equilibrio de carga de siete capas según la clasificación de los niveles de trabajo:

  1. Equilibrio de carga de cuatro capas: el equilibrio de carga de cuatro capas funciona en la capa de transporte del modelo de red y realiza el equilibrio de carga principalmente en función de la dirección IP y el número de puerto solicitados. Al balanceador de carga de Capa 4 no le importa el contenido específico de la solicitud y simplemente reenvía la solicitud a un servidor en el backend. Por lo tanto, el equilibrio de carga de cuatro capas tiene una velocidad de procesamiento más rápida pero menor flexibilidad;
  2. Equilibrio de carga de siete capas: el equilibrio de carga de siete capas funciona en la capa de aplicación del modelo de red y puede realizar el equilibrio de carga en función del contenido específico de la solicitud (como URL, encabezado de solicitud, método de solicitud, etc.). El equilibrador de carga de siete capas puede comprender el contenido específico de la solicitud, por lo que puede implementar estrategias de equilibrio de carga más complejas, como equilibrio de carga basado en URL, equilibrio de carga basado en sesiones, etc. Sin embargo, debido a la necesidad de procesar el contenido específico de la solicitud, la velocidad de procesamiento del equilibrio de carga de siete capas es relativamente lenta.

En las aplicaciones reales, muchos sitios web grandes y proveedores de servicios en la nube utilizan tanto el equilibrio de carga de capa cuatro como el equilibrio de carga de capa siete para lograr un equilibrio de carga más eficiente y flexible.

2.4 Clasificación según ámbito de trabajo

El equilibrio de carga se puede dividir principalmente en dos categorías: equilibrio de carga global y equilibrio de carga local según el ámbito de trabajo:

  1. Equilibrio de carga global: el equilibrio de carga global se utiliza principalmente para equilibrar la carga entre múltiples centros de datos en todo el mundo. Puede distribuir de forma inteligente las solicitudes de los usuarios al centro de datos más apropiado en función de factores como las condiciones de carga de cada centro de datos, las condiciones de la red y la ubicación geográfica del cliente. Esto reduce la latencia de la red y mejora el rendimiento y la disponibilidad del servicio;
  2. Equilibrio de carga parcial: el equilibrio de carga parcial se utiliza principalmente para equilibrar la carga entre varios servidores dentro de un único centro de datos. Por lo general, utiliza estrategias de equilibrio de carga más granulares, como sondeo, menos conexiones, hash de direcciones de origen, etc., para lograr una utilización más eficiente de los recursos y un mejor rendimiento.
2.5 Clasificación según parte implementadora

El equilibrio de carga se puede dividir en equilibrio de carga del lado del servidor y equilibrio de carga del lado del cliente según la clasificación del implementador, y su alcance y objetivos de trabajo son diferentes:

  1. Equilibrio de carga del lado del servidor: en este método, el equilibrador de carga se encuentra en el lado del servidor y todas las solicitudes de los clientes se envían primero al equilibrador de carga. El equilibrador de carga distribuye solicitudes a un servidor en el backend según un algoritmo de equilibrio de carga. Las ventajas de este método son una implementación sencilla, una alta transparencia y no se requiere ningún procesamiento especial por parte del cliente. Sin embargo, todas las solicitudes deben pasar por el equilibrador de carga, lo que puede convertirse en un cuello de botella en el rendimiento;
  2. Equilibrio de carga del cliente: en este enfoque, la lógica de equilibrio de carga se implementa en el lado del cliente. El cliente obtendrá una lista de todos los servicios disponibles del centro de registro de servicios y luego seleccionará un servicio para solicitar según el algoritmo de equilibrio de carga. La ventaja de este método es que puede evitar que el equilibrador de carga del lado del servidor se convierta en un cuello de botella en el rendimiento, pero requiere que la lógica de equilibrio de carga se implemente en el cliente, lo que aumenta la complejidad del cliente.

3. Algoritmo de equilibrio de carga
3.1 Algoritmo de sondeo

Round Robin es un algoritmo de equilibrio de carga muy simple. En este algoritmo, el equilibrador de carga distribuye las solicitudes recibidas a los servidores backend en un orden predeterminado.

Específicamente, el equilibrador de carga mantiene una lista de servidores. Cuando llega una nueva solicitud, el equilibrador de carga asignará la solicitud al siguiente servidor de la lista y luego moverá el servidor al final de la lista. De esta forma, cada servidor tendrá la oportunidad de procesar solicitudes por turno, logrando así el equilibrio de carga.

Por ejemplo, supongamos que hay tres servidores A, B y C. Cuando llegue la primera solicitud, el balanceador de carga la asignará al servidor A; cuando llegue la segunda solicitud, el balanceador de carga la asignará al servidor B; cuando llegue la tercera solicitud, el balanceador de carga la asignará al servidor C; cuando llegue la Llega la cuarta solicitud, el equilibrador de carga la asigna nuevamente al servidor A, y así sucesivamente.

Implementación simple de pseudocódigo:

// 定义一个类 RoundRobinLoadBalancer
public class RoundRobinLoadBalancer {
    
    
    // 定义一个服务器列表 servers
    private List<String> servers;
    // 定义一个当前索引 currentIndex
    private int currentIndex;

    // 定义一个构造函数,接收一个服务器列表作为参数
    public RoundRobinLoadBalancer(List<String> servers) {
    
    
        this.servers = servers;
        this.currentIndex = 0;
    }

    // 定义一个方法 getNextServer,返回下一个服务器
    public synchronized String getNextServer() {
    
    
        // 如果 currentIndex 大于等于 servers 的长度,将 currentIndex 设置为 0
        if (currentIndex >= servers.size()) {
    
    
            currentIndex = 0;
        }
        // 获取 servers 中 currentIndex 对应的服务器
        String server = servers.get(currentIndex);
        // 将 currentIndex 加 1
        currentIndex++;
        // 返回 server
        return server;
    }
}

En este pseudocódigo, getNextServercada vez que se llama al método, devuelve el siguiente servidor en la lista de servidores y actualiza el índice actual. Cuando el índice actual excede la longitud de la lista de servidores, se restablecerá a 0 para implementar el sondeo. Tenga en cuenta el uso de la palabra clave aquí synchronizedpara garantizar la seguridad del hilo.

La ventaja del algoritmo de sondeo es que es fácil de implementar y puede lograr un mejor equilibrio de carga cuando el rendimiento del servidor es similar. Sin embargo, si el rendimiento del servidor es desigual o el tiempo para procesar las solicitudes varía mucho, es posible que el algoritmo de sondeo no pueda lograr un buen efecto de equilibrio de carga.

3.2 Algoritmo de sondeo ponderado

Round Robin ponderado es una variante del algoritmo de sondeo que tiene en cuenta que las capacidades de procesamiento de los servidores backend pueden ser diferentes.

En el algoritmo de sondeo ponderado, a cada servidor se le asigna un peso que refleja las capacidades de procesamiento del servidor. A los servidores con pesos más altos se les asignarán más solicitudes.

Específicamente, el balanceador de carga mantiene una lista de servidores, cada uno con un peso. Cuando llega una nueva solicitud, el equilibrador de carga distribuye la solicitud según el peso del servidor. Por ejemplo, si el peso del servidor A es 3 y el peso del servidor B es 2, entonces de 5 solicitudes, el servidor A manejará 3 solicitudes y el servidor B manejará 2 solicitudes.

Implementación simple de pseudocódigo:

// 定义一个类 WeightedRoundRobinLoadBalancer
public class WeightedRoundRobinLoadBalancer {
    
    
    // 定义一个服务器列表 servers,每个服务器有一个权重
    private Map<String, Integer> servers;
    // 定义一个当前索引 currentIndex 和当前权重 currentWeight
    private int currentIndex;
    private int currentWeight;

    // 定义一个构造函数,接收一个服务器列表和对应的权重作为参数
    public WeightedRoundRobinLoadBalancer(Map<String, Integer> servers) {
    
    
        this.servers = servers;
        this.currentIndex = -1;
        this.currentWeight = 0;
    }

    // 定义一个方法 getNextServer,返回下一个服务器
    public synchronized String getNextServer() {
    
    
        // 获取服务器列表的大小
        int size = servers.size();
        // 循环直到找到一个合适的服务器
        while (true) {
    
    
            // 如果 currentIndex 为 size - 1,将 currentIndex 设置为 0,currentWeight 减 1
            if (currentIndex == size - 1) {
    
    
                currentIndex = 0;
                currentWeight--;
                // 如果 currentWeight 为 0,找出服务器列表中的最大权重,设置为 currentWeight
                if (currentWeight == 0) {
    
    
                    currentWeight = getMaxWeight();
                    // 如果 currentWeight 仍为 0,表示没有可用的服务器,返回 null
                    if (currentWeight == 0) {
    
    
                        return null;
                    }
                }
            } else {
    
    
                currentIndex++;
            }
            // 如果当前服务器的权重大于等于 currentWeight,返回当前服务器
            if (servers.get(currentIndex) >= currentWeight) {
    
    
                return servers.get(currentIndex);
            }
        }
    }

    // 定义一个方法 getMaxWeight,返回服务器列表中的最大权重
    private int getMaxWeight() {
    
    
        int max = 0;
        for (int weight : servers.values()) {
    
    
            max = Math.max(max, weight);
        }
        return max;
    }
}

En este pseudocódigo, getNextServercada vez que se llama al método, volverá al siguiente servidor según el peso del servidor y actualizará el índice y el peso actuales. Cuando se agotan los pesos de todos los servidores, se vuelve a calcular el peso máximo, implementando así el sondeo ponderado. Tenga en cuenta el uso de la palabra clave aquí synchronizedpara garantizar la seguridad del hilo.

La ventaja del algoritmo de sondeo ponderado es que puede manejar mejor el rendimiento desigual del servidor. Al ajustar el peso del servidor, la carga se puede equilibrar más. Sin embargo, esto requiere una comprensión precisa del rendimiento del servidor y puede requerir un ajuste manual de los pesos cuando cambia el rendimiento del servidor.

3.3 Algoritmo menos conectado

Least Connections es un algoritmo de equilibrio de carga de uso común. En este algoritmo, las nuevas solicitudes se asignan al servidor con la menor cantidad de conexiones activas.

Específicamente, el equilibrador de carga mantiene una lista de servidores y monitorea la cantidad de conexiones activas para cada servidor en tiempo real. Cuando llega una nueva solicitud, el equilibrador de carga asignará la solicitud al servidor con la menor cantidad de conexiones activas.

La ventaja del algoritmo menos conectado es que puede realizar dinámicamente el equilibrio de carga en función de la carga real del servidor. Esto funciona bien para solicitudes que tardan distintos tiempos en procesarse, ya que las solicitudes que tardan más en procesarse requieren más conexiones, lo que reduce la posibilidad de que se asignen nuevas solicitudes al servidor.

La desventaja del algoritmo de mínimas conexiones es que requiere monitoreo en tiempo real de la cantidad de conexiones activas por servidor, lo que puede aumentar la complejidad y la sobrecarga del balanceador de carga. Además, si el rendimiento del servidor es desigual, es posible que el algoritmo de menor conexión no logre un buen efecto de equilibrio de carga.

3.4 Algoritmo de unión mínima ponderada

Las conexiones mínimas ponderadas (Weighted Least Connections) son una variante del algoritmo de mínimas conexiones, que tiene en cuenta que las capacidades de procesamiento de los servidores backend pueden ser diferentes.

En el algoritmo de unión mínima ponderada, a cada servidor se le asigna un peso que refleja las capacidades de procesamiento del servidor. A los servidores con pesos más altos se les asignarán más solicitudes.

Específicamente, el balanceador de carga mantiene una lista de servidores, cada uno con un peso y una cantidad de conexiones activas. Cuando llega una nueva solicitud, el equilibrador de carga asignará la solicitud al servidor con la proporción más pequeña entre el número actual de conexiones activas y el peso.

Por ejemplo, si el peso del servidor A es 3 y el número de conexiones activas es 6, y el peso del servidor B es 2 y el número de conexiones activas es 3, entonces la nueva solicitud se asignará al servidor B porque la proporción del número de conexiones activas al peso del servidor B (3/2=1,5) es menor que la relación del número de conexiones activas al peso del servidor A (6/3=2).

Implementación simple de pseudocódigo:

// 定义一个类 WeightedLeastConnectionsLoadBalancer
public class WeightedLeastConnectionsLoadBalancer {
    
    
    // 定义一个服务器列表 servers,每个服务器有一个权重和当前连接数
    private Map<String, Server> servers;

    // 定义一个构造函数,接收一个服务器列表和对应的权重作为参数
    public WeightedLeastConnectionsLoadBalancer(Map<String, Server> servers) {
    
    
        this.servers = servers;
    }

    // 定义一个方法 getNextServer,返回下一个服务器
    public synchronized String getNextServer() {
    
    
        // 初始化最小权重比率为正无穷大,最小服务器为 null
        double minRatio = Double.POSITIVE_INFINITY;
        String minServer = null;
        // 遍历服务器列表
        for (Map.Entry<String, Server> entry : servers.entrySet()) {
    
    
            // 计算当前服务器的权重比率(当前连接数 / 权重)
            double ratio = (double) entry.getValue().getConnections() / entry.getValue().getWeight();
            // 如果当前服务器的权重比率小于最小权重比率,更新最小权重比率和最小服务器
            if (ratio < minRatio) {
    
    
                minRatio = ratio;
                minServer = entry.getKey();
            }
        }
        // 返回最小服务器
        return minServer;
    }
}

// 定义一个类 Server,表示一个服务器
public class Server {
    
    
    private int weight;
    private int connections;

    // 定义一个方法 getWeight,返回服务器的权重
    public int getWeight() {
    
    
        return weight;
    }

    // 定义一个方法 getConnections,返回服务器的当前连接数
    public int getConnections() {
    
    
        return connections;
    }
}

En este pseudocódigo, getNextServercada vez que se llama al método, recorrerá la lista de servidores, encontrará el servidor con la proporción más pequeña entre el número actual de conexiones y el peso y lo devolverá. Tenga en cuenta el uso de la palabra clave aquí synchronizedpara garantizar la seguridad del hilo.

La ventaja del algoritmo de conexión mínima ponderada es que puede manejar mejor el rendimiento desigual del servidor. Al ajustar el peso del servidor, la carga se puede equilibrar más. Sin embargo, esto requiere una comprensión precisa del rendimiento del servidor y puede requerir un ajuste manual de los pesos cuando cambia el rendimiento del servidor.

3.5 Algoritmo hash de dirección de origen

Source IP Hash es un algoritmo de equilibrio de carga de uso común. En este algoritmo, el equilibrador de carga realiza un cálculo hash basado en la dirección IP de origen de la solicitud y luego distribuye la solicitud a los servidores backend según el valor hash.

Específicamente, el equilibrador de carga mantiene una lista de servidores. Cuando llega una nueva solicitud, el balanceador de carga buscará la dirección IP de origen de la solicitud y luego realizará un cálculo hash en la dirección IP de origen. El valor hash calculado se utiliza para seleccionar un servidor. Por ejemplo, el valor hash se puede tomar en módulo el número de servidores y el resultado es el índice del servidor que debe manejar la solicitud.

La ventaja del algoritmo hash de la dirección de origen es que garantiza que las solicitudes de la misma dirección IP de origen siempre se asignen al mismo servidor. Esto es útil para aplicaciones que necesitan mantener el estado de la sesión, ya que se pueden asignar solicitudes consecutivas del mismo usuario al mismo servidor, compartiendo así el estado de la sesión.

La desventaja del algoritmo hash de la dirección de origen es que si el volumen de solicitudes de una determinada dirección IP de origen es particularmente grande, puede provocar que la carga de un determinado servidor sea demasiado alta. Además, si la cantidad de servidores cambia, como agregar o restar servidores, todos los valores hash cambiarán, lo que puede provocar que una gran cantidad de solicitudes se reasigne a otros servidores, interrumpiendo así el estado de la sesión original.

3.6 Algoritmo hash de URL

URL Hash es un algoritmo de equilibrio de carga de uso común. En este algoritmo, el equilibrador de carga realiza un cálculo hash basado en la URL solicitada y luego distribuye la solicitud a los servidores backend según el valor hash.

Específicamente, el equilibrador de carga mantiene una lista de servidores. Cuando llega una nueva solicitud, el equilibrador de carga buscará la URL solicitada y luego aplicará un hash a la URL. El valor hash calculado se utiliza para seleccionar un servidor. Por ejemplo, el valor hash se puede tomar en módulo el número de servidores y el resultado es el índice del servidor que debe manejar la solicitud.

Implementación simple de pseudocódigo:

// 定义一个类 URLHashLoadBalancer
public class URLHashLoadBalancer {
    
    
    // 定义一个服务器列表 servers
    private List<String> servers;

    // 定义一个构造函数,接收一个服务器列表作为参数
    public URLHashLoadBalancer(List<String> servers) {
    
    
        this.servers = servers;
    }

    // 定义一个方法 getServer,接收一个 URL 作为参数,返回对应的服务器
    public String getServer(String url) {
    
    
        // 使用 Java 的 hashCode 方法获取 URL 的哈希值
        int hashcode = url.hashCode();
        // 使用哈希值对服务器列表的长度取模,得到服务器的索引
        int index = hashcode % servers.size();
        // 返回对应的服务器
        return servers.get(index);
    }
}

En este pseudocódigo, getServerel método calcula un valor hash según la URL de entrada y luego selecciona un servidor según el valor hash. Esto garantiza que la misma URL siempre se enrute al mismo servidor, logrando así la persistencia de la sesión. Tenga en cuenta que aquí se utiliza el método Java hashCodepara calcular los valores hash. En aplicaciones reales, es posible que sea necesario utilizar funciones hash más complejas para garantizar una distribución uniforme de los valores hash.

La ventaja del algoritmo hash de URL es que puede garantizar que las solicitudes de la misma URL siempre se asignen al mismo servidor. Esto es útil para aplicaciones que requieren almacenamiento en caché, ya que se pueden asignar solicitudes consecutivas para la misma URL al mismo servidor, lo que permite compartir el caché.

La desventaja del algoritmo hash de URL es que si el volumen de solicitudes de una determinada URL es particularmente grande, la carga de un determinado servidor puede ser demasiado alta. Además, si cambia la cantidad de servidores, como agregar o restar servidores, todos los valores hash cambiarán, lo que puede provocar que una gran cantidad de solicitudes se reasigne a otros servidores, interrumpiendo así el caché original.

3.7 Algoritmo de tiempo de respuesta más corto

El tiempo de respuesta más corto (tiempo de respuesta más corto) es un algoritmo de equilibrio de carga de uso común. En este algoritmo, las nuevas solicitudes se asignan al servidor con el tiempo de respuesta actual más corto.

Específicamente, el equilibrador de carga mantiene una lista de servidores y monitorea el tiempo de respuesta de cada servidor en tiempo real. Cuando llega una nueva solicitud, el equilibrador de carga asignará la solicitud al servidor con el tiempo de respuesta actual más corto.

Implementación simple de pseudocódigo:

// 定义一个类 ShortestResponseLoadBalancer
public class ShortestResponseLoadBalancer {
    
    
    // 定义一个服务器列表 servers,每个服务器有一个响应时间
    private Map<String, Integer> servers;

    // 定义一个构造函数,接收一个服务器列表作为参数
    public ShortestResponseLoadBalancer(Map<String, Integer> servers) {
    
    
        this.servers = servers;
    }

    // 定义一个方法 getServer,返回响应时间最短的服务器
    public synchronized String getServer() {
    
    
        // 初始化最短响应时间为正无穷大,最短响应时间的服务器为 null
        int minResponseTime = Integer.MAX_VALUE;
        String minResponseServer = null;
        // 遍历服务器列表
        for (Map.Entry<String, Integer> entry : servers.entrySet()) {
    
    
            // 如果当前服务器的响应时间小于最短响应时间,更新最短响应时间和最短响应时间的服务器
            if (entry.getValue() < minResponseTime) {
    
    
                minResponseTime = entry.getValue();
                minResponseServer = entry.getKey();
            }
        }
        // 返回最短响应时间的服务器
        return minResponseServer;
    }
}

En este pseudocódigo, getServercada vez que se llama al método, recorrerá la lista de servidores, encontrará el servidor con el tiempo de respuesta más corto y lo devolverá. Tenga en cuenta el uso de la palabra clave aquí synchronizedpara garantizar la seguridad del hilo. En aplicaciones prácticas, el tiempo de respuesta del servidor generalmente cambia dinámicamente y es posible que deba actualizarse periódicamente o calcularse en tiempo real.

La ventaja del algoritmo de tiempo de respuesta mínimo es que puede realizar dinámicamente el equilibrio de carga en función del rendimiento real del servidor. Esto es muy efectivo para solicitudes que tienen diferentes tiempos de procesamiento, porque las solicitudes más largas aumentarán el tiempo de respuesta del servidor, reduciendo así la posibilidad de que al servidor se le asigne una nueva solicitud.

La desventaja del algoritmo de tiempo de respuesta mínimo es que requiere monitoreo en tiempo real del tiempo de respuesta de cada servidor, lo que puede aumentar la complejidad y la sobrecarga del balanceador de carga. Además, si el rendimiento del servidor es desigual, es posible que el algoritmo de tiempo de respuesta mínimo no logre un buen efecto de equilibrio de carga.

3.8 Selección del algoritmo de equilibrio de carga.

La elección del algoritmo de equilibrio de carga depende principalmente de los siguientes factores:

  1. Si el rendimiento de los servidores es uniforme: si el rendimiento de los servidores varía mucho, el algoritmo round robin ponderado o el algoritmo de unión mínima ponderada pueden ser más adecuados, porque estos dos algoritmos pueden tener en cuenta las diferencias de rendimiento de los servidores ajustando los pesos. .
  2. Si el tiempo de procesamiento de la solicitud es el mismo: si el tiempo de procesamiento de la solicitud es significativamente diferente, el algoritmo de menor cantidad de conexiones o de tiempo de respuesta más corto puede ser más adecuado, porque estos dos algoritmos pueden equilibrar la carga dinámicamente en función de la carga del servidor.
  3. Si es necesario mantener el estado de la sesión: si es necesario mantener el estado de la sesión, el algoritmo hash de la dirección de origen puede ser más adecuado, porque este algoritmo puede garantizar que las solicitudes de la misma dirección IP de origen siempre se asignen al mismo servidor.
  4. Si se requiere almacenamiento en caché: si se requiere almacenamiento en caché, entonces el algoritmo de hash de URL puede ser más adecuado, porque este algoritmo puede garantizar que las solicitudes para la misma URL siempre se asignen al mismo servidor.
  5. Si la cantidad de servidores cambiará con frecuencia: si la cantidad de servidores cambiará con frecuencia, entonces el algoritmo de operación por turnos o de conexiones mínimas puede ser más adecuado, ya que estos dos algoritmos no dependen de la cantidad de servidores.

En aplicaciones reales, puede ser necesario seleccionar un algoritmo de equilibrio de carga adecuado en función de las necesidades y condiciones ambientales específicas, o utilizar una combinación de múltiples algoritmos de equilibrio de carga.


4. Práctica de aplicación del equilibrio de carga.
4.1 Software de equilibrio de carga

Bien, me aseguraré de que haya un espacio entre los caracteres chinos y el inglés o los números en mi respuesta posterior. Aquí están las respuestas para el hardware de equilibrio de carga:

  1. F5 BIG-IP: F5 BIG-IP es un equilibrador de carga de hardware con una alta cuota de mercado. Proporciona una gran cantidad de funciones, que incluyen aceleración SSL, optimización de TCP, compresión HTTP, firewall, etc. Las ventajas de F5 BIG-IP son un rendimiento potente, funciones integrales y soporte para estrategias complejas de equilibrio de carga. Sin embargo, el F5 BIG-IP tiene un precio más alto.

  2. A10 Networks: A10 Networks ofrece una gama de balanceadores de carga de hardware. Admiten una variedad de algoritmos de equilibrio de carga y proporcionan funciones avanzadas, como aceleración SSL, optimización TCP, compresión HTTP, etc. La ventaja de A10 Networks es su potente rendimiento y su precio relativamente bajo. Sin embargo, A10 Networks tiene una participación de mercado menor y su soporte y servicios pueden no ser tan buenos como los de F5 BIG-IP.

  3. Radware Alteon: Radware Alteon es un equilibrador de carga de hardware que proporciona funciones avanzadas, como aceleración SSL, optimización TCP, compresión HTTP, firewall, etc. La ventaja de Radware Alteon es su potente rendimiento y compatibilidad con estrategias complejas de equilibrio de carga. Sin embargo, el Radware Alteon tiene un precio más alto.

Los anteriores son varios hardware de equilibrio de carga comunes, cada uno con sus propias ventajas y desventajas, y deben seleccionarse de acuerdo con los escenarios y necesidades de aplicación específicos.

4.2 Hardware de equilibrio de carga

El software de equilibrio de carga incluye principalmente los siguientes tipos:

  1. Nginx: Nginx es un servidor web de código abierto y un servidor proxy inverso que también se puede utilizar como equilibrador de carga. Nginx admite una variedad de algoritmos de equilibrio de carga, como round robin, conexiones mínimas, hash de IP, etc. Las ventajas de Nginx son alto rendimiento, configuración simple, soporte para alta concurrencia y adecuado para procesar recursos estáticos y conexiones cortas. Sin embargo, la función de equilibrio de carga de Nginx es relativamente básica y no admite algunas funciones avanzadas, como persistencia de sesión, verificación de estado, etc.

imagen-20230920191836106

  1. HAProxy: HAProxy es un equilibrador de carga de código abierto, que se utiliza principalmente para proporcionar alta disponibilidad, equilibrio de carga y servicios de proxy. HAProxy admite una variedad de algoritmos de equilibrio de carga, como sondeo, conexiones mínimas, hash de direcciones de origen, etc. La ventaja de HAProxy es que es potente y admite funciones avanzadas como persistencia de sesión, verificación de estado, terminación SSL, etc. Sin embargo, la configuración de HAProxy es relativamente compleja y su rendimiento es ligeramente inferior al de Nginx.
  2. LVS: LVS (Linux Virtual Server) es un equilibrador de carga basado en el kernel de Linux, que se utiliza principalmente para proporcionar servicios de equilibrio de carga y alta disponibilidad. LVS admite una variedad de algoritmos de equilibrio de carga, como sondeo, conexiones mínimas, hash de direcciones de origen, etc. La ventaja de LVS es que tiene un rendimiento extremadamente alto, admite una gran cantidad de conexiones simultáneas y es adecuado para manejar conexiones largas y mucho tráfico. Sin embargo, la configuración de LVS es relativamente compleja y requiere cierta comprensión del kernel de Linux.
  3. Traefik: Traefik es un moderno equilibrador de carga y proxy inverso HTTP, utilizado principalmente en arquitectura de microservicios. Traefik admite una variedad de algoritmos de equilibrio de carga, como sondeo, conexiones mínimas, hash de direcciones de origen, etc. La ventaja de Traefik es que admite la configuración dinámica y está bien integrado con plataformas de contenedores como Docker y Kubernetes. Sin embargo, el rendimiento de Traefik es ligeramente inferior al de Nginx y HAProxy.

Los anteriores son varios programas de equilibrio de carga comunes, cada uno con sus propias ventajas y desventajas, y deben seleccionarse de acuerdo con los escenarios y necesidades de aplicación específicos.

Características ventaja defecto
nginx Los servidores web de código abierto y los servidores proxy inversos también se pueden utilizar como equilibradores de carga. Admite múltiples algoritmos de equilibrio de carga, como sondeo, mínimo de conexiones, hash de IP, etc. Tiene alto rendimiento, configuración simple, admite alta concurrencia y es adecuado para procesar recursos estáticos y conexiones cortas. La función de equilibrio de carga es relativamente básica y no admite algunas funciones avanzadas, como persistencia de sesión, verificación de estado, etc.
HAProxy Un equilibrador de carga de código abierto, utilizado principalmente para proporcionar alta disponibilidad, equilibrio de carga y servicios de proxy. Admite múltiples algoritmos de equilibrio de carga, como sondeo, mínimo de conexiones, hash de dirección de origen, etc. Potente y admite funciones avanzadas como persistencia de sesión, controles de estado, terminación SSL, etc. La configuración es relativamente compleja y el rendimiento es ligeramente inferior al de Nginx.
LVS Un equilibrador de carga basado en el kernel de Linux, utilizado principalmente para proporcionar servicios de equilibrio de carga y alta disponibilidad. Admite múltiples algoritmos de equilibrio de carga, como sondeo, mínimo de conexiones, hash de dirección de origen, etc. Tiene un rendimiento extremadamente alto, admite una gran cantidad de conexiones simultáneas y es adecuado para manejar conexiones largas y mucho tráfico. La configuración es relativamente compleja y requiere cierto conocimiento del kernel de Linux.
Tráfico Proxy inverso HTTP moderno y equilibrador de carga, utilizado principalmente en arquitectura de microservicios. Admite múltiples algoritmos de equilibrio de carga, como sondeo, mínimo de conexiones, hash de dirección de origen, etc. Admite configuración dinámica y está bien integrado con plataformas de contenedores como Docker y Kubernetes. El rendimiento es ligeramente inferior al de Nginx y HAProxy.
4.3 Implementación del equilibrio de carga por empresas de Internet reconocidas

Muchas empresas de Internet conocidas utilizaron tecnologías de equilibrio de carga de código abierto como Nginx, HAProxy, LVS y Traefik en sus primeras arquitecturas. Estas tecnologías son maduras, estables y tienen comunidades activas, y pueden satisfacer la mayoría de las necesidades de equilibrio de carga.

Sin embargo, con la expansión de la escala empresarial y la evolución de la arquitectura técnica, estas empresas a menudo encuentran algunas necesidades especiales, como la necesidad de manejar tráfico de red a gran escala o la necesidad de soportar estrategias complejas de equilibrio de carga. pueden optar por hacerlo ellos mismos, investigar la tecnología de equilibrio de carga o personalizarla y optimizarla en función de la tecnología de código abierto existente.

La implementación de la tecnología de equilibrio de carga por parte de cada empresa de Internet conocida tiene sus propias características, a continuación se muestran algunos ejemplos:

  1. Google: Google utiliza su propio Google Cloud Load Balancing, que es un servicio de equilibrio de carga distribuido y automatizado que puede manejar grandes cantidades de tráfico y distribuirlo a aplicaciones y servicios en Google Cloud. Además, Google ha desarrollado un equilibrador de carga de software llamado Maglev para manejar el tráfico de red en sus centros de datos.

imagen-20230920191031299

  1. Facebook: Facebook utiliza su propio Katran, un equilibrador de carga basado en Linux diseñado para manejar servicios de red a gran escala. Katran utiliza la tecnología eBPF de Linux para modificar dinámicamente las estrategias de equilibrio de carga sin interrumpir los servicios.
  2. Alibaba: Alibaba utiliza el Server Load Balancer de desarrollo propio, que es un servicio de equilibrio de carga distribuido, de alto rendimiento y alta disponibilidad que puede distribuir el tráfico a múltiples servidores back-end. Además, Alibaba también ha abierto un middleware de transacciones distribuidas llamado Seata para manejar problemas de equilibrio de carga en la arquitectura de microservicios.
  3. Tencent: Tencent utiliza un equilibrador de carga de desarrollo propio, que puede distribuir automáticamente el tráfico a aplicaciones y servicios en Tencent Cloud. Además, Tencent también ha abierto un marco RPC de alto rendimiento llamado Tars, que incluye funciones de equilibrio de carga.
  4. Baidu: Baidu utiliza un equilibrador de carga de desarrollo propio que puede distribuir automáticamente el tráfico a aplicaciones y servicios en Baidu Cloud. Además, Baidu también abrió un marco RPC de alto rendimiento llamado BRPC, que incluye funciones de equilibrio de carga.
4.4 Tendencia de desarrollo del equilibrio de carga.

Las tendencias de desarrollo del equilibrio de carga incluyen principalmente las siguientes direcciones:

  1. Nativo de la nube y microservicios: con la popularidad de la computación en la nube y la arquitectura de microservicios, la tecnología de equilibrio de carga también se está transformando hacia la nube nativa. Por ejemplo, las plataformas de orquestación de contenedores como Kubernetes tienen capacidades integradas de descubrimiento de servicios y equilibrio de carga. Además, también están diseñados nuevos equilibradores de carga como Envoy, Linkerd, Istio, etc. para microservicios y entornos nativos de la nube.
  2. Inteligencia y automatización: con el desarrollo de la inteligencia artificial y la tecnología de aprendizaje automático, el equilibrio de carga también se está volviendo más inteligente. Por ejemplo, al analizar los datos de tráfico y rendimiento del servidor en tiempo real, las estrategias de equilibrio de carga se pueden ajustar dinámicamente para optimizar el rendimiento del sistema y la utilización de recursos.
  3. Seguridad: a medida que los ataques a la red se vuelven cada vez más desenfrenados, los balanceadores de carga también deben tener capacidades de protección de seguridad más sólidas, como la prevención de ataques DDoS, inyección SQL, etc. Algunos balanceadores de carga han comenzado a integrar funciones de seguridad como los firewalls de aplicaciones web (WAF).
  4. Nube híbrida y de múltiples nubes: con la popularidad de los entornos de nube híbrida y de múltiples nubes, los balanceadores de carga deben poder proporcionar servicios de equilibrio de carga unificados en diferentes plataformas de nube y centros de datos.
  5. Rendimiento y escalabilidad: a medida que el tráfico de Internet continúa creciendo, los balanceadores de carga deben tener mayor rendimiento y escalabilidad para manejar el tráfico de red a gran escala.

Supongo que te gusta

Origin blog.csdn.net/weixin_45187434/article/details/133097139
Recomendado
Clasificación