Panorama da tecnologia de balanceamento de carga: teoria, prática e estudos de caso

Na era atual da Internet, com o aumento do número de usuários e a expansão da escala dos negócios, um único servidor não consegue mais atender às necessidades de alta simultaneidade e grande tráfego. Para resolver esse problema, surgiu a tecnologia de balanceamento de carga. O balanceamento de carga pode distribuir um grande número de solicitações de rede para processamento em vários servidores, melhorando assim as capacidades de processamento do sistema e garantindo alta disponibilidade de serviços. O núcleo do balanceamento de carga é o algoritmo de balanceamento de carga, que determina como distribuir solicitações para vários servidores. Este artigo apresentará detalhadamente o princípio do algoritmo de balanceamento de carga e explorará sua aplicação na prática com base em cenários reais de aplicação.



1. Introdução ao balanceamento de carga
1.1. Desafios de desenvolvimento de grandes websites

Nos primórdios da Internet, os grandes sites enfrentavam enormes desafios. À medida que o número de usuários aumenta e a quantidade de dados explode, um único servidor muitas vezes não consegue suportar uma pressão tão grande. Isso leva ao surgimento de gargalos de desempenho, tempos de resposta mais longos do servidor e degradação da experiência do usuário. Ao mesmo tempo, a escalabilidade de um único servidor também é limitada.À medida que o negócio se desenvolve, o tráfego pode aumentar drasticamente e é difícil para um único servidor atender à demanda adicionando recursos de hardware. O que é mais sério é que todas as solicitações são enviadas para o mesmo servidor e, quando esse servidor falhar, todo o serviço será interrompido.

Para solucionar esses problemas, os sites começaram a tentar adotar a expansão vertical e a expansão horizontal.

A expansão vertical melhora os recursos de processamento, aumentando o desempenho do hardware do servidor, mas esse método apresenta gargalos de desempenho e custos elevados.

A expansão horizontal aumenta as capacidades de processamento do sistema, aumentando o número de servidores e distribuindo a carga para vários servidores. No entanto, como distribuir efetivamente as solicitações dos usuários para diferentes servidores, de modo que a carga de cada servidor seja mantida dentro de uma faixa razoável, tornou-se um novo problema.

Isso nos leva ao tópico que queremos discutir hoje: balanceamento de carga.

1.2. O que é balanceamento de carga?

Wikipedia: Balanceamento de carga (inglês: balanceamento de carga) é uma tecnologia de computador usada para distribuir carga entre vários computadores (clusters de computadores), conexões de rede, CPUs, unidades de disco ou outros recursos para otimizar o uso de recursos e maximizar o rendimento, minimizando o tempo de resposta e evitando sobrecarga. Usar vários componentes de servidor com balanceamento de carga em vez de um único componente pode melhorar a confiabilidade por meio de redundância. Os serviços de balanceamento de carga geralmente são executados por software e hardware especializados. Sua principal função é alocar razoavelmente um grande número de tarefas para execução em múltiplas unidades operacionais e é usada para resolver problemas de alta simultaneidade e alta disponibilidade na arquitetura da Internet.

Enciclopédia Baidu: O balanceamento de carga é baseado na estrutura de rede existente e fornece um método barato, eficaz e transparente para expandir a largura de banda de dispositivos e servidores de rede, aumentar o rendimento, aprimorar as capacidades de processamento de dados da rede e melhorar a flexibilidade e disponibilidade da rede.

O balanceamento de carga é uma tecnologia de computador usada para distribuir a carga de trabalho entre vários computadores (como um cluster de computadores), conexões de rede, CPUs, discos rígidos ou outros recursos. Seu principal objetivo é otimizar o uso de recursos, maximizar o rendimento, minimizar o tempo de resposta e evitar a sobrecarga de qualquer recurso.

Em aplicações práticas, o balanceamento de carga geralmente utiliza vários componentes de servidor em vez de um único componente para melhorar a confiabilidade e a redundância do sistema. Esses componentes de servidor podem ser servidores físicos ou máquinas virtuais. Os serviços de balanceamento de carga geralmente são executados por software e hardware dedicados (como balanceadores de carga).

Na arquitetura da Internet, o balanceamento de carga é usado principalmente para resolver problemas de alta simultaneidade e alta disponibilidade. Por exemplo, quando o número de visitas a um site aumenta repentinamente, o balanceamento de carga pode distribuir essas solicitações de acesso a vários servidores para garantir o funcionamento normal do site.

imagem-20230922184707769

Quando um usuário solicita um serviço remoto, a solicitação é enviada primeiro ao servidor DNS. O servidor DNS resolverá o nome de domínio para o endereço IP correspondente e a solicitação será enviada para esse endereço IP, que geralmente é um gateway ou balanceador de carga. O balanceador de carga roteia solicitações para um servidor no backend com base em algum algoritmo (como round robin, mínimo de conexões, etc.). Desta forma, as solicitações dos usuários podem ser distribuídas de forma eficaz para diferentes servidores, conseguindo assim o equilíbrio de carga e melhorando o desempenho e a disponibilidade do sistema.

