- Introdução
O LVS (Linux Virtual Server) é um balanceador de carga integrado no kernel do Linux, que opera na camada 4 (transporte) do modelo OSI. É uma solução amplamente utilizada para distribuir tráfego entre múltiplos servidores backend.
- Princípio de Funcionamento
O LVS opera na cadeia de entrada (input chain) do netfilter, processando pacotes destinados a essa cadeia.
Conceitos Fundamentais:
- VS: O balanceador de carga em si (Virtual Server)
- RS: Servidor backend ou instância de serviço (Real Server)
- CIP: Endereço IP do cliente (Client IP)
- VIP: Endereço IP de entrada do balanceador (Virtual IP)
- DIP: Endereço IP de saída do balanceador (Director IP)
- RIP: Endereço IP do servidor back end (Real Server IP)
O VS direciona os pacotes de entrada com base no endereço IP de destino, protocolo e porta, encaminhando-os para um RS específico de acordo com o algoritmo de agendamento utilizado.
- Suporte de Funcionalidades
Para verificar se o suporte ao IPVS está habilitado no kernel:
grep -i -C 10 ipvs /boot/config-versao-do-kernel
- Modos de Operação
4.1 Modo NAT
Princípio: A comunicação é estabelecida através de conversão de endereços NAT. O VS atua como um proxy entre os clientes e os servidores backend.
Roteamento de Solicitações:
- Cliente: src=cip, dest=vip, port=porta
- VS: src=dip, dest=rip, port=rs:porta
Roteamento de Respostas:
- RS: src=rip, dest=dip, port=rs:porta
- VS: src=vip, dest=cip, port=porta
4.2 Modo DR (Direct Routing)
Princípio: Roteamento direto. Os servidores backend são configurados com o mesmo VIP do balanceador, e a comunicação ocorre através da rede de camada 2. O VS e os RS devem estar na mesma domínio de broadcast, e é necessário resolver conflitos de IP (através de bind ARP e desabilitando o mecanismo de resposta nos RS).
Características: O VS atua apenas como balanceador, responsável por agendar o tráfego. As respostas são enviadas diretamente aos clientes pelos servidores backend.
Roteamento de Solicitações:
- Cliente: srcip=cip, srcmac=mac_cliente, destip=vip, destmac=mac_vs
- VS: src=cip, srcmac=mac_vs, destip=vip, destmac=mac_rs
Roteamento de Respostas:
- RS: srcip=vip, srcmac=mac_rs, destip=cip, destmac=mac_cliente
4.3 Modo TUN (Tunneling)
Princípio: Utiliza túneis para encapsular e encaminhar pacotes. Permite operar entre diferentes segmentos de rede sem conflitos de IP, pois os RS podem ter o mesmo VIP que o VS.
Roteamento de Solicitações:
- Cliente: srcip=cip, destip=vip, port=porta
- VS: srcip=dip, destip=rip, port=porta
Roteamento de Respostas:
- RS: srcip=vip, destip=cip
4.4 Modo FullNAT
Realiza substituição completa de endereços no pacote IP. Este recurso não é nativo do kernel e requer implementação adicional.
- Algoritmos de Agendamento
5.1 Algoritmos Estáticos
Os algoritmos estáticos não consideram a carga atual dos servidores backend, seguindo apenas regras predefinidas para distribuição do tráfego.
5.1.1 RR (Round Robin)
Distribui o tráfego sequencialmente entre todos os servidores backend disponíveis.
5.1.2 WRR (Weighted Round Robin)
Distribui o tráfego com base em pesos atribuídos a cada servidor. Por exemplo, com pesos 3:6:1, a cada 10 solicitações, 3 irão para o servidor A, 6 para o B e 1 para o C.
5.1.3 SH (Source Hashing)
Utiliza um hash do endereço IP de origem para direcionar todo o tráfego de um mesmo cliente para o mesmo servidor backend.
5.1.4 DH (Destination Hashing)
Para cada novo endereço de destino, utiliza um algoritmo de round-robin inicial. Posteriormente, todo o tráfego para esse destino é direcionado para o mesmo servidor backend.
5.2 Algoritmos Dinâmicos
5.2.1 LC (Least Connections)
Sempre direciona o tráfego para o servidor backend com menor número de conexões atuais.
Cálculo de carga: Overhead = activeconns*256 + inactiveconns
5.2.2 WLC (Weighted Least Connections)
Considera tanto o número de conexões quanto o peso de cada servidor.
Cálculo de carga: Overhead = (activeconns*256 + inactiveconns)/weight
5.2.3 SED (Shortest Expected Delay)
Dá prioridade a servidores com menor atraso esperado, considerando apenas conexões ativas e pesos.
Cálculo de carga: Overhead = (activeconns+1)*256/weight
5.2.4 NQ (Never Queue)
Na primeira rodada, utiliza round-robin. Nas subsequentes, utiliza o algoritmo SED.
5.2.5 LBLC (Locality-Based Least-Connection)
Versão dinâmica do algoritmo DH.
5.2.6 LBLCR (Locality-Based Least-Connection with Replicasion)
Versão com função de replicação do LBLC.
- Comandos de Gerenciamento
6.1 Instalação
yum -y install ipvsadm
6.2 Gerneciamento de Cluster
Adicionar ou modificar um serviço de cluster:
ipvsadm -A|E -t|u|f endereco-servico [-s algoritmo] [-p [timeout]] [-M netmask] [--pe persistence_engine] [-b sched-flags]
-A # Adicionar
-E # Modificar
-t # TCP ip:porta
-f # Firewall MARK (marca)
-u # UDP ip:porta
-s # Especificar algoritmo de agendamento
Exemplo:
ipvsadm -A -t 192.168.1.100:80 -s wrr
Remover um serviço:
ipvsadm -D -t 192.168.1.100:80
6.3 Gerenciamento de Servidores Backend
Adicionar ou modificar um servidor backend:
ipvsadm -a|e -t|u|f endereco-servico -r endereco-servidor [-g|i|m] [-w peso]
-a # Adicionar
-e # Modificar
-t # TCP ip:porta
-f # Firewall MARK (marca)
-u # UDP ip:porta
-r # Endereço IP:porta do backend
-g # Modo gateway (DR)
-i # Modo túnel (TUN)
-m # Modo NAT
-w # Especificar peso
Exemplo:
ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.8:8080 -m -w 3
Limpar todas as regras:
ipvsadm -C
6.4 Visualização de Configurações
ipvsadm -L [opcoes]
Opcoes:
--numeric, -n: Exibir endereços e portas em formato numérico
--exact: Informações estendidas com valores exatos
--connection, -c: Exibir conexões atuais do IPVS
--stats: Informações estatísticas
--rate: Exibir informações de taxa
6.5 Salvar e Restaurar Configurações
Salvar regras:
ipvsadm-save > /CAMINHO/ARQUIVO_IPVS
ipvsadm -S > /CAMINHO/ARQUIVO_IPVS
systemctl stop ipvsadm.service # Salva automaticamente as regras em /etc/sysconfig/ipvsadm
Restaurar regras:
ipvsadm-restore < /CAMINHO/ARQUIVO_IPVS
systemctl start ipvsadm.service # Carrega automaticamente as regras de /etc/sysconfig/ipvsadm