Load balance com máquinas virtuais no Azure

Esse post foi migrado do blog antigo. A publicação original foi no dia 12/03/2014

Estou fazendo alguns testes no Azure para cenários mais avançados e acabei achando o exemplo de load balance com máquinas virtuais muito simples. Eu sempre achei que fosse super complicado, mas, no Azure, é um procedimento quase que trivial.

O que é load balance?

Load Balance é uma técnica para distribuir a carga de processamento de uma aplicação entre várias máquinas. Funciona assim:

À medida que as requisições chegam, elas vão para o Azure Load Balancer, que é responsável por dividir as requisições entre as máquinas que estão disponíveis e com mais recursos livres.

Criando as máquinas

Aproveitando os posts anteriores sobre como utilizar o Azure pela linha de comando e criar uma VM no Azure, vou criar as duas máquinas para esta demonstração.

Esses comandos devem ser rodados no terminal.

C:\Program Files\ConEmu>azure vm create vm-teste-lb a699494373c04fc0bc8f2bb1389d6106__Windows-Server-2012-R2-201402.01-en.us-127GB.vhd usuario Senha@123 --location "East US" --vm-size "small"  
info: Executing command vm create
+ Looking up image a699494373c04fc0bc8f2bb1389d6106__Windows-Server-2012-R2-201402.01-en.us-127GB.vhd
+ Looking up cloud service
+ Creating cloud service
+ Retrieving storage accounts
+ Creating VM
info: vm create command OK

C:\Program Files\ConEmu>azure vm create --connect vm-teste-lb a699494373c04fc0bc8f2bb1389d6106__Windows-Server-2012-R2-201402.01-en.us-127GB.vhd usuario Senha@123 --vm-size "small"
info: Executing command vm create
+ Looking up image a699494373c04fc0bc8f2bb1389d6106__Windows-Server-2012-R2-201402.01-en.us-127GB.vhd
+ Looking up cloud service
+ Getting cloud service properties
+ Looking up deployment
+ Retrieving storage accounts
+ Creating VM
info: vm create command OK
O segredo do segundo comando é o — connect vm-teste-lb. Este comando faz com que a máquina criada seja criada sob o mesmo Cloud Service.

E agora?

Temos duas máquinas virtuais apontando para o mesmo endereço DNS. Mas qual VM vai receber o Request de um usuário que acessar http://vm-teste-lb.cloudapp.net/?

Na primeira máquina, vamos configurar assim:

Depois de ser informado que a operação foi realizada, vamos configurar a segunda máquina virtual assim:

BAM! Você já tem um load balance pronto para ser usado!

Divisão de processamento

Para testar este cenário, vou botar dois arquivos html diferentes em cada uma das máquinas. Na máquina 1:

<!DOCTYPE html>  
<html>
<head>
<title>1</title>
</head>
<body>
Máquina 1
</body>
</html>

Na máquina 2:

<!DOCTYPE html>  
<html>
<head>
<title>2</title>
</head>
<body>
Máquina 2
</body>
</html>

Resultado:

http://luisrudgenet.blob.core.windows.net/files/lb-1.mp4

Legal, né? Eu sou aleatoriamente jogado de uma máquina para outra, fazendo com que os recursos de cada máquina sejam otimizados ao máximo.

Prevenção contra falhas

Outro cenário interessante é o de quando uma máquina, por qualquer motivo, pára de funcionar. Para fazer esse teste, vou desligar a máquina 1 pelo terminal:

C:\Program Files\ConEmu>azure vm shutdown vm-teste-lb  
info: Executing command vm shutdown
+ Getting virtual machines
+ Shutting down VM
info: vm shutdown command OK

A partir de agora, somente a máquina 2 está recebendo minhas requisições e o site não parou de funcionar nem por um segundo.

http://luisrudgenet.blob.core.windows.net/files/lb-2.mp4

Interessante, né? É uma solução muito simples para um problema MUITO grande.

Agora… Tem desculpa pra fazer feio na black friday?