balance ad or

13
Projeto de Desenvolvimento em OpenFlow Prof. Cesar Marcondes 1 o Semestre 2011 Projeto - Balanceador de Carga March 19, 2011. 1 Projeto - Balanceador de Carga O balanceamento de carga ´ e uma t´ ecnica para distribuir uniformemente a carga de trabalho entre: dois ou mais computadores, links de rede, processadores, discos r´ ıgidos, ou outros recursos, a fim de obter a utiliza¸c˜ ao ´ otima dos recur- sos, maximizar a vaz˜ ao, minimizar o tempo de resposta e evitar sobrecarga no sistema. Hoje em dia, o balanceamento de carga ´ e um servi¸ co predominante em quase todas as escalas na Internet; ela ´ e fundamental para execu¸ ao de aplicativos em redes de datacenter, tais como as do Google, ou em redes de distribui¸ ao de conte´ udo de larga escala, como Akamai, e em redes corporativas consistindo de m´ ultiplos campus como na HP. Se assumirmos o balanceamento de carga em redes de larga escala, uma forma para equilibrar a carga ´ e distribuir a carga atrav´ es da ”manipula¸ ao” das so- licita¸c˜ oes de DNS e suas respostas. Outra maneira comum de implementar bal- anceamento de carga ´ e implantar equipamentos personalizados, e caros chama- dos ”load-balancers”. Estes s˜ ao implantados no ponto de entrada de uma rede. Eles recebem solicita¸ oes de clientes e distribuem essas requisi¸ oes em um con- junto de servidores replicados. Ap´ os ter feito o curso de Redes (com o tutorial de OpenFlow) vocˆ e vai acabar descobrindo que os m´ etodos acima n˜ ao s˜ ao bons o suficiente. (por que? ´ unico ponto centralizado de distribui¸c˜ ao?) Vocˆ e decide provar ao resto do mundo que existem maneiras melhores (e mais baratas) de balancear a carga dentro de uma rede. Baseando-se na observa¸ ao de que o balanceamento de carga ´ e basicamente um roteamento inteligente, vocˆ e deve iniciar o projeto BalanceTheLoad, que ir´ a transformar as redes existentes em um sistema distribu´ ıdo de balanceamento de carga, sem a necessidade de nenhum hardware especial nem de truques de DNS. 1

Upload: gabriel-marchesan

Post on 12-Apr-2016

216 views

Category:

Documents


0 download

DESCRIPTION

balanceador de carga

TRANSCRIPT

Page 1: Balance Ad Or

Projeto de Desenvolvimento em OpenFlow

Prof. Cesar Marcondes

1o Semestre 2011

Projeto - Balanceador de CargaMarch 19, 2011.

1 Projeto - Balanceador de Carga

O balanceamento de carga e uma tecnica para distribuir uniformemente a cargade trabalho entre: dois ou mais computadores, links de rede, processadores,discos rıgidos, ou outros recursos, a fim de obter a utilizacao otima dos recur-sos, maximizar a vazao, minimizar o tempo de resposta e evitar sobrecarga nosistema. Hoje em dia, o balanceamento de carga e um servico predominanteem quase todas as escalas na Internet; ela e fundamental para execucao deaplicativos em redes de datacenter, tais como as do Google, ou em redes dedistribuicao de conteudo de larga escala, como Akamai, e em redes corporativasconsistindo de multiplos campus como na HP.

Se assumirmos o balanceamento de carga em redes de larga escala, uma formapara equilibrar a carga e distribuir a carga atraves da ”manipulacao” das so-licitacoes de DNS e suas respostas. Outra maneira comum de implementar bal-anceamento de carga e implantar equipamentos personalizados, e caros chama-dos ”load-balancers”. Estes sao implantados no ponto de entrada de uma rede.Eles recebem solicitacoes de clientes e distribuem essas requisicoes em um con-junto de servidores replicados.

Apos ter feito o curso de Redes (com o tutorial de OpenFlow) voce vai acabardescobrindo que os metodos acima nao sao bons o suficiente. (por que? unicoponto centralizado de distribuicao?)