1.2. Por que o balanceamento de carga é necessário

O balanceamento de carga desempenha um papel importante nos sistemas de computador modernos. Suas principais funções incluem:

  1. Melhore o desempenho e o rendimento: O balanceamento de carga pode distribuir solicitações para vários servidores back-end, tornando a carga tratada por cada servidor mais equilibrada. Isso pode melhorar o desempenho geral e o rendimento do sistema, reduzir o tempo de espera do usuário e melhorar a experiência do usuário;
  2. Aumente a disponibilidade do sistema: por exemplo, ao distribuir a carga por vários servidores, mesmo se um servidor falhar, outros servidores ainda poderão continuar a processar solicitações, melhorando assim a disponibilidade e a confiabilidade do sistema. O balanceador de carga pode detectar falhas automaticamente e encaminhar solicitações aos servidores disponíveis, reduzindo o risco de interrupção do serviço;
  3. Obtenha escalabilidade do sistema: O balanceador de carga pode adicionar ou excluir dinamicamente servidores back-end com base nas condições reais de carga para obter expansão elástica do sistema. Quando a carga aumenta, mais servidores podem ser adicionados para compartilhar a carga, quando a carga diminui, o número de servidores pode ser reduzido para economizar recursos;
  4. Resolva os problemas de alta simultaneidade e alta disponibilidade: Na arquitetura da Internet, o balanceamento de carga pode resolver efetivamente os problemas de alta simultaneidade e alta disponibilidade. Ao distribuir solicitações para vários servidores, você pode equilibrar a carga e evitar sobrecarregar um único servidor, proporcionando assim uma melhor experiência ao usuário;
  5. Melhorar a utilização de recursos: O balanceamento de carga pode distribuir solicitações para o servidor mais adequado com base nos indicadores de desempenho e nas condições de carga do servidor. Isso pode fazer melhor uso dos recursos do servidor e melhorar a utilização dos recursos.

Resumindo, o balanceamento de carga desempenha um papel importante na melhoria do desempenho, disponibilidade, confiabilidade e utilização de recursos, e é uma das principais tecnologias para a construção de sistemas computacionais eficientes e confiáveis.

1.4. Princípio de funcionamento do balanceamento de carga

O princípio de funcionamento do balanceamento de carga pode ser resumido brevemente nas seguintes etapas:

  1. Recebimento de solicitação: quando um usuário faz uma solicitação, a solicitação é enviada primeiro ao balanceador de carga.
  2. Distribuição de solicitação: o balanceador de carga distribuirá a solicitação para um servidor no back-end com base em um determinado algoritmo de balanceamento de carga, como round robin, menor conexão, hash de endereço de origem, etc. Durante esse processo, o balanceador de carga levará em consideração a carga atual dos servidores back-end para garantir que a carga de todos os servidores permaneça dentro de um intervalo razoável.
  3. Retorno de resposta: após o servidor backend processar a solicitação do usuário, ele retornará a resposta ao balanceador de carga, e o balanceador de carga retornará a resposta ao usuário;
  4. Verificação de integridade: o balanceador de carga realizará regularmente verificações de integridade nos servidores back-end. Se um servidor estiver com defeito, o balanceador de carga removerá o servidor da lista de serviços e não distribuirá mais solicitações a ele. Quando o servidor voltar ao normal, o balanceador de carga irá adicioná-lo à lista de serviços novamente.

Através das etapas acima, o balanceador de carga pode distribuir efetivamente as solicitações do usuário para vários servidores, alcançando assim o equilíbrio de carga e melhorando o desempenho e a disponibilidade do sistema.


2. Classificação do balanceamento de carga

Podemos classificar as muitas tecnologias que suportam balanceamento de carga em múltiplas dimensões.

2.1. Balanceamento de carga DNS

O balanceamento de carga DNS é um método de balanceamento de carga simples e comum, usado principalmente para obter balanceamento de carga em nível geográfico. Através do balanceamento de carga DNS, as solicitações dos usuários podem ser direcionadas ao servidor com localização geográfica mais próxima, reduzindo assim a latência da rede e melhorando a experiência do usuário. Especificamente, o servidor DNS resolverá o mesmo nome de domínio em endereços IP diferentes com base na localização geográfica do usuário.

imagem-20230922182820776

Por exemplo, para o mesmo nome de domínio www.baidu.com, os usuários do norte podem obter o endereço IP da sala de computadores de Pequim, enquanto os usuários do sul podem obter o endereço IP da sala de computadores de Xangai. Dessa forma, as solicitações dos usuários podem ser distribuídas de forma eficaz para diferentes servidores para obter balanceamento de carga.

O balanceamento de carga DNS pode alcançar o balanceamento de carga global. Porque o servidor DNS pode selecionar o IP do servidor mais adequado e devolvê-lo ao cliente com base na localização geográfica do cliente, condições de rede e outros fatores, conseguindo assim uma distribuição global do tráfego. Por exemplo, os pedidos de utilizadores da Europa podem ser distribuídos para servidores na Europa e os pedidos de utilizadores dos Estados Unidos podem ser distribuídos para servidores nos Estados Unidos.

