Envoy Proxy :: Configurando balanceamento de carga entre hosts

Share:

Mais um post da série de Envoy Proxy. Dessa vez vamos avançar um pouco além do Hello World do post anterior, vamos criar um load balancer para nossas aplicações. Este exemplo vai seguir exatamente a linha do anterior. Vamos criar uma imagem Docker com as configurações do proxy. Neste pra exemplificar mais ainda, vamos criar um lab mais completo com algumas outras imagens de aplicações genéricas pra deixar nossos exemplos mais paupáveis.

Basicamente conseguimos especificar um, dois, três ou mais hosts como backend para um mesmo cluster no envoy, isso nos possibilita criar um balanceamento de carga entre esses hosts especificados funcionando. Além disso o envoy fornece vários tipos de balancemento de carga, mas antes de entrar nesse assunto, vamos fazer funcionar.

Confira esse exemplo no Github 


O exemplo 

Nesse exemplo simples vamos fazer o envoy proxy balancear o tráfego entre dois servidores. Para exemplificar, dockerizei esse lab, ou seja, o envoy irá balancear o tráfego entre dois services do compose. Mais abaixo vamos ver como está isso ai.



O arquivo envoy.yaml

O envoy trabalha através de um arquivo de configuração yaml. Abaixo segue o exemplo desse lab. 


Basicamente, devemos especificar nossos hosts estaticamente no array hosts, dessa forma, especificando endereço  e porta:


Como nesse lab estaremos utilizando uma rede criada pelo docker-compose, o hostname das duas aplicações vão ser http://node_1:8000 e http://node_2:8000

Dockerfile

A Dockerfile do exemplo também é muito simples. Vamos utilizar a imagem oficial do envoy na versão 1.12.2


Nosso docker-compose.yml do lab

Como descrito anteriormente, aqui estão as duas aplicações, nosso proxy e a rede virtual de exemplo. Vamos subir os mesmos e testar


docker-compose up --force-recreate


Teste do roteamento 

Nesse teste coloquei duas aplicações com versões diferentes atrás do load balancer. Claro que esse não é um cenário ideal, porém essa app tem o endpoint /version na qual poderemos ver no olho o roteamento acontecendo entre os hosts

Teste pela versão da app


while true; do curl localhost:8080/version  --silent;  echo ;  done

Tipos de algoritmos de balanceamento de carga



O Envoy suporta alguns algoritmos de balanceamento de carga que podem ser muito úteis na hora de arquitetar sua aplicação. Eles são especificados através do atributo lb_policy na configuração do cluster.

Weighted round robin (ROUND_ROBIN)

É o tipo de balancemento mais simples e mais utilizado, onde cada upstream é selecionado na ordem de round robin. Basicamente serão selecionados a partir de uma porcentagem acima de uma fatia de tempo. É possível selecionar um peso para a distribuição de requests entre essas fatias de tempo. Caso não especificado utilizando o parâmetro weight, o calculo realizado será de numero de 100 / numero de upstreams.

Weighted least request (LEAST_REQUEST)

É o tipo de balanceamento que escolhe o proximo upstream com menos requisições recebidas até o momento. Esse tipo de balancemanto distribui a carga de uma forma eficaz, mas pode não se adaptar em casos de picos de conexões e cenários de alta demanda.

Ring hash (RING_HASH)

Esse algoritmo transforma o upstream num hash e os coloca numa arquitetura de anel, um ao lado do outro, e os requests são balancedos nesse anel em sentido horário. Esse algoritmo trabalha com pesos de uma forma diferente e mais consistente. Por exemplo, se o node_a tem peso 1 e o node_b tem peso 2, no nosso anel serão adicionada 1 hash correspondente ao node_a e 2 hashes correspondentes ao node_b

Maglev (MAGLEV)

O algoritmo Manglev funciona basicamente como o algoritmo de hash em anél do Ring Hash descrito anteriormente, porém a abordagem é efetuada como algoritmo de hash consistente. Geralmente esse algoritmo é utilizado para substituir algoritmos de hashes de anél. O mesmo funciona por peso da mesma forma que os demais, porém toda a alocação é efetuada por meio de uma tabela de 65.537 entradas. Independente do peso, o algoritmo irá alocar os hosts proporcionalmente nessa tabela.

Por exemplo, se o node_a tem peso 1, e o node_b tem peso 2, o node_a terá 21.846 entradas na tabela e o node_b 43.691, totalizando o total da tabela de 65.537 itens alocados.

Comparado a Ring hash, o Manglev tem um algoritmo de pesquisa muito mais rápido e mais assertivo.

Random (RANDOM)

Como o próprio nome diz, a seleção da upstream será efetuada aleatóriamente, bagulho é louco irmão.



Espero ter ajudado :)

Nenhum comentário