Voce decide provar ao resto do mundo que existem maneiras melhores (e maisbaratas) de balancear a carga dentro de uma rede. Baseando-se na observacaode que o balanceamento de carga e basicamente um roteamento inteligente, vocedeve iniciar o projeto BalanceTheLoad, que ira transformar as redes existentesem um sistema distribuıdo de balanceamento de carga, sem a necessidade denenhum hardware especial nem de truques de DNS.

1

Page 2: Balance Ad Or

2 Detalhando o Projeto

Neste projeto, usaremos o OpenFlow como uma plataforma para realizar rotea-mento de rede, a nıvel de fluxo com ajuste fino. Para simplificar o sistema,iremos desenvolver apenas um balanceamento de carga do tipo round-robin.Nos estamos particularmente interessados em balanceamento de carga HTTP.Nos eliminaremos todo o trafego ARP atraves da instalacao manual de entradasde ARP-cache estaticas no cliente e nos servidores, portanto, ha apenas o trafegoHTTP voltando-e-vem na rede. Vamos construir gradualmente um setup con-tendo um cliente unico e varios servidores. Todos os servidores serao visto comoum (unico) endereco IP pelo cliente, mas a rede ira distribuir a carga por meiode caminhos e servidores (replicados).

2.1 Configuracao de Rede

Vamos usar o framework Mininet para emular uma rede de medio porte rodandodentro de uma unica maquina virtual.

2.2 Controlador

Voce tem a opcao de escolher um dos dois controladores - ou o controladorNOX baseado em Python e C++ ou o controlador Beacon baseado em Java. Oprojeto e dividido em 3 etapas.

3 Etapa 1: Fazendo HTTP request/response fun-cionar no OpenFlow

Esta primeira configuracao consiste de um unico cliente e um unico servidorinterligados por um unico switch OpenFlow. O servidor tem um endereco IPunico assim como um apelido IP (isso sera comum a todos os servidores repli-cados nas etapas futuras). O cliente conhece um unico servidor, que possui esseapelido IP (alias IP). Em nossas configuracoes esse alias IP sera definido como10.0.0.100. O cliente tem uma ARP-entry fazendo o mapeamento do alias IPpara o endereco MAC FF: FF: FF: FF: FF: FF. Nesta parte, voce tera que

2

Page 3: Balance Ad Or

colocar a funcionalidade basica do controlador no lugar. Ou seja, para cadasolicitacao de entrada (packet-in), voce deve instalar uma entrada de tabela defluxo que executa as seguintes acoes, nessa ordem:

• Reescrever o endereco MAC destino (FF...) com o endereco MAC real doservidor

• Fazer o pacote sair pela porta na qual o servidor esta conectado.

Da mesma forma, instale a entrada na tabela de fluxo para a resposta cor-respondente no caminho inverso. Observe que voce nao precisa adicionar aacao ’substituir o endereco MAC’ para este caso. Voce vai achar o modulo detopologia util para esta etapa.

4 Etapa 2: Fazendo Balanceamento de Cargaentre Servidores

Nos iremos construir baseado nos passos anteriores um balanceador de cargapara as solicitacoes recebidas serem distribuıdas entre varios servidores. A figuramostra uma instalacao com um cliente e tres servidores, interconectados porum unico switch OpenFlow. Nesta etapa, voce vai estender a funcionalidade docontrolador para escolher os servidores de uma maneira round-robin.

• Observe que as acoes para a tabela de fluxos permanecem as mesmas.

• Somente a porta de saıda da segunda acao vai mudar dependendo doservidor selecionado.

3

Page 4: Balance Ad Or

5 Etapa 3: Fazendo o Balanceamento de Cargaentre os Servidores e os Caminhos de Rede

Nesta etapa, nos vamos estender ainda mais a funcionalidade do nosso con-trolador para fazer balanceamento de carga entre os servidores e os caminhos derede disponıveis. Para ter caminhos de rede para escolher, nos usaremos umatopologia de rede um pouco mais complexa, como mostrado na figura. Estatopologia e muito popular em empresas e redes de datacenter. A topologia econstituıda por tres camadas de switches - um switch ’core’ na parte superior,uma camada de switches de agregacao no meio, e uma camada de switches deacesso na parte inferior. Na nossa configuracao, o cliente esta ligado a camadade nucleo e os servidores estao conectados aos switches de acesso.