No entanto, o balanceamento de carga DNS também tem algumas limitações. Por exemplo, os resultados da consulta DNS podem ser armazenados em cache pelo cliente ou por dispositivos de rede intermediários, fazendo com que a política de balanceamento de carga não entre em vigor em tempo real. Além disso, o balanceamento de carga DNS não consegue atingir a persistência da sessão e não pode ajustar-se dinamicamente com base nas condições de carga em tempo real do servidor. Portanto, o balanceamento de carga DNS é geralmente usado em conjunto com outras tecnologias de balanceamento de carga (como balanceamento de carga de quatro camadas, balanceamento de carga de sete camadas) para obter um balanceamento de carga mais eficiente.

2.2. Classificação de acordo com o método de implementação

De acordo com o método de implementação, o balanceamento de carga pode ser dividido principalmente em duas categorias: balanceamento de carga de hardware e balanceamento de carga de software:

  1. Balanceamento de carga de hardware: os balanceadores de carga de hardware são dispositivos físicos especializados. Esses dispositivos são poderosos, poderosos, de alto desempenho e altamente confiáveis. Eles são adequados para lidar com tráfego de rede em grande escala. No entanto, eles não são baratos e geralmente estão disponíveis apenas para pessoas "ricas". Somente as empresas considerarão o uso de tais equipamentos;

  2. Balanceamento de carga de software: Os balanceadores de carga de software são softwares executados em servidores comuns, de baixo custo e com boa escalabilidade. Os balanceadores de carga de software podem ser facilmente ampliados ou reduzidos conforme necessário, tornando-os adequados para computação em nuvem e ambientes virtualizados. Os mais comuns são Nginx e LVS. Nginx é um software de balanceamento de carga de 7 camadas e LVS é um balanceamento de carga de 4 camadas do kernel Linux.

2.3. Classificação de acordo com o nível de trabalho

O balanceamento de carga pode ser dividido principalmente em duas categorias: balanceamento de carga de quatro camadas e balanceamento de carga de sete camadas de acordo com a classificação dos níveis de trabalho:

  1. Balanceamento de carga de quatro camadas: O balanceamento de carga de quatro camadas funciona na camada de transporte do modelo de rede e executa o balanceamento de carga principalmente com base no endereço IP e no número da porta solicitados. O balanceador de carga da Camada 4 não se preocupa com o conteúdo específico da solicitação e simplesmente encaminha a solicitação para um servidor no back-end. Portanto, o balanceamento de carga de quatro camadas tem velocidade de processamento mais rápida, mas menor flexibilidade;
  2. Balanceamento de carga de sete camadas: O balanceamento de carga de sete camadas funciona na camada de aplicativo do modelo de rede e pode realizar balanceamento de carga com base no conteúdo específico da solicitação (como URL, cabeçalho de solicitação, método de solicitação, etc.). O balanceador de carga de sete camadas pode compreender o conteúdo específico da solicitação, para que possa implementar estratégias de balanceamento de carga mais complexas, como balanceamento de carga baseado em URL, balanceamento de carga baseado em sessão, etc. No entanto, devido à necessidade de processar o conteúdo específico da solicitação, a velocidade de processamento do balanceamento de carga de sete camadas é relativamente lenta.

Em aplicativos reais, muitos grandes sites e provedores de serviços em nuvem usam o balanceamento de carga da camada quatro e o balanceamento de carga da camada sete para obter um balanceamento de carga mais eficiente e flexível.

2.4. Classificação conforme escopo de trabalho

O balanceamento de carga pode ser dividido principalmente em duas categorias: balanceamento de carga global e balanceamento de carga local de acordo com o escopo de trabalho:

  1. Balanceamento de carga global: O balanceamento de carga global é usado principalmente para balanceamento de carga entre vários data centers em todo o mundo. Ele pode distribuir de forma inteligente as solicitações do usuário para o data center mais apropriado com base em fatores como as condições de carga de cada data center, as condições da rede e a localização geográfica do cliente. Isto reduz a latência da rede e melhora o desempenho e a disponibilidade do serviço;
  2. Balanceamento de carga parcial: O balanceamento de carga parcial é usado principalmente para balanceamento de carga entre vários servidores em um único data center. Geralmente usa estratégias de balanceamento de carga mais granulares, como polling, menor número de conexões, hash de endereço de origem, etc., para obter uma utilização mais eficiente de recursos e melhor desempenho.
2.5. Classificação de acordo com a parte implementadora