E facil observar que, para uma topologia com N switches de agregacao, ex-istem N caminhos disjuntos para cada servidor a partir do cliente. No exemploacima, temos 2 switches de agregacao e portanto 2 caminhos disjuntos (semusar o mesmo caminho) para cada servidor. Core-Aggr1-Access1-Servidor1,Core-Aggr2-Access1-Servidor1 e assim por diante. Nesta etapa, voce vai bal-ancear a carga das requisicoes de entrada assim como fez nas etapas anteriores,mas com as seguintes extensoes:

• E preciso instalar entradas nas tabelas de fluxo para o caminho completopara rotear a requisicao, ou seja, nao somente em um switch. Observeque a acao de reescrita do endereco MAC deve ser instalada apenas noprimeiro switch no caminho.

• Escolher os servidores em rodizio (round-robin).

• Para cada servidor, tambem escolher caminhos para aquele servidor deuma maneira em rodizio (round-robin). Voce deve escolher o mesmo cam-inho para tanto a solicitacao quanto a resposta correspondente.

Nos testes, sera possıvel aumentar o tamanho dessa rede, portanto voce podeassumir o seguinte sobre a topologia:

4

Page 5: Balance Ad Or

• O switch core esta ligado a todos os switches de agregacao.

• Cada switch de agregacao esta ligado a todos os switches de acesso.

• O cliente esta localizado no switch core.

• Os servidores estao localizados nos switches de acesso.

Portanto, o numero de switches de agregacao, switches de acesso e servi-dores pode variar, e seu balanceador deve ser robusto o bastante para diferentestamanhos.

Entao, o que significa fazer o balanceamento de carga usando (round-robin) entre os servidores e os caminhos?

Voce deve ter percebido que para um determinado servidor, a escolha do switchde agregacao unicamente determina o caminho ate este servidor. Portanto,suponhamos que existam N servidores e M switches de agregacao (ou seja, Mcaminhos para cada servidor) na rede. Para os primeiros N pedidos (para Nservidores), voce tem que escolher os trajetos que vao atraves do switch deagregacao 1 com selecao round-robin. Para os proximos N pedidos, voce deveescolher trajetos que vao atraves do switch de agregacao 2, e assim por diante.Dessa maneira, voce estara fazendo ao mesmo tempo balanceamento de carga ede caminhos da rede. A ordem dos servidores e dos switches de agregacao (ouseja, aquilo que eu quis dizer com switch de agregacao 1 ou switch de agregacao2) pode ser arbitraria, mas deve ser coerente, enquanto o seu controlador estiverrodando.

Para simplificar ainda mais o desenvolvimento da aplicacao, sub-dividimos aEtapa 3 em duas partes.

• Etapa 3a - O Cerebro

1. Ler e imprimir a topologia.

2. Selecione as tuplas <servidor, switch de agregacao> corretamente.

3. Criar e imprimir uma rota para uma determinada tupla <servidor,switch de agregacao>

• Etapa 3b - Os Musculos

1. Descarregar as entradas das tabelas de fluxo no caminho forward(cliente -> servidor)

2. Descarregar as entradas das tabelas de fluxo no caminho reverso(servidor -> cliente)

3. Fazer funcionar o primeiro request

4. Fazer funcionar para a segunda request e todas as subsequentes

5. Ter certeza que a implementacao passou em todos os testes.

5

Page 6: Balance Ad Or

Observacoes Importantes

• Diferenciacao entre as requisicoes - Quando estava desenvolvendo oswitch, voce usou o endereco MAC origem e destino para diferenciar osvarios fluxos de L2. Neste exercıcio estamos lidando com solicitacoes erespostas HTTP, que sao fluxos de L4. Isso significa que voce tera queinstalar entradas de tabela de fluxo com correspondencias exatas (ou seja,fazendo match dos campos de L2 ate L4). Dado que contamos com ape-nas um cliente, e que todos os servidores compartilham o mesmo enderecoIP (10.0.0.100) e atendem as solicitacoes na mesma porta TCP (80), oprincipal atributo que diferencia os fluxos pertencentes a diferentes so-licitacoes do cliente e a porta TCP do cliente, porta essa que muda paracada requisicao (pelo menos dentro da duracao de tempo que o nossosistema opera).