O balanceamento de carga pode ser dividido em balanceamento de carga do lado do servidor e balanceamento de carga do lado do cliente de acordo com a classificação do implementador.Seu escopo de trabalho e objetivos são diferentes:

  1. Balanceamento de carga do lado do servidor: neste método, o balanceador de carga está localizado no lado do servidor e todas as solicitações do cliente são enviadas primeiro ao balanceador de carga. O balanceador de carga distribui solicitações para um servidor no back-end com base em um algoritmo de balanceamento de carga. As vantagens deste método são implementação simples, alta transparência e nenhum processamento especial é necessário por parte do cliente. Porém, todas as solicitações precisam passar pelo balanceador de carga, o que pode se tornar um gargalo de desempenho;
  2. Balanceamento de carga do cliente: nesta abordagem, a lógica de balanceamento de carga é implementada no lado do cliente. O cliente obterá uma lista de todos os serviços disponíveis no centro de registro de serviços e, em seguida, selecionará um serviço a ser solicitado com base no algoritmo de balanceamento de carga. A vantagem desse método é que ele pode evitar que o balanceador de carga do lado do servidor se torne um gargalo de desempenho, mas requer que a lógica de balanceamento de carga seja implementada no cliente, o que aumenta a complexidade do cliente.

3. Algoritmo de balanceamento de carga
3.1. Algoritmo de pesquisa

Round Robin é um algoritmo de balanceamento de carga muito simples. Neste algoritmo, o balanceador de carga distribui as solicitações recebidas aos servidores backend em uma ordem pré-determinada.

Especificamente, o balanceador de carga mantém uma lista de servidores. Quando uma nova solicitação chega, o balanceador de carga atribuirá a solicitação ao próximo servidor da lista e, em seguida, moverá o servidor para o final da lista. Desta forma, cada servidor terá a oportunidade de processar solicitações por sua vez, conseguindo assim o balanceamento de carga.

Por exemplo, suponha que existam três servidores A, B e C. Quando a primeira solicitação chegar, o balanceador de carga irá atribuí-la ao servidor A; quando a segunda solicitação chegar, o balanceador de carga irá atribuí-la ao servidor B; quando a terceira solicitação chegar, o balanceador de carga irá atribuí-la ao servidor C; quando a terceira solicitação chegar, o balanceador de carga irá atribuí-la ao servidor C. chega a quarta solicitação, o balanceador de carga a atribui ao servidor A novamente e assim por diante.

Implementação simples 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;
    }
}

Neste pseudocódigo, getNextServercada vez que o método é chamado, ele retorna o próximo servidor na lista de servidores e atualiza o índice atual. Quando o índice atual exceder o comprimento da lista de servidores, ele será redefinido para 0 para implementar a pesquisa. Observe o uso da palavra-chave aqui synchronizedpara garantir a segurança do thread.

A vantagem do algoritmo de polling é que ele é simples de implementar e pode atingir melhor balanceamento de carga quando o desempenho do servidor é semelhante. No entanto, se o desempenho do servidor for irregular ou o tempo para processar solicitações variar muito, o algoritmo de pesquisa poderá não conseguir obter um bom efeito de equilíbrio de carga.

3.2. Algoritmo de pesquisa ponderada

Weighted Round Robin é uma variante do algoritmo de votação que leva em consideração que as capacidades de processamento dos servidores backend podem ser diferentes.

No algoritmo de pesquisa ponderada, é atribuído a cada servidor um peso que reflete as capacidades de processamento do servidor. Servidores com pesos maiores receberão mais solicitações.

Especificamente, o balanceador de carga mantém uma lista de servidores, cada um com um peso. Quando chega uma nova solicitação, o balanceador de carga distribui a solicitação de acordo com o peso do servidor. Por exemplo, se o peso do servidor A for 3 e o peso do servidor B for 2, então, de 5 solicitações, o servidor A tratará 3 solicitações e o servidor B tratará 2 solicitações.

Implementação simples 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;
    }
}

Neste pseudocódigo, getNextServertoda vez que o método for chamado, ele retornará ao próximo servidor com base no peso do servidor e atualizará o índice e o peso atuais. Quando todos os pesos dos servidores são esgotados, o peso máximo é recalculado, implementando assim a votação ponderada. Observe o uso da palavra-chave aqui synchronizedpara garantir a segurança do thread.

A vantagem do algoritmo de pesquisa ponderada é que ele pode lidar melhor com o desempenho irregular do servidor. Ao ajustar o peso do servidor, a carga pode se tornar mais equilibrada. No entanto, isso requer uma compreensão precisa do desempenho do servidor e pode exigir o ajuste manual dos pesos quando o desempenho do servidor muda.

3.3. Algoritmo Menos Conectado

Menos conexões é um algoritmo de balanceamento de carga comumente usado. Neste algoritmo, novas solicitações são atribuídas ao servidor com menos conexões ativas.

Especificamente, o balanceador de carga mantém uma lista de servidores e monitora o número de conexões ativas de cada servidor em tempo real. Quando uma nova solicitação chega, o balanceador de carga atribuirá a solicitação ao servidor com o menor número de conexões ativas.

A vantagem do algoritmo menos conectado é que ele pode realizar balanceamento de carga dinamicamente com base na carga real do servidor. Isso funciona bem para solicitações que levam tempos variados para serem processadas, pois as solicitações que demoram mais para serem processadas ocupam mais conexões, reduzindo a chance de novas solicitações serem atribuídas ao servidor.