• Diferenciacao entre os caminhos - Na etapa 3 e esperado que vocetambem faca o balanceamento de carga entre diversos caminhos. Portanto,para a topologia hierarquica do passo 3, e importante notar que para umdeterminado servidor, escolher uma unica switch de agregacao determinaunicamente o caminho. Portanto, balancear o caminho e o mesmo queescolher o switch de agregacao. (Dica: Esta e a informacao que voceprecisa armazenar nos seus registros).

• Soft State vs Hard State - As entradas de fluxo que voce instalanos switches OpenFlow sao consideradas ”soft state”. Nao existe nen-hum garantia de tempo estrita sobre quando exatamente essas entradasserao realmente instaladas dentro do datapath do switch. Essas entradastambem podem expirar se nao tiver nenhum trafego passado por elas porum pre-determinado perıodo de timeout. Isto significa que o Controladordeve ’lembrar’ o que ele pretendia fazer com uma requisicao particular(fluxo). Em outras palavras, o controlador deve manter uma tabela dehard-state. Isso e particularmente importante quando voce instala en-tradas de fluxos ao longo de um caminhos de multiplos switches.

6 Um Exemplo

Considere uma rede com 2 switches, conforme mostrado na figura.

6

Page 7: Balance Ad Or

A requisicao do cliente entra pelo switch-1 e causa um evento Packet-in noseu controlador. Vamos dizer que seu controlador decide enviar a requisicaopara o server-1, e portanto instala as entradas apropriadas nas tabelas de fluxosdos switch-1 e switch-2. Agora, suponhamos que a requisicao entra no switch-2antes daquela entrada na tabela de fluxo ser instalada no switch-2, fazendo comque seja gerado outro evento Packet-in (no switch-2, como isso acontece?). Oseu controlador deveria entao ’se lembrar’ que essa requisicao esta indo para oserver-1 (e nao para o server-2) e reinstalar as entradas apropriadas da tabelade fluxo no switch-2.

• A seguinte e uma possıvel sequencia de passos que voce pode seguir paraimplementar a sua solucao:

• Para cada evento Packet-In:

– Ignorar todos os pacotes nao-IP.

– Verifique se o evento Packet-In foi causado por um soft-state faltante.Se sim, usar o seu hard-state para reinstalar o soft-state faltante, eretornar.

– Caso contrario

∗ Encontre o proximo servidor apropriado.

∗ Encontre o proximo caminho apropriado para o servidor.

∗ Armazenar a escolha (servidor, caminho) no hard-state.

∗ Instalar entradas de tabela de fluxo em todos os switches aolongo daquele caminho (lembre-se: reescrever o MAC no primeiroswitch do caminho cliente-servidor, e nao reescrever o MAC nocaminho servidor-cliente)

Obviamente, fique a vontade de escolher outras maneiras de implementar asua solucao. Algumas coisas para se pensar:

• Como armazenar o meu hard-state? Qual estrutura de dados devo usar?

• Como faco para armazenar informacoes da topologia de uma forma util?

7

Page 8: Balance Ad Or

7 O Que Tem no Pacote?

• Maquina Virtual Linux e NOX. Voce pode usar a mesma imagem de MVque voce usou no exercıcio de criacao de um switch.

• Codigo Esqueleto para NOX e Beacon do Modulo de Balanceamento deCarga.

• Scripts para configuracao das topologias de rede e geracao das requisicoespara cada uma das 3 Etapas acima.

• Scripts para verificar se esta correta a funcionalidade do controlador.

7.1 Configurando o Sistema

Fazer Download dos Scripts de Configuracao e Testes:

• Dentro da MV, a partir da sua pasta ’home’, execute o seguinte comando:

• git clone git://openflow.org/cs244-pa2.git

8 Passos Para Trabalhar com NOX Python/C++

Atualizacao e recompilar NOX:

Dentro da maquina virtual, execute o seguinte:

cd ∼/nox

Faca Commit das alteracoes do exercıcio ’Desenvolvendo Switch’, se houver.

git status

Verifique se existem alteracoes pendentes (mais provavelmente no arquivo ...pytutorial.py). Efetivar as mudancas com o comando.

git commit -a -m ’Switch’

Tenha certeza que seu diretorio esta limpo:

git statusgit pull –rebasecd buildmake cleancd .../boot.shcd build

8

Page 9: Balance Ad Or

../configure –with-python=yesmake -j2

Isso pode levar algum tempo para compilar, mas e so feito uma vez. Vocepode ignorar estes passos se voce estiver desenvolvendo com Beacon.

8.1 Desenvolvimento com o NOX

No codigo do Controlador, criamos um modulo esqueleto chamado loadbalancer.O modulo esta na pasta ∼/nox/src/nox/netapps. O modulo consiste em umunico arquivo python - loadbalancer.py. Todo o seu codigo deve ficar dentro doarquivo loadbalancer.py. Alem da classe principal (loadbalancer), o modulo tem2 outras classes auxiliares - ServerLoc e Topology. ServerLoc tem um codigo quele as informacoes de localizacao do servidor e do cliente e fornece como resultadosob a forma de um dicionario Python. A classe Topologia fornece informacoesde topologia.

Usando a Classe Topology, essa classe oferece algumas funcoes uteis:

• get datapaths( ) - retorna os identificadores de datapath (dpids) detodos os switches da rede.

• get neighbors(dpid) - retorna a lista dos dpids de todos os vizinhos deum determinado switch.

• get outlinks(dst, src) - Se dois switches (src e dst) estiverem conecta-dos, ele retorna uma tupla de 2 elementos correspondente ao par de portasque os dois switches estao conectados por esse enlace. Caso contrario, de-volve None.

• is internal(dp, port) - retorna Verdadeiro se a porta e interna a rede(ligada a outro switch), senao Falso.

Aqui estao alguns outros arquivos de codigo fonte que voce pode achar utilpara esse exercıcio:

• NOX Python API: nox/src/nox/lib/core.py

• Exemplo de Uso da API: nox/src/nox/netapps/routing/samplerouting.py

• Exemplos de Uso da API: nox/src/nox/coreapps/examples/

Observacoes:

• Tenha certeza de iniciar o Controlador quando for solicitado pelo scriptde inicializacao do Mininet

• O script pa2.py automaticamente mata quaisquer instancias de NOX aposcada experimento. Nao se preocupe se o controlador NOX finalizar aposfinalizar cada teste sucessivo.

9

Page 10: Balance Ad Or

9 Passos Para Trabalhar com Beacon/Java

Em sua maquina fısica (host), faca cd para um diretorio projeto-beacon. Con-firmar as alteracoes do Switch (exercıcio anterior), se houver.

git status

Verifique se existem alteracoes pendentes (mais provavelmente no arquivo ...Tutorial.java). Efetivar as mudancas com o comando.

git commit -a -m ’Switch’

Tenha certeza que seu diretorio esta limpo:

git statusgit pull –rebase

No Eclipse, selecione todos os modulos e clique em Refresh. Voce pode ignoraresta etapa se voce estiver desenvolvendo em NOX.

10 Desenvolvimento com Beacon

No codigo do Controlador, criamos um modulo esqueleto chamado net.beaconcontroller.loadbalancer.O modulo consiste de um unico arquivo Java - LoadBalancer.java. Todo o seucodigo deve ficar dentro do arquivo LoadBalancer.java. Alem da classe principal(LoadBalancer), o modulo tem 2 outras classes auxiliares - ServerLoc e Topol-ogy. ServerLoc tem um codigo que le as informacoes de localizacao do servidore do cliente e fornece como resultado sob a forma de um hashmap. A classeTopologia fornece informacoes de topologia.

Usando a Classe Topology, essa classe oferece algumas funcoes uteis:

• getDatapaths( ) - retorna os identificadores de datapath (dpids) de todosos switches da rede.

• getNeighbors(dpid) - retorna a lista dos dpids de todos os vizinhos deum determinado switch.

• getOutlinks(dst, src) - Se dois switches (src e dst) estiverem conectados,ele retorna um Vector correspondente ao par de portas que os dois switchesestao conectados por esse enlace. Caso contrario, devolve null.

• isInternal(dp, port) - retorna Verdadeiro se a porta e interna a rede(ligada a outro switch), senao Falso.