A desvantagem do algoritmo de menor número de conexões é que ele requer monitoramento em tempo real do número de conexões ativas por servidor, o que pode aumentar a complexidade e a sobrecarga do balanceador de carga. Além disso, se o desempenho do servidor for irregular, o algoritmo de menor conexão pode não atingir um bom efeito de balanceamento de carga.

3.4. Algoritmo de junção mínima ponderada

Mínimas Conexões Ponderadas (Weighted Least Connections) é uma variante do algoritmo de menor número de conexões, que leva em consideração que as capacidades de processamento dos servidores back-end podem ser diferentes.

No algoritmo de junção mínima ponderada, é atribuído a cada servidor um peso que reflete as capacidades de processamento do servidor. Servidores com pesos maiores receberão mais solicitações.

Especificamente, o balanceador de carga mantém uma lista de servidores, cada um com um peso e um número de conexões ativas. Quando uma nova solicitação chegar, o balanceador de carga atribuirá a solicitação ao servidor com a menor proporção entre o número atual de conexões ativas e o peso.

Por exemplo, se o peso do servidor A for 3 e o número de conexões ativas for 6, e o peso do servidor B for 2 e o número de conexões ativas for 3, então a nova solicitação será atribuída ao servidor B porque a proporção do número de conexões ativas em relação ao peso do servidor B (3/2=1,5) é menor que a razão entre o número de conexões ativas em relação ao peso do servidor A (6/3=2).

Implementação simples 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;
    }
}

Neste pseudocódigo, getNextServertoda vez que o método for chamado, ele percorrerá a lista de servidores, encontrará o servidor com a menor proporção entre o número atual de conexões e o peso e o retornará. Observe o uso da palavra-chave aqui synchronizedpara garantir a segurança do thread.

A vantagem do algoritmo de conexão mínima ponderada é que ele pode lidar melhor com o desempenho irregular do servidor. Ao ajustar o peso do servidor, a carga pode se tornar mais equilibrada. No entanto, isso requer uma compreensão precisa do desempenho do servidor e pode exigir o ajuste manual dos pesos quando o desempenho do servidor muda.

3.5. Algoritmo hash de endereço de origem

Source IP Hash é um algoritmo de balanceamento de carga comumente usado. Neste algoritmo, o balanceador de carga realiza um cálculo de hash com base no endereço IP de origem da solicitação e, em seguida, distribui a solicitação aos servidores back-end com base no valor de hash.

Especificamente, o balanceador de carga mantém uma lista de servidores. Quando uma nova solicitação chega, o balanceador de carga buscará o endereço IP de origem da solicitação e, em seguida, executará um cálculo de hash no endereço IP de origem. O valor hash calculado é usado para selecionar um servidor. Por exemplo, o valor hash pode ser obtido módulo o número de servidores e o resultado é o índice do servidor que deve tratar a solicitação.

A vantagem do algoritmo hash do endereço de origem é que ele garante que as solicitações do mesmo endereço IP de origem sejam sempre atribuídas ao mesmo servidor. Isto é útil para aplicações que precisam manter o estado da sessão, uma vez que solicitações consecutivas do mesmo usuário podem ser atribuídas ao mesmo servidor, compartilhando assim o estado da sessão.

A desvantagem do algoritmo hash do endereço de origem é que, se o volume de solicitações de um determinado endereço IP de origem for particularmente grande, poderá fazer com que a carga de um determinado servidor seja muito alta. Além disso, se o número de servidores mudar, como adicionar ou subtrair servidores, todos os valores de hash serão alterados, o que pode fazer com que um grande número de solicitações sejam realocadas para outros servidores, interrompendo assim o estado original da sessão.

3.6. Algoritmo de hash de URL

URL Hash é um algoritmo de balanceamento de carga comumente usado. Neste algoritmo, o balanceador de carga realiza um cálculo de hash com base na URL solicitada e, em seguida, distribui a solicitação aos servidores back-end com base no valor de hash.

Especificamente, o balanceador de carga mantém uma lista de servidores. Quando uma nova solicitação chega, o balanceador de carga buscará o URL solicitado e, em seguida, fará o hash do URL. O valor hash calculado é usado para selecionar um servidor. Por exemplo, o valor hash pode ser obtido módulo o número de servidores e o resultado é o índice do servidor que deve tratar a solicitação.

Implementação simples 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);
    }
}

Neste pseudocódigo, getServero método calcula um valor hash com base no URL de entrada e, em seguida, seleciona um servidor com base no valor hash. Isso garante que a mesma URL seja sempre roteada para o mesmo servidor, alcançando assim a persistência da sessão. Observe que o método Java é usado aqui hashCodepara calcular valores de hash. Em aplicações reais, pode ser necessário usar funções de hash mais complexas para garantir uma distribuição uniforme de valores de hash.

A vantagem do algoritmo de hashing de URL é que ele pode garantir que as solicitações para o mesmo URL sejam sempre atribuídas ao mesmo servidor. Isto é útil para aplicações que necessitam de cache, uma vez que solicitações consecutivas para a mesma URL podem ser atribuídas ao mesmo servidor, permitindo que o cache seja compartilhado.

A desvantagem do algoritmo de hash de URL é que, se o volume de solicitações de um determinado URL for particularmente grande, poderá fazer com que a carga de um determinado servidor seja muito alta. Além disso, se o número de servidores mudar, como adicionar ou subtrair servidores, todos os valores de hash serão alterados, o que pode fazer com que um grande número de solicitações sejam realocadas para outros servidores, interrompendo assim o cache original.

3.7. Algoritmo de menor tempo de resposta

O menor tempo de resposta (Shortest Response Time) é um algoritmo de balanceamento de carga comumente usado. Neste algoritmo, novas solicitações são atribuídas ao servidor com o menor tempo de resposta atual.

Especificamente, o balanceador de carga mantém uma lista de servidores e monitora o tempo de resposta de cada servidor em tempo real. Quando uma nova solicitação chegar, o balanceador de carga atribuirá a solicitação ao servidor com o menor tempo de resposta atual.

Implementação simples 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;
    }
}

Neste pseudocódigo, getServertoda vez que o método for chamado, ele percorrerá a lista de servidores, encontrará o servidor com menor tempo de resposta e o retornará. Observe o uso da synchronizedpalavra-chave aqui para garantir a segurança do thread. Em aplicações práticas, o tempo de resposta do servidor geralmente muda dinamicamente e pode precisar ser atualizado regularmente ou calculado em tempo real.

A vantagem do algoritmo de tempo de resposta mínimo é que ele pode realizar balanceamento de carga dinamicamente com base no desempenho real do servidor. Isto é muito eficaz para solicitações que possuem tempos de processamento variados, porque solicitações mais longas aumentarão o tempo de resposta do servidor, reduzindo assim a chance de que uma nova solicitação seja atribuída ao servidor.

A desvantagem do algoritmo de tempo de resposta mínimo é que ele requer monitoramento em tempo real do tempo de resposta de cada servidor, o que pode aumentar a complexidade e a sobrecarga do balanceador de carga. Além disso, se o desempenho do servidor for irregular, o algoritmo de tempo de resposta mínimo pode não atingir um bom efeito de balanceamento de carga.

3.8. Seleção do algoritmo de balanceamento de carga

A escolha do algoritmo de balanceamento de carga depende principalmente dos seguintes fatores:

  1. Se o desempenho dos servidores é uniforme: Se o desempenho dos servidores variar muito, o algoritmo round robin ponderado ou a junção mínima ponderada pode ser mais adequado, porque esses dois algoritmos podem levar em consideração as diferenças de desempenho dos servidores ajustando os pesos .
  2. Se o tempo de processamento da solicitação é o mesmo: Se o tempo de processamento da solicitação for significativamente diferente, o algoritmo com menos conexões ou o menor tempo de resposta pode ser mais adequado, porque esses dois algoritmos podem balancear a carga dinamicamente com base na carga do servidor.
  3. Se o estado da sessão precisa ser mantido: Se o estado da sessão precisar ser mantido, o algoritmo hash do endereço de origem pode ser mais adequado, porque esse algoritmo pode garantir que as solicitações do mesmo endereço IP de origem sejam sempre atribuídas ao mesmo servidor.
  4. Se o cache é necessário: Se o cache for necessário, o algoritmo de hash de URL pode ser mais adequado, porque esse algoritmo pode garantir que as solicitações para o mesmo URL sejam sempre distribuídas para o mesmo servidor.
  5. Se o número de servidores mudará com frequência: Se o número de servidores mudar com frequência, então o algoritmo round robin ou menos conexões pode ser mais adequado, uma vez que esses dois algoritmos não dependem do número de servidores.

Em aplicações reais, pode ser necessário selecionar um algoritmo de balanceamento de carga apropriado com base em necessidades e condições ambientais específicas, ou usar uma combinação de vários algoritmos de balanceamento de carga.


4. Prática de aplicação de balanceamento de carga
4.1. Software de balanceamento de carga

Ok, garantirei que haja 1 espaço entre os caracteres chineses e os ingleses ou números na minha resposta subsequente. Aqui estão as respostas para hardware de balanceamento de carga:

  1. F5 BIG-IP: F5 BIG-IP é um balanceador de carga de hardware com alta participação de mercado. Ele fornece diversos recursos, incluindo aceleração SSL, otimização TCP, compactação HTTP, firewall, etc. As vantagens do F5 BIG-IP são desempenho poderoso, funções abrangentes e suporte para estratégias complexas de balanceamento de carga. No entanto, o F5 BIG-IP vem com um preço mais elevado.

  2. A10 Networks: A10 Networks oferece uma variedade de balanceadores de carga de hardware. Eles suportam uma variedade de algoritmos de balanceamento de carga e fornecem recursos avançados, como aceleração SSL, otimização TCP, compactação HTTP, etc. A vantagem da A10 Networks é seu desempenho poderoso e preço relativamente baixo. No entanto, a A10 Networks tem uma quota de mercado menor e o seu suporte e serviços podem não ser tão bons como o F5 BIG-IP.

  3. Radware Alteon: Radware Alteon é um balanceador de carga de hardware que fornece recursos avançados, como aceleração SSL, otimização TCP, compactação HTTP, firewall, etc. A vantagem do Radware Alteon é seu desempenho poderoso e suporte para estratégias complexas de balanceamento de carga. No entanto, o Radware Alteon vem com um preço mais elevado.