Observacoes:

10

Page 11: Balance Ad Or

• Tenha certeza de iniciar o Controlador quando for solicitado pelo scriptde inicializacao do Mininet

• O Controlador Beacon precisa se comunicar com o script pa2.py para obtera informacao de topologia. A variavel MININET IP armazena o enderecoIP da interface eth1 da Maquina Virtual (onde o script pa2.py executa).Voce pode ter que mudar essa variavel para o seu setup.

11 Atualizando o Framework Mininet

Dentro da maquina virtual, execute o seguinte comando:

cd ∼/mininetgit pull –rebasesudo make install

12 Testando o seu Codigo

O principal script de configuracao e teste e chamado pa2.py. Certifique-se deexecuta-lo dentro da sua pasta.

cd ∼/loadbalancer

Para saber mais sobre todas as opcoes disponıveis, digite:

sudo python pa2.py -h

A seguir segue uma breve descricao das opcoes:

• -h, –help: mostra essa mensagem de ajuda e sai

• -i CONTROLLER ADDR, –interface=CONTROLLER ADDR:CONTROLLER PORT: onde IP:porta e o endereco que o controladoresta na escuta (padrao e 127.0.0.1:6633)

• -s STEP, –step=STEP: Executa a Etapa apropriada. Step deve serum valor entre [0-3]. Onde o valor entre 1 e 3, executa testes de umadeterminada etapa. Enquanto que o valor de 0 executa todas as tresetapas em sequencia.

• -r, –run: Gera trafego web para testar a sua solucao

• -t, –test: Testa a sua solucao (executando testes publicos)

• -v, –verbose: Enviar saıda detalhada para stderr. Voce pode escolherpara redirecionar essa saıda detalhada para um arquivo diferente, usando2¿/path/to/file.

11

Page 12: Balance Ad Or

12.1 Exemplos de Uso do Script de Teste

Para executar testes da Etapa-1 com Trafego Web gerado automaticamente:

sudo python pa2.py -s 1 -r

Para executar testes da Etapa-1 com o Controlador Beacon executando namaquina fısica (host):

sudo python pa2.py -s 1 -i 192.168.56.1:6633

Para executar testes da Etapa-2 via Console Mininet:

sudo python pa2.py -s 2

Para executar testes publicos de Todas as 3 Etapas:

sudo python pa2.py -s 0 -t

12.2 Debugando com a Console (CLI)

Se voce quiser debugar o sistema usando o console do Mininet (CLI), faca oseguinte:

• Execute pa2.py sem as opcoes ’-t’ ou ’-r’. Isto ira ativar a console doMininet.

• Execute o codigo de cliente web no proprio no cliente.<client name> ./client/client.py 2 1 <no. of requests>A saıda do cliente sera anexada ao /tmp/time log.txt. Digite quit quandotiver terminado.

12.3 Entendendo a Saıda do Cliente Web

O script do cliente web (client/client.py) gera os resultados no arquivo de saıda/tmp/time log.txt. Cada linha de saıda corresponde a uma requisicao HTTPfeita pelo cliente. Essas linhas sao constituıdas pelos seguintes 4 campos:

[time of request] [server name] [server MAC address] [response time]

Se algum dos campos tiver o valor Unknown, provavelmente significa que arequisicao nao obteve a resposta correta. Outro ponto importante e que as req-uisicoes normalmente recebem timeout apos cerca de 21 segundos. Se voce es-tiver vendo valores proximo a esse no campo tempo de resposta, e bem provavelque a requisicao sofreu um timeout.

12

Page 13: Balance Ad Or

12.4 Composicao da Nota

A nota sera baseada na correta execucao dos testes e na qualidade do codigofonte. O mesmo script que foi fornecido para testes publicos (pa2.py) tambemsera usado para dar a nota, alem de testes proprios desenvolvidos pelo instrutor.Segue a distribuicao de pontos (10 pontos) em funcao das varias partes:

• Etapa 1: 1 ponto

• Etapa 2: 3 pontos

• Etapa 3: 3 pontos

• Testes Privados: 2 pontos

• Qualidade de Codigo: 1 ponto

A submissao do projeto sera feito atraves do Moodle.

13