Os itens acima são vários hardwares comuns de balanceamento de carga, cada um com suas próprias vantagens e desvantagens e precisam ser selecionados de acordo com cenários e necessidades específicas de aplicação.

4.2. Hardware de balanceamento de carga

O software de balanceamento de carga inclui principalmente os seguintes tipos:

  1. Nginx: Nginx é um servidor web de código aberto e um servidor proxy reverso que também pode ser usado como balanceador de carga. Nginx oferece suporte a uma variedade de algoritmos de balanceamento de carga, como round robin, mínimo de conexões, hash de IP, etc. As vantagens do Nginx são alto desempenho, configuração simples, suporte para alta simultaneidade e adequado para processamento de recursos estáticos e conexões curtas. No entanto, a função de balanceamento de carga do Nginx é relativamente básica e não oferece suporte a alguns recursos avançados, como persistência de sessão, verificação de integridade, etc.

imagem-20230920191836106

  1. HAProxy: HAProxy é um balanceador de carga de código aberto, usado principalmente para fornecer alta disponibilidade, balanceamento de carga e serviços de proxy. HAProxy suporta uma variedade de algoritmos de balanceamento de carga, como polling, mínimo de conexões, hash de endereço de origem, etc. A vantagem do HAProxy é que ele é poderoso e oferece suporte a recursos avançados, como persistência de sessão, verificação de integridade, terminação SSL, etc. No entanto, a configuração do HAProxy é relativamente complexa e seu desempenho é ligeiramente inferior ao do Nginx.
  2. LVS: LVS (Linux Virtual Server) é um balanceador de carga baseado no kernel Linux, usado principalmente para fornecer serviços de alta disponibilidade e balanceamento de carga. O LVS suporta uma variedade de algoritmos de balanceamento de carga, como polling, mínimo de conexões, hash de endereço de origem, etc. A vantagem do LVS é que ele possui desempenho extremamente alto, suporta um grande número de conexões simultâneas e é adequado para lidar com conexões longas e grande tráfego. Entretanto, a configuração do LVS é relativamente complexa e requer um certo entendimento do kernel Linux.
  3. Traefik: Traefik é um proxy reverso HTTP moderno e balanceador de carga, usado principalmente em arquitetura de microsserviços. Traefik suporta uma variedade de algoritmos de balanceamento de carga, como polling, mínimo de conexões, hash de endereço de origem, etc. A vantagem do Traefik é que ele suporta configuração dinâmica e está bem integrado com plataformas de contêineres como Docker e Kubernetes. No entanto, o desempenho do Traefik é ligeiramente inferior ao do Nginx e do HAProxy.

Os itens acima são vários softwares comuns de balanceamento de carga, cada um com suas próprias vantagens e desvantagens e precisam ser selecionados de acordo com cenários e necessidades específicas de aplicação.

Características vantagem deficiência
Nginx Servidores web de código aberto e servidores proxy reverso também podem ser usados ​​como balanceadores de carga. Suporta vários algoritmos de balanceamento de carga, como polling, mínimo de conexões, hashing de IP, etc. Possui alto desempenho, configuração simples, suporta alta simultaneidade e é adequado para processar recursos estáticos e conexões curtas. A função de balanceamento de carga é relativamente básica e não oferece suporte a alguns recursos avançados, como persistência de sessão, verificação de integridade, etc.
HAProxy Um balanceador de carga de código aberto, usado principalmente para fornecer alta disponibilidade, balanceamento de carga e serviços de proxy. Suporta vários algoritmos de balanceamento de carga, como polling, mínimo de conexões, hash de endereço de origem, etc. Poderoso e oferece suporte a recursos avançados, como persistência de sessão, verificações de integridade, encerramento de SSL, etc. A configuração é relativamente complexa e o desempenho é ligeiramente inferior ao Nginx.
EU CONTRA Um balanceador de carga baseado no kernel Linux, usado principalmente para fornecer serviços de alta disponibilidade e balanceamento de carga. Suporta vários algoritmos de balanceamento de carga, como polling, mínimo de conexões, hash de endereço de origem, etc. Possui desempenho extremamente alto, suporta um grande número de conexões simultâneas e é adequado para lidar com conexões longas e grande tráfego. A configuração é relativamente complexa e requer um certo conhecimento do kernel Linux.
Tráfego Proxy reverso HTTP moderno e balanceador de carga, usado principalmente em arquitetura de microsserviços. Suporta vários algoritmos de balanceamento de carga, como polling, mínimo de conexões, hash de endereço de origem, etc. Suporta configuração dinâmica e está bem integrado com plataformas de contêiner como Docker e Kubernetes. O desempenho é ligeiramente inferior ao Nginx e HAProxy.
4.3. Implementação de balanceamento de carga por empresas de Internet conhecidas

Muitas empresas de Internet conhecidas usaram tecnologias de balanceamento de carga de código aberto, como Nginx, HAProxy, LVS e Traefik em suas primeiras arquiteturas. Essas tecnologias são maduras, estáveis ​​e possuem comunidades ativas, podendo atender à maioria das necessidades de balanceamento de carga.

No entanto, com a expansão da escala de negócios e a evolução da arquitetura técnica, essas empresas muitas vezes encontram algumas necessidades especiais, como a necessidade de lidar com tráfego de rede extremamente grande ou a necessidade de suportar estratégias complexas de balanceamento de carga. eles podem optar por fazer isso sozinhos. Pesquisar tecnologia de balanceamento de carga ou personalizar e otimizar com base na tecnologia de código aberto existente.

A implementação de tecnologia de balanceamento de carga em cada empresa de Internet conhecida tem suas próprias características. Aqui estão alguns exemplos:

  1. Google: o Google usa seu próprio Google Cloud Load Balancing, que é um serviço automatizado e distribuído de balanceamento de carga que pode lidar com grandes quantidades de tráfego e distribuí-lo para aplicativos e serviços no Google Cloud. Além disso, o Google desenvolveu um balanceador de carga de software chamado Maglev para lidar com o tráfego de rede em seus data centers.

imagem-20230920191031299

  1. Facebook: O Facebook usa seu próprio Katran, um balanceador de carga baseado em Linux projetado para lidar com serviços de rede em grande escala. Katran utiliza a tecnologia eBPF do Linux para modificar dinamicamente estratégias de balanceamento de carga sem interromper os serviços.
  2. Alibaba: Alibaba usa o Server Load Balancer autodesenvolvido, que é um serviço de balanceamento de carga distribuído, de alto desempenho e alta disponibilidade que pode distribuir o tráfego para vários servidores back-end. Além disso, o Alibaba também abriu o código-fonte de um middleware de transação distribuída chamado Seata para lidar com problemas de balanceamento de carga na arquitetura de microsserviços.
  3. Tencent: A Tencent usa um balanceador de carga autodesenvolvido, que pode distribuir automaticamente o tráfego para aplicativos e serviços na Tencent Cloud. Além disso, a Tencent também abriu o código-fonte de uma estrutura RPC de alto desempenho chamada Tars, que inclui funções de balanceamento de carga.
  4. Baidu: O Baidu usa um balanceador de carga autodesenvolvido, que pode distribuir automaticamente o tráfego para aplicativos e serviços no Baidu Cloud. Além disso, o Baidu também abriu o código-fonte de uma estrutura RPC de alto desempenho chamada BRPC, que inclui funções de balanceamento de carga.
4.4. Tendência de desenvolvimento de balanceamento de carga

As tendências de desenvolvimento do balanceamento de carga incluem principalmente as seguintes direções:

  1. Nativos da nuvem e microsserviços: com a popularidade da computação em nuvem e da arquitetura de microsserviços, a tecnologia de balanceamento de carga também está se transformando em nativa da nuvem. Por exemplo, plataformas de orquestração de contêineres como o Kubernetes possuem recursos integrados de descoberta de serviços e balanceamento de carga. Além disso, novos balanceadores de carga como Envoy, Linkerd, Istio, etc. também são projetados para microsserviços e ambientes nativos da nuvem.
  2. Inteligência e automação: Com o desenvolvimento da inteligência artificial e da tecnologia de aprendizado de máquina, o balanceamento de carga também está se tornando mais inteligente. Por exemplo, ao analisar dados de tráfego e desempenho do servidor em tempo real, as estratégias de balanceamento de carga podem ser ajustadas dinamicamente para otimizar o desempenho do sistema e a utilização de recursos.
  3. Segurança: À medida que os ataques à rede se tornam cada vez mais violentos, os balanceadores de carga também precisam ter recursos de proteção de segurança mais fortes, como prevenção de ataques DDoS, injeção de SQL, etc. Alguns balanceadores de carga começaram a integrar recursos de segurança, como Web Application Firewalls (WAF).
  4. Nuvem multinuvem e híbrida: com a popularidade dos ambientes multinuvem e de nuvem híbrida, os balanceadores de carga precisam ser capazes de fornecer serviços unificados de balanceamento de carga em diferentes plataformas de nuvem e data centers.
  5. Desempenho e escalabilidade: À medida que o tráfego da Internet continua a crescer, os balanceadores de carga precisam ter maior desempenho e escalabilidade para lidar com o tráfego de rede em grande escala.

Acho que você gosta

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