Beruflich Dokumente
Kultur Dokumente
Braslia, DF
2014
Braslia, DF
2014
Braslia, DF
2014
Resumo
Com o surgimento da World Wide Web, h uma crescente e incessante demanda por servios fornecidos por sistemas de informao das mais variadas dimenses. Desde o uso
de redes sociais at o uso de sistemas de e-commerce, as infraestruturas de TI das organizaes precisam atender importantes requisitos para alcanar a satisfao do usurio,
dentre os requisitos se encontram o desempenho, escalabilidade, confiabilidade e disponibilidade. Para tentar suprir estes requisitos esto sendo continuamente desenvolvidas
solues em hardware e software, dentre elas existe o Balanceamento de carga de servidores, que constitui em um processo de distribuio uniforme de requisies a servios
utilizando um dispositivo baseado em rede, ou seja, uma tcnica de distribuio de trabalho a um cluster de servidores via um algoritmo de escalonamento. O presente trabalho
tem como ideia a criao do projeto de um produto, um balanceador de carga de servidores simplificado para computadores que fazem uso de sistemas operacionais baseados
em Linux, em integrao conjunta com o software que fornece um servio de failover, o
Application Manager. O core do sistema ser desenvolvido como um mdulo do kernel,
fazendo uso do Netfilter, um framework nativo do kernel do Linux para manipulao de
pacotes de rede.
Palavras-chaves: balanceamento de carga. algoritmo de escalonamento. linux. netfilter.
Abstract
With the emergence of the World Wide Web, there is a growing and constant demand
for services provided by information systems of all sizes. Since the use of social networks
to the use of e-commerce systems, the IT infrastructures of the organizations need to
meet important requirements to achieve user satisfaction, among the requirements are
performance, scalability, reliability and availability. To try to meet these requirements are
continually being developed hardware and software solutions, among them is the Load
balancing server, which is a process of uniform distribution of requests to services using
a network-based device, i.e., a technique of distribution of work to a cluster of servers via
a scheduling algorithm. This present work has the idea to create the design of a product,
a simplified server load balancer for computers that use Linux-based operating systems,
with joint integration with a software that provides a failover service, the Application
Manager. The core of the system will be developed as a kernel module, using Netfilter, a
native Linux kernel framework for handling network packets.
Key-words: load balancing. scheduling algorithm. linux. netfilter.
Lista de ilustraes
Figura 1 Cronograma do TCC1 . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
Figura 2 Camadas de rede . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
Figura 3 Interao de modos de CPU e hardware . . . . . . . . . . . . . . . . . 30
Figura 4 Balanceador de carga de servidores . . . . . . . . . . . . . . . . . . . . 33
Figura 5 Configurao de um balanceador de carga . . . . . . . . . . . . . . . . 38
Figura 6 Retorno de trfego via NAT . . . . . . . . . . . . . . . . . . . . . . . . 40
Figura 7 Retorno de trfego via tunelamento IP . . . . . . . . . . . . . . . . . . 42
Figura 8 Retorno de trfego via DR . . . . . . . . . . . . . . . . . . . . . . . . . 43
Figura 9 Cenrio de redundncia ativo-standby . . . . . . . . . . . . . . . . . . . 48
Figura 10 Processo de comunicao TCP . . . . . . . . . . . . . . . . . . . . . . 53
Figura 11 Viso lgica da soluo de balanceamento de carga . . . . . . . . . . . 57
Figura 12 Estrutura do Application Manager . . . . . . . . . . . . . . . . . . . . 61
Figura 13 Mquina de estados do SMA . . . . . . . . . . . . . . . . . . . . . . . . 61
Figura 14 Viso de implantao da soluo de balanceamento de carga . . . . . . 63
Figura 15 Projeto da rede de computadores da soluo . . . . . . . . . . . . . . . 68
Figura 16 Tipos de hook com possibilidade de registro . . . . . . . . . . . . . . . 80
Lista de tabelas
Tabela 1 Estatstica de uso de sistemas operacionais . . . . . . . . . . . . . . . . 29
Tabela 2 Comparao entre tcnicas de retorno de trfego . . . . . . . . . . . . 44
Tabela 3 Eventos para troca de estados do SMA . . . . . . . . . . . . . . . . . . 62
Lista de quadros
Quadro 1 Cdigo fonte C: Envio de um ICMP_ECHO . . . . . . . . . . . . . . 70
Quadro 2 Cdigo fonte C: Recebimento de um ICMP_ECHOREPLY . . . . . . 70
Quadro 3 Cdigo fonte Python: Envio de arquivo via SCP . . . . . . . . . . . . 72
Quadro 4 Cdigo fonte C: Chamadas IOCTL no slbcore . . . . . . . . . . . . . 74
Quadro 5 Cdigo fonte Python: Uso do IOCTL no slbd . . . . . . . . . . . . . . 75
Quadro 6 Cdigo fonte C: Structs para o slbcore . . . . . . . . . . . . . . . . . . 76
Quadro 7 Cdigo fonte C: Struct de cofigurao de um hook . . . . . . . . . . . 79
Quadro 8 Cdigo fonte C: Prottipo de funo para registrar um hook . . . . . . 79
Quadro 9 Cdigo fonte C: Exemplo de um mdulo netfilter simples . . . . . . . 82
ASICs
API
OSI
IP
Internet Protocol
VIP
TCP
UDP
PDU
ISO
ICMP
GPL
CPU
RAM
DNS
KISS
NAT
HTTP
LAN
CLI
IOCTL
Input/Output Control
LVS
Sumrio
1
Introduo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
1.1
Justificativa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
1.2
Objetivo geral . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
1.3
Objetivos especficos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
1.4
Estrutura do trabalho . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
1.5
Metodologia de trabalho . . . . . . . . . . . . . . . . . . . . . . . . . . 23
1.5.1
Cronograma do trabalho . . . . . . . . . . . . . . . . . . . . . . . . . . 23
Fundamentao terica . . . . . . . . . . . . . . . . . . . . . . . . . 25
2.1
Terminologia bsica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
2.2
Protocolos de rede . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
2.2.1
Modelo OSI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
2.2.2
Pilha TCP/IP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
2.3
Sistemas Linux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
2.3.1
Conceitos bsicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
2.3.2
2.3.3
Mdulos do kernel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
2.3.4
Netfilter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
2.4
2.4.1
2.4.2
Histrico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
2.4.3
Benefcios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
3.1
3.2
Retorno de trfego . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
3.2.1
3.2.2
3.2.3
3.2.4
3.3
Algoritmos de escalonamento . . . . . . . . . . . . . . . . . . . . . . . . 44
3.4
Redundncia do servio . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
Projeto arquitetural . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
4.1
Representao da arquitetura . . . . . . . . . . . . . . . . . . . . . . . . 51
4.2
4.3
Viso lgica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
. . . . . . . . . . . 44
4.4
Viso de implantao . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
4.5
Restries de qualidade . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
5
5.1
5.2
5.3
5.4
Monitoramento do cluster . . . . . . . . . . . . . . . . . . . . . . . . . . 68
Processo de failover . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
Comunicao entre slbd e slbcore . . . . . . . . . . . . . . . . . . . . . 73
5.5
5.6
5.7
6
6.1
Concluso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
Trabalhos futuros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
Referncias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
Apndices
APNDICE A Lista de comandos do amcli
89
. . . . . . . . . . . . 91
21
1 Introduo
A internet em conjunto com suas ferramentas de acesso (e.g. World Wide Web)
a mais poderosa ferramenta de comunicao do mundo, por intermdio dessa so diariamente realizadas desde simples conversas entre pessoas, at transaes financeiras de alto
valor. As mudanas na forma de comunicao que esta infraestrutura causou e causa at
hoje na vida das pessoas e suas relaes incalculvel. Todas a vantagem que esse meio
de comunicao oferece, implica no fato de que dia aps dia, existe um aumento de uso
dessa infraestrutura.
Como prova deste aumento de uso, vejamos a progresso do nmero de buscas feitas
na ferramenta de busca Google no perodo de seis anos (STATISTIC BRAIN, 2014). No
ano de 2007foram realizadas uma mdia de 1.200.000.000 (um bilho e duzentos milhes)
de buscas por dia, j no ano de 2013, o dado mais recente no perodo de realizao deste
presente trabalho, foram realizadas uma mdia de 5.922.000.000 (cinco bilhes, novecentas
e vinte e duas milhes) de buscas por dia. Um aumento aproximado de 493,5% nas buscas,
ou seja, um fluxo de requisies quase cinco vezes maior em um perodo 6 anos.
Esta situao se repetiu e se repete em vrios outros servios disponveis na web,
at mesmo internamente em empresas (com uma escala menor, obviamente). Isto motivou o desenvolvimento de diversas solues de sistemas distribudos para amenizar os
impactos causados por esta situao, uma dessas solues o balanceamento de cargas
em servidores.
1.1 Justificativa
Dados os fatos introduzidos anteriormente, este trabalho de concluso de curso
motivado a desenvolver uma soluo que contorne o aumento do uso de servios em uma
rede. Levando-se em considerao um servio que aumenta diariamente a sua taxa de
acessos, podem surgir diversos problemas, como os a seguir:
Diminuio de desempenho do servio;
Caso o servio esteja centralizado em um nico local (e.g. Servidor fsico), se houver
uma falha neste servidor todo o servio ficar indisponvel;
Se for optado pelo aumento dos recursos do servidor (e.g. memria RAM, processamento, interface de rede com maior largura de banda, etc), a situao pode ser
contornada temporariamente, mas se o aumento de requisies prosseguir, em algum
momento ser atingido o limite fsico da mquina, e o problema retornar.
22
Captulo 1. Introduo
<http://www.cisco.com/go/css11500/>
<http://www.radware.com/Products/Alteon/>
<https://f5.com/products/modules/local-traffic-manager>
<https://www.debian.org/>
<http://br.redhat.com/products/enterprise-linux/>
<http://www.microsoft.com/pt-br/server-cloud/products/windows-server-2012-r2/>
<http://www.linuxvirtualserver.org/>
<http://haproxy.1wt.eu/>
23
24
Captulo 1. Introduo
25
2 Fundamentao terica
Este captulo ter a funo de demonstrar a pesquisa realizada acerca dos diversos
temas que tangem este trabalho, fornecendo um referencial terico para descrio e justificativa do projeto da soluo. Somente assuntos com maior recorrncia sero trabalhados
aqui, caso um determinado assunto pertinente no seja explicado neste captulo, significa
que ele ser abordado diretamente nos posteriores.
26
deciso arquitetural o software que realiza essa tarefa foi componentizado, de forma que os
problemas que esse amontoado de cdigo resolveria, fosse dividido de acordo com suas
similaridades e cada componente ficaria responsvel por resolver um pequeno conjunto de
problemas (princpio de Dividir para conquistar2 ).
Estes componentes foram organizados de uma forma hierrquica, formando uma
pilha de camadas, umas sobre as outras. Cada camada tem a funo de fornecer determinados servios as camadas superiores, e uma camada X de uma mquina A tem a
funo de se comunicar com a mesma camada X de uma mquina B (TANENBAUM,
2003, p. 37). Seguindo o fluxo dessa pilha de camadas a comunicao seria estabelecida,
conforme a Figura 2.
A forma em que essas camadas se comunicam determinado pelo protocolo de
rede utilizado, que uma implementao da soluo dos problemas associados a camada,
alinhado a um conjunto de regras e procedimentos a serem respeitados para emisso e
recepo de mensagens.
27
28
Faz referncia aos seus dois protocolos mais famosos, TCP e IP.
Imagem da rvore genealgica: <http://www.computerworld.com/common/images/site/features/
2009/062009/unix_chart_775.jpg>
<http://www.apple.com/br/osx/>
29
Win8
Win7
Vista
NT
WinXP
Linux
Mac
Mobile
Abril
Maro
Fevereiro
Janeiro
15.8%
15.0%
14.2%
13.4%
55.4%
55.1%
55.0%
55.3%
1.2%
1.3%
1.4%
1.5%
0.2%
0.2%
0.3%
0.3%
8.0%
9.4%
10.1%
11.0%
5.0%
4.9%
5.0%
4.9%
10.3%
9.9%
10.0%
9.6%
4.0%
4.0%
4.0%
4.0%
Estes resultados englobam sistemas operacionais de todos os tipos, mas se a pesquisa fosse restrita a sistemas operacionais para uso em servidores, os que fazem uso do
kernel Linux disparadamente ocupariam o primeiro lugar. Grande parte desse sucesso
devido a enorme comunidade que oferece desenvolvimento contnuo e grande suporte as
verses do Linux, resultante da filosofia de software livre adotada.
30
31
<http://pt.wikipedia.org/wiki/N%C3%BAcleo_monol%C3%ADtico>
Caso ele seja inserido estaticamente a imagem do kernel, ele no um mdulo.
32
2.3.4 Netfilter
Especificamente para mdulos do kernel Linux que trabalham com aspectos de
rede, existe uma srie de componentes que podem ser utilizados para ter acesso a determinadas funcionalidades, como interceptao de pacotes. Este conjunto de componentes fazem parte do framework chamado de Netfilter, que composto de quatro partes
(RUSSEL; WELTE, 2002):
Hooks: So pontos pr-definidos na travessia de pacotes na pilha de protocolos TCP/IP
de uma mquina. Toda vez que chegado neste ponto pr-definido, o hook chamar
o que estiver registrado nele;
Registro de hooks: Qualquer mdulo do kernel pode registrar um hook com uma funo de callback prpria9 , ou seja, quando um pacote chegar a uma determinada
camada de rede, a funo de callback implementada e registrada no hook ir receber
o pacote da camada e vrias operaes podero ser feitas nele (aceitar, descartar,
esquecer, empilhar e tambm efetuar alteraes);
Empilhamento de pacotes: Quando em uma funo de callback, um pacote empilhado, ele pode ser acessado por aplicaes no modo usurio de CPU, de forma
totalmente assncrona;
Documentao: Todas estas funcionalidades possuem uma boa documentao, alm de
comentrios no prprio cdigo do componente.
Funes de calback so passadas como argumento de uma outra funo, para serem futuramente
utilizadas.
33
Como a referncia citou, o termo recurso pode ter diferentes representaes, onde
a definio de balanceamento de carga ainda seria passvel de aplicao, por exemplo,
a distribuio de carga entre trabalhadores de uma empresa. Mas as formas que estes
balanceamentos so feitos contm suas peculiaridades, a seguir diferenas de duas das
principais:
Balanceamento de carga de CPU: Em um sistema com multiprocessamento, as CPUs
podem estar em uma mesma mquina ou distribudas, e o intuito do balanceamento
de carga distribuir um trabalho, mas este trabalho divido em partes, onde os
processados atuam paralelamente (e.g. As instrues de um programa so divididas
entre as CPUs).
Balanceamento de carga de servidores: Em uma arquitetura web podem existir diversos servidores que rodam o mesmo website, a carga de trabalho pode ser distribuda entre eles, mas neste caso os servidores no atuam obrigatoriamente em
paralelo, provavelmente eles nem se comunicam ou sabem da existncia um do outro. Neste caso cada pedido ao website distribudo entre os servidores, mas um
mesmo pedido no ser processado em dois ou mais servidores. A Figura 4 representa
este caso.
34
2.4.2 Histrico
Com o aumento do trfego na internet foi necessrio um determinado investimento
na estrutura das redes e das empresas que disponibilizavam servios. Inicialmente como
primeira medida para aumentar o desempenho dos servidores, foi utilizada a abordagem
de scale-up, que consiste em aumentar os recursos computacionais de uma mquina (CPU,
memria RAM, velocidade do disco rgido, etc). Durante algum tempo essa abordagem
atendeu algumas necessidades, mas rapidamente foram atingidos limites de melhoria (os
recursos computacionais para uma mquinas so finitos), alm disso, os recursos com
maior capacidade tinham altos preos, e ao final de tudo as mquinas ainda corriam o
risco de falhar em algum momento e deixar seus servios indisponveis.
Outra abordagem que foi iniciada para se adaptar ao aumento do trfego foi a
de scale-out, onde ao invs de aumentar os recursos de uma nica mquina, aumentado o nmero de mquinas para trabalhar em conjunto de forma distribuda. De acordo
com (SHARMA; SINGH; SHARMA, 2008), um sistema computacionalmente distribudo
prov compartilhamento de recursos como uma das suas maiores vantagens, o que prov
melhor performance e confiabilidade do que qualquer outro sistema tradicional nas mesmas condies.
Antes dos balanceadores de carga virarem um produto real, os administradores de
sistema faziam uso da tcnica baseada em DNS round-robin para atingir resultados simi-
35
2.4.3 Benefcios
Com o surgimento das solues de balanceadores de carga baseados em servidores
(operam sobre mquinas servidoras com sistemas operacionais padro) foram alcanados diversos benefcios, vrios deles j foram citados diretamente ou indiretamente neste
trabalho. A seguir uma lista dos principais de acordo com Bourke (2001, p. 8):
Escalabilidade: Em uma infraestrutura com balanceamento de carga, existe um bom
nvel de escalabilidade dos servios, pois para aumentar o seu poder necessrio somente adicionar mais servidores reais. Tambm facilitada a remoo de servidores
com defeito, ou a desativao e ativao de servidores de acordo com a demanda.
Tudo com transparncia para os clientes.
Desempenho: So alcanados altos nveis de performance a um custo mais baixo do
que se fossem comprados computadores com recursos computacionais mais potentes. Dependendo da eficincia do algoritmo utilizado para deciso de despacho das
requisies, onde sero escolhidos os que estiverem menos ocupados, melhor ser o
desempenho.
Disponibilidade e confiabilidade: Caso um dos servidores falhe, o balanceador de
carga capaz de detectar e redirecionar o fluxo para outros, sem que o servio
como um todo fique indisponvel. Outro aspecto importante que o balanceador de
carga no deve ser um gargalo para o servio (caso ele seja o n a falhar), ento
necessrio aplicar alguma redundncia no servio de balanceamento, possuindo um
servidor de backup adicionado de um processo de failover integrado, aumentando a
confiabilidade do sistema.
37
38
39
um nico link lgico de alta velocidade e redundncia. Tambm pode ser realizado na
camada 3, onde os pacotes IP em um dispositivo de rede so redistribudos seguindo
algum algoritmo, o problema que via camada 3 s so conhecidos os possveis hosts
alvos, no tendo conhecimento da aplicao alvo (s seria acessvel via a porta do servio).
Normalmente os equipamentos como switches e roteadores operam at a camada 3, sendo
possvel acessar cabealhos de quadros ethernet e pacotes IP.
Natrio (2011) cita que as camadas de rede mais utilizadas so a 4 e a 7. O balanceamento de carga na camada 4 um mtodo mais simplista do que na camada 7, consiste
na redistribuio de requisies na camada de transporte, fazendo uso normalmente dos
protocolos TCP ou UDP. A sua simplicidade est ligada ao balanceador no fazer anlise do contedo (i.e payload) dos segmentos TCP ou UDP, somente tendo a funo de
repassar a informao, resultando em um maior desempenho. J na camada 7 feito um
extenso uso de anlise de informaes que esto sendo trefegadas, sendo capaz de analisar
a URL (Uniform Resource Locator) de um pedido, os cookies 2 que esto sendo trefegados,
o tipo de dado que foi requisitado (via mime-type 3 ). Em cima dessas informaes podem
ser tomadas decises mais inteligentes, fazendo por exemplo uma separao dos servidores
da infraestrutura de acordo com os seus dados, um grupo especializado em informaes
estticas (e.g. pginas HTML estticas, imagens e vdeos) e outro grupo especializado em
informaes dinmicas (e.g. scripts PHP), melhorando a organizao da infraestrutura.
Um contra deste tipo de abordagem baseado em contedo que o balanceador fica preso
a determinados tipos de aplicao, isso significa que se ele faz
<http://en.wikipedia.org/wiki/HTTP_cookie>
<http://en.wikipedia.org/wiki/Internet_media_type>
40
na internet, mas possibilita que o endereo seja reutilizado por outros hosts em subredes internas de outras organizaes, quantas vezes forem necessrias (dependendo da
arquitetura da rede, at na mesma organizao). Mas para estes hosts com IP privados
conseguirem se comunicar com a internet, deve ser utilizada a tcnica conhecida como
NAT, onde o IP privado ser representado pelo IP pblico do gateway que est na sada
padro da rede, sofrendo um processo de traduo sempre que for necessrio.
41
42
os pacotes que entram na rede, em sua sada os pacotes podem ser enviados diretamente
para o cliente, via uma rota padro diferente. Mas em compensao existe tambm um
overhead neste tipo de tcnica, pois os pacotes agora so inseridos dentro de outros pacotes, existindo dois cabealhos para cada conjunto de dados, agora sero necessrios
trafegar alguns pacotes a mais. Tambm existem as tarefas adicionais de encapsular e desencapsular os pacotes IP, mas mesmo assim, o desempenho da soluo por tunelamento
IP superior a via NAT.
43
A Figura 8 demonstra que a arquitetura deve estar configurada de modo que todos
os hosts estejam conectados em um mesmo segmento de rede. O processo que ocorre nesta
tcnica o seguinte:
1. Um cliente envia a requisio ao balanceador de carga;
2. Aps deciso de qual servidor real ir efetuar o processamento, o balanceador troca
o endereo MAC (Media Access Control) do destinatrio (que originalmente era o
seu prprio MAC). Isso deve ocorrer para que o endereo VIP de destino do pacote
permanea inalterado;
3. O servidor real recebe a requisio, verifica que ele o destinatrio por causa do
seu VIP, processo a requisio e envia uma resposta para a sada padro da rede. O
campo de destinatrio da resposta o endereo do cliente e o campo de remetente
o VIP do balanceador, que estava configurado em sua interface de loopback;
4. O cliente recebe a resposta e a aceita, pois o endereo de remetente realmente um
endereo a quem ele fez uma requisio.
4
44
Um problema aparente desta soluo com o protocolo ARP, este protocolo tem
a funo de encontrar um endereo MAC de uma interface em uma rede, informando
qual o endereo IP da interface que se deseja a informao. No caso da tcnica via DR
isto representa um problema por conta de todos os hosts da LAN compartilharem um
mesmo IP, podendo ocasionar problemas na rede. Para resolver a situao necessrio
que o sistema operacional hospedeiro dos hosts possibilite a desabilitao do protocolo
ARP nas interfaces de loopback.
Especificaes
Rede
Quantidade
Rota padro
Via NAT
Via tunelamento IP
Qualquer
Protocolo e
Tnel configurado
LAN
Baixo (10 a 20)
Balanceador de carga
LAN/WAN
Alto (aprx. 100)
Roteador da rede
45
tempo de execuo. J um algoritimo dinmico possui poucas ou nenhuma informao sobre os indivduos, todo a deciso de escalonamento ser realizado em tempo
de execuo;
Cooperativo vs. No-cooperativo: Em um algoritmo no-cooperativo os indivduos
realizam suas tarefas independente dos outros indivduos do sistema, j em um
cooperativo um indivduo pode alterar a forma de realizao de sua tarefa devido
a uma possvel cooperao com outro indivduo (neste caso os indivduos realmente
se conhecem).
Adaptvel vs. No-adaptvel: Em uma soluo adaptvel a forma de escalonamento
da carga de trabalho poder ser modificada em tempo de execuo, isso ocorre
principalmente devido a anlise de um comportamento anterior do sistema, onde
se descobre que uma possvel alterao no escalonamento pode aumentar o desempenho do sistema. J em um no-adaptvel no existe modificao na forma de
escalonamento em tempo de execuo.
Foram omitidas algumas outras categorias dessa taxonomia, pois as selecionadas
so a que tem maior importncia quando se trata especificamente do balanceamento de
carga em servidores. A seguir sero descritos um total de cinco algoritmos de balanceamento de carga de servidores, trs estticos e dois dinmicos.
a) Round-robin e Aleatrio
um dos mais antigos algoritmos na rea da computao, aplicado originalmente em escalonamento de processos. No balanceamento de carga de servidores foi
originalmente aplicado no DNS round-robin (como explicado na seo 2.4.2). um algoritmo esttico, no-cooperativo e no-adaptvel que consiste em uma simples tcnica que distribui de forma homognea as requisies aos servidores que foram previamente ordenados, similar a um sentido horrio. Este algoritmo trata todos os servidores de forma igualitria, somo se tivessem a mesma configurao de hardware, no
diferenciado-os, caso isso seja a realidade do cluster este algoritmo tende a trabalhar bem
(MADHURAVANI; SUMALATHA; SHANMUKHI, 2012).
Um cenrio explicativo desta situao a seguir: Existem trs servidores (S1, S2
e S3) e foram enviadas em sequncia quatro requisies (R1, R2, R3 e R4) ao sistema,
usando o algoritmo round-robin, R1 seria destinado ao S1, R2 ao S2, R3 ao S3 e R4 ao
S1.
A nica diferena do algoritmo round-robin com o aleatrio que ao invs da
requisio ser distribuda seguindo a ordem dos servidores (1, 2, 3, ..., n), ela distribuda
de forma aleatria, mas sem atribuio de duas requisies ao mesmo servidor antes que
um ciclo completo de requisies tenha sido distribudo aos outros servidores.
46
b) Ratio
O algoritmo ratio, tambm chamado de round-robin com pesos em algumas solues de balanceamento de carga, outro algoritimo esttico, no-cooperativo e noadaptvel. O round-robin tradicional aconselhado para clusters com servidores homogneos, mas isso nem sempre a realidade de uma organizao, podendo existir servidores
mais antigos e com configurao mais bsica atuando em conjunto com servidores mais
novos com maior poder computacional, nestes casos o round-robin tradicional pode sobrecarregar alguns servidores enquanto outros esto ociosos (JAYASWAL, 2006, p. 224).
O algoritmo ratio indicado para clusters com servidores heterogneos, onde so
distribudos pesos entre eles, os que tiverem maior poder computacional possuem maior
peso e os com menor poder um peso menor. Um cenrio explicativo poderia ser o seguinte:
Quatro servidores reais (S1, S2, S3 e S4) com os pesos 10, 5, 5 e 7, respectivamente. Com
a soma dos pesos sendo 27, para o servidor S1 seriam direcionadas 37% das requisies,
para o S2 e S3 aproximadamente 18% cada, j pro S4 cerca de 26% das requisies.
c) Menos conexes
Como explicado anteriormente, os algoritmos estticos tem o seu comportamento
determinado previamente, no possuindo mudanas em tempo de execuo. J os algoritmos dinmicos podem tomar as decises baseadas em novas informaes do sistema
(MADHURAVANI; SUMALATHA; SHANMUKHI, 2012), estas podendo ser coletadas
via monitoramento dos servidores ou via anlise de informaes mantidas pelo prprio
balanceador.
Uma informao que o balanceador pode e deve armazenar o nmero de conexes
que cada servidor real esta processando. Uma conexo aqui pode ser tratada como o
processamento de requisies de um nico cliente, por exemplo, caso um servidor real
esteja tratando 10 requisies, sendo que duas destas pertencem a um mesmo cliente, o
servidor possu um total de 9 conexes ento. A partir do nmero de conexes de cada
servidor real, o balanceador poder dirigir as novas requisies ao servidor com o menor
nmero de conexes no momento (JAYASWAL, 2006, p. 224). Este algoritmo chamado
de Menos conexes, ele um algoritmo dinmico, no-cooperativo e adaptvel.
d) Menor latncia
Outro algoritmo dinmico, no-cooperativo e adaptvel, o Menor latncia,
semelhante a estratgia do ultimo algoritmo apresentado, onde tomada a deciso de
balanceamento em cima de informaes do sistema, s que neste caso ela coletada a
partir do monitoramento do cluster. A latncia (i.e. ping), a quantidade de tempo que
um dispositivo de rede deve esperar pela resposta de outro (JAYASWAL, 2006, p. 131).
Em um perodo de tempo pr-determinado feita a coleta do tempo de resposta destes
servidores, onde normalmente se utiliza o protocolo ICPM para tal. Os servidores com
47
Para implementar esta redundncia em balanceadores de cargas de servidores, existem dois cenrios tpicos que sero descritos a seguir. O cenrio mais comum de redundncia o cenrio ativo-standby, onde existem dois servidores (instncias) de balanceador de
cargas, uma sendo o servidor primrio, e outro o servidor secundrio, tambm chamado
5
6
7
8
48
49
servidores devem possuir alguma poltica de configurao do VIP, j que existiro duas
instncias do balanceador de carga trabalhando paralelamente.
51
4 Projeto arquitetural
Este captulo e o captulo posterior (5) tem uma grande importncia para este
trabalho, sero nestes captulos que sero descritas as estratgias que foram desenvolvidas
pelo autor para a soluo que ser implementada posteriormente. Para construo do
conhecimento abordado a seguir, foi necessria a pesquisa prvia de todo o referencial
terico em que este trabalho foi baseado (captulos 2 e 3).
Especificamente neste captulo ser tratada a arquitetura do software proposto,
ser descrito um modelo conceitual que facilitar a transio dos requisitos de um balanceador de carga para a sua implementao, ou seja, servir como um guia para o futuro
TCC 2 do autor. A arquitetura de software uma das subreas de conhecimento da engenharia de software de acordo com SWEBOK1 (Software Engineering Body of Knowledge).
A arquitetura em grosso modo pode ser descrita como a subdiviso de um todo em
partes, estabelecendo relaes especficas entre as partes. Garlan e Shaw (1994) definem
a motivao da arquitetura de software como:
Conforme o tamanho e a complexidade de sistemas de software aumentam, o problema de design vai alm dos algoritmos e das estruturas de
dados da computao. A projeo e a especificao da estrutura geral do
sistema emergem como um novo tipo de problema. As questes estruturais incluem organizao total e estrutura de controle global; protocolos
de comunicao, sincronizao e acesso a dados; atribuio de funcionalidade a elementos de design; distribuio fsica; composio de elementos
de design; escalonamento e desempenho; e seleo entre as alternativas
de design.
Arquitetura de software est contida dentro de uma outra rea de conhecimento mais genrica que
a de design de software: <http://www.computer.org/portal/web/swebok>
52
53
genrico que no faa distino do tipo de aplicao, ficando tambm descartada a soluo
na camada 7.
Ficaram como opes as camadas 3 e 4 do modelo OSI para atuao. Depois de
uma anlise de vantagens e desvantagens de atuao nestas duas, foi escolhida a camada
4, a seguir as justificativas:
O protocolo IP, que o principal protocolo da camada 3 no orientado a conexo,
o que significa que este protocolo tem uma baixa confiabilidade.
O protocolo TCP, um dos principais protocolos da camada 4, categorizado como
orientado a conexo e fornece um stream confivel de dados. Isso significa que uma
conexo prvia estabelecida entre os hosts comunicantes (handshake de trs vias),
e para cada segmento de dados enviado existe uma resposta de reconhecimento
(ACK), que afirma que o segmento chegou ao seu destino. Ao final tambm existe
um momento de finalizao da conexo. A Figura 10 explica esse processo de comunicao.
O protocolo TCP oferece um mecanismo de preveno de entrada de dados duplicados, porque cada segmento possui um campo SEQUENCE NUMBER e outro ACKNOWLEDGEMENT
NUMBER, o primeiro nmero identifica o segmento e o segundo nmero serve como
um indicador do que o remetente espera como SEQUENCE NUMBER da resposta, oferecendo um maior controle dos pacotes recebidos (COMER, 2013, p. 211).
Os protocolos da camada 4 de rede esto relacionados a portas, o que os remete
a comunicao entre aplicaes de dois hosts. Isso facilita a preveno o envio de
54
Lista
de
portas
padro
Lista_de_portas_de_protocolos>
por
protocolo:
<http://pt.wikipedia.org/wiki/Anexo:
55
Bibliotecas como STL e Boost do C++ trazem abstraes que podem dificultar a
depurao de um mdulo, alm de trazerem falhas que podem ser catastrficas em
um mdulo do kernel;
possvel simular a orientao a objetos na linguagem C, fazendo uso de structs e
ponteiros para funo, melhorando a modularidade do cdigo sem trazer os malefcios citados anteriormente.
Resumindo, o desenvolvimento em C mais propcio pelo programador ter maior
controle das funes do sistema (principalmente nas alocaes dinmicas de memria), o
que na teoria reduz os problemas com estabilidade do cdigo, pois necessrio lembrarse que uma falha em um programa que atua no modo kernel de CPU pode fazer todo o
sistema operacional entrar em colapso. Por conta destes fatores o mdulo ser desenvolvido
usando a linguagem C.
J o aplicativo com fins de administrao do sistema no possu essa necessidade
eminente de ser desenvolvido em C, pelo fato de atuar modo usurio de CPU. Ento foi
ponderado, analisado e acertado que ser utilizada a linguagem de programao Python
para sua implementao, a seguir algumas justificativas:
O interpretador Python vem nativamente instalado em grande parte das distribuies Linux (e.g. Ubuntu, Debian e Fedora), contendo vrias funcionalidades da
prpria distribuio implementadas em Python;
A linguagem Python a 8a mais utilizada do mundo, de acordo com dados de maio de
2014 (TIOBE SOFTWARE, 2014). Este sucesso se faz por conta de vrios benefcios
que a linguagem oferece: Possui uma sintaxe de fcil compreenso e aprendizado, tem
estruturas de dados que facilitam o desenvolvimento (e.g. listas, tuplas e dicionrios)
e uma linguagem de alto nvel, interpretada, imperativa, orientada a objetos,
funcional, de tipagem dinmica e forte;
Por conta da sua vasta comunidade de usurios, existem diversas bibliotecas e frameworks desenvolvidos e distribudos sob licenas livres para os mais diversos domnios de conhecimento (e.g. fsica aplicada, jogos de computadores e computao
grfica);
O autor do trabalho tem experincia com a linguagem devido a trabalhos acadmicos
anteriores que foram desenvolvidos utilizando Python, tendo maior preferencia no
desenvolvimento fazendo o seu uso.
d) Retorno de trfego
56
A tcnica de retorno de trfego via NAT de longe a mais simples de ser implementada, por conta de no exigir qualquer configurao adicional nos servidores do sistema,
tanto o balanceador quanto os servidores reais que iro desempenhar o processamento das
requisies. Mas ela possu uma grande desvantagem de necessitar que o as respostas dos
servidores reais passem de volta pelo balanceador, o que o torna um gargalo, diminuindo
o desempenho do sistema como um todo.
As tcnicas de retorno de trfego via DR e via tunelamento IP necessitam de um
esforo de configurao adicional do balanceador e servidores reais como j foi descrito
nas sees 3.2.2 e 3.2.3. A tcnica via tunelamento oferece a capacidade o envio de carga
de trabalho at para servidores reais que no se encontram na rede, diferentemente do DR
que necessita que todos os hosts estejam na mesma LAN, mas comparando com a tcnica
via DR, esta oferece maior desempenho por no ter o overhead de desencapsulamento dos
pacotes que o tunelamento oferece. A tcnica via DR oferece uma maior complexidade de
implementao, pois alm do balanceador de carga ter que acessar os pacotes relacionados
a sua camada de rede de atuao (e.g. Segmento TCP), ele ainda precisa acessar os quadros
ethernet da LAN para direcionar a carga de trabalho ao cluster de servidores.
Por motivos de simplicidade, a tcnica via NAT ser utilizada, pois mesmo tendo
um menor desempenho relacionado as outras duas, ela elimina uma srie de fatores que
aumentam a complexidade do projeto, que podem eventualmente at arriscar a viabilidade
do trabalho.
e) Algoritmos de escalonamento
Inicialmente iro ficar definidos dois algoritmos a serem implementados, um da
categoria de algoritmos de escalonamento estticos e outro da categoria de algoritmos
dinmicos. O algoritmo esttico a ser implementado ser o round-robin, que apesar de
sua simplicidade tende a ter bons resultados em um cluster heterogneo com aplicaes
de propsito especfico (MADHURAVANI; SUMALATHA; SHANMUKHI, 2012). O algoritmo dinmico escolhido foi o menor latncia, que consegue identificar servidores
reais menos sobrecarregados pelo seu tempo de resposta dos seus servios.
f) Forma de redundncia
Parte do esforo deste trabalho se destina ao projeto de integrao do balanceador
de cargas com o software fornecido pelo professor orientador deste trabalho, o Application
Manager. Este software implementado na linguagem Java um gerenciador de mltiplas
aplicaes em cenrio ativo-standby, destinado a ambientes com mltiplos hosts distribudos (LARANJEIRA, 2011). Por intermdio dele uma mesma aplicao (e.g. servidor
web, servidor de arquivos, etc) pode possuir duas instncias, uma ativa em um host de
uma rede, a outra inativa (em standby) em outro host da mesma rede, e elas podem ser
gerenciadas via um utilitrio de linha de comando (amcli). Em caso de um colapso da
57
aplicao ativa, a outra que estava inativa seria iniciada para exercer as mesmas funes
da aplicao que falhou.
Por conta deste objetivo especfico de pesquisa e desenvolvimento pr-definido, o
nico cenrio de redundncia utilizado neste trabalho ser o ativo-standby.
<http://pt.wikipedia.org/wiki/Diagrama_de_pacotes>
58
O componente slbcli (Server Load Balancer CLI ) ser um programa do tipo CLI
(Command Line Interface). Ele contm uma srie de funcionalidades administrativas do
servio que podero ser acessadas via o interpretador de comandos do Linux (Shell).
Este programa ser a interface do balanceador de cargas com o usurio administrador do
sistema, onde ser possvel iniciar, parar e configurar o balanceador de carga.
A seguir exemplos de possveis de comandos:
# slbcli --load : Carrega o mdulo do balanceador no kernel. Por padro, antes de efetuar
a carga do mdulo, sero lidos e aplicados os itens do arquivo padro de configurao
# slbcli --unload : Descarrega o mdulo do balanceador do kernel
# slbcli --reload : Recarrega o mdulo do balanceador no kernel. Por padro, antes de efetuar a carga do mdulo, sero lidos e aplicados os itens do arquivo padro de configurao
# slbcli --load-noconf : Carrega o mdulo do balanceador no kernel, ignorando o arquivo
padro de configurao
# slbcli --reload-noconf : Rearrega o mdulo do balanceador no kernel, ignorando o arquivo padro de configurao
# slbcli --restore conf_file.conf : Carrega as configuraes que esto contidas no arquivo conf_file.conf
# slbcli --bind 172.17.60.201:80 : Atribui um endereo VIP 172.17.60.201 ao balanceador, juntamente com a porta 80 que ele ir atender
# slbcli --alg RR : Seleciona o algortimo de balanceamento de carga round-robin para ser
utilizado
# slbcli --add 192.168.0.1:80 : Adiciona um servidor real com IP 192.168.0.1 ao cluster
de servidores, podendo receber requisies na porta 80
# slbcli --rm 192.168.0.1:80 : Remove um servidor real com IP 192.168.0.1
# slbcli --lconn : Lista todas as conexes atualmente ativas
# slbcli --lserv : Lista os servidores reais do cluster e os seus respectivos status (e.g. UP e
DOWN)
# slbcli --lconf : Lista toda a configurao do sistema
# slbcli --clearconf : Limpa toda a configurao j feita, inclusive exclui todos os itens do
arquivo de configurao padro
59
60
61
<http://pt.wikipedia.org/wiki/M%C3%A1quina_de_estados_finitos>
62
Novo estado
Evento
OFFLINE
INIT
INIT
INIT
STANDBY
MAINT.
STANDBY
Todos
Todos
INIT
STANDBY
ACTIVE
MAINT.
MAINT.
STANDBY
ACTIVE
FAILED
OFFLINE
Aplicao iniciada
Aplicao inicializada, configurao BACKUP e aplicao dual em ACTIVE
Aplicao inicializada, configurao PRIMARY e aplicao dual no em ACTIVE
Aplicao inicializada e configurao INHIBITED
Comando TEST
Comando UNTEST
Falha do aplicao, dual ACTIVE ou comando SWITCH
Falha da aplicao
Comando SHUTDOWN ou SHUTDOWN-F
uma comunicao local com ela. Para isso a aplicao gerenciada deve implementar uma
interface com o mecanismo de identificao das mensagens de troca de estados, e tambm
um mecanismo para informar que est ativa.
k) amcli
O subcomponente amcli (Application Manager CLI ), um programa do tipo CLI.
Este o responsvel por interagir com o administrador do sistema, aceitando uma grande
gama de comandos para alteraes nos estados das aplicaes gerenciadas ou configurar
o prprio Application Manager.Uma lista completa dos comando est no Apndice A.
l) heartbeat
Programa do tipo daemon que possui uma instncia por host do Application Manager. Eles implementam um protocolo de comunicao heartbeat para verificao das
atividades do seu par, caso no consiga estabelecer a comunicao.
<http://pt.wikipedia.org/wiki/Diagrama_de_instala%C3%A7%C3%A3o>
63
64
Um socket uma API (Application Programming Interface) oriunda de sistemas BSD Unix para
comunicao entre aplicativos sobre a pilha TCP/IP, normalmente baseado em TCP (Stream) ou
UDP (Datagrama).
65
Balancer e outra no Secondary Load Balancer, onde so enviados e processados comandos que normalmente so solicitados pelo administrador do sistema ou enviados
automaticamente ao ocorrer um processo de failover, sendo necessrio iniciar o slbd
no Secondary Load Balancer. (iii) A associao entre o slbcli e o slbd representa
uma comunicao interna do servidor, onde so repassadas comandos inseridos por
um usurio para o daemon slbd, j que o mesmo no possui interao direta com o
usurio.
UDP Socket: Essa comunicao ocorre entre os componentes heartbeat do Application
Manager no Primary Load Balancer e no Secondary Load Balancer, sendo uma
implementao de uma comunicao heartbeat.
66
Confiabilidade
Requisito: O sistema dever reconhecer hosts com defeito no cluster de servidores
e remov-los do cluster enquanto no voltarem a normalidade.
Suporte da arquitetura: O componente slbcore faz essa verificao via envio e
receptao de pacotes ICMP e TCP SYN / SYNACK.
Disponibilidade
Requisito: O sistema de balanceamento de carga dever ser capaz de oferecer seu
servio 24h por dia e 7 dias por semana.
Suporte da arquitetura: A soluo de balanceamento de carga oferece a tolerncia a falhas, o que determina meios de ter uma alta disponibilidade.
Escalabilidade
Requisito: O sistema dever suportar a insero e remoo de servidores do cluster
sem a interrupo do servio.
Suporte da arquitetura: O slbcli possibilitar a insero e remoo de forma
simples.
67
68
Uma RFC um documento oficial que define o padro de um protocolo de rede. A grande maioria
69
Dentro desses tipos existem trs que interessam ao caso, ICMP_ECHO, ICMP_ECHOREPLY e
ICMP_DEST_UNREACH.
Para checagem da existncia de um host em uma rede, pode ser preparado um
pacote ICMP do tipo ICMP_ECHO e envi-lo ao host desejado, caso o host receba o pacote
ele ir retornar um ICMP_ECHOREPLY, o tempo entre essas duas aes define a latncia.
Caso o host no esteja acessvel um ICMP_DEST_UNREACH gerado.
Existem pacotes de rede que so gerados de forma programtica por um programa,
ou seja, no so gerados da forma natural que o sistema operacional lida com a pilha
TCP/IP, esses pacotes so chamados de raw packets. O cabealho e o payload desses
pacotes so montados de forma manual, o que requer grande cuidado em sua montagem
para que ele seja descartado pelo destinatrio ao serem feitas suas validaes.
Para monitorar cada servidor real dever ser gerado um raw packet ICMP do
tipo ICMP_ECHO, depois deve ser gerado um raw packet IP e encapsular o pacote ICMP
dentro do seu payload, para s ento enviar para o dispositivo de rede responsvel (e.g.
eth0). Quando forem recebidos pacotes IP de resposta, devem ser verificados se o campo
protocol do seu cabealho (campo que determina qual protocolo est contido no payload,
e.g. TCP, UDP, ICMP, IGMP, etc) indica que ele contm carrega um pacote ICMP, depois
deve ser desencapsulado o pacote ICMP e ento verificado se o seu campo type indica
um ICMP_ECHOREPLY.
O cdigo no Quadro 1 contm algumas partes de um cdigo que realiza o envio
de um ICMP_ECHO. J o cdigo no Quadro 2 contm algumas partes de um cdigo que
realiza a verificao do ICMP_ECHOREPLY.
Deve se salientar que os dois exemplos anteriores so apenas partes de cdigos
que implementam as funcionalidades. Uma importante estrutura de dados para redes em
Linux foi utilizada nestes exemplos, o sk_buff. De acordo com Benvenuti (2005, p. 23),
esta estrutura utilizada por vrias camadas de rede (MAC ou outra protocolo de enlace
da camada 2, IP na camada 3, TCP ou UDP na camada 4), e vrias outros campos da
estrutura se modificam de acordo com que so passados de uma camada a outra. Nesta
estrutura so inseridos os cabealhos dos diversos protocolos que ela trafega, ao final do
caminho na pilha (camada 1) existir uma estrutura sk_buff com diversos cabealhos
de protocolos, acessveis por intermdio de funes como ip_header = ip_hdr(skb),
acrescentado dos dados que se deseja transmitir (e.g. texto, vdeo, udio, etc).
Algo semelhante ocorre no monitoramento da latncia dos servidores, mas neste
caso feita a verificao da latncia dos servios e no a latncia na comunicao entre os
hosts, como pode ocorre no mtodo anterior. Para verificar a velocidade de resposta de um
servio, pode ser utilizado parte do handshake de trs vias que ocorre no estabelecimento
dos protocolos possui uma RFC associada.
70
// ...
icmp . type = I C M P _ E C H O; // Define um ECHO para o ICMP
ip . p r o t o c o l = I P P R O T O _ I C M P ; // Define que o p r o t o c o l o sera ICMP
ip . daddr = i n e t _ a d d r( " 1 0 . 1 0 . 1 0 . 2 " ) ; // Define o end . do d e s t i n a r a r i o
// ...
// R e s e r v a uma e s t r u t u r a " struct s k _ b u f f" no t a m a n h o de um frame
ethernet
struct s k _ b u f f * skb = d e v _ a l l o c _ s k b (1500) ;
skb - > dev = _ _ d e v _ g e t _ b y _ n a m e ( net , " eth0 " ) ; // Define o device de saida
// ...
// C o n f i g u r a o c a b e c a l h o da camada de t r a n s p o r t e ( ICMP )
skb - > t r a n s p o r t _ h e a d e r = s k b _ p u s h( skb , sizeof ( icmp ) ) ;
memset ( skb - > t r a n s p o r t _h ead er ,0 , sizeof ( struct i c m p h d r) ) ;
memcpy ( skb - > t r a n s p o r t _h ead er ,& icmp , sizeof ( struct i c m p h d r) ) ;
// ...
// C o n f i g u r a o c a b e c a l h o da camada de rede ( IP )
skb - > n e t w o r k _ h e a d e r = s k b _ p u s h( skb , sizeof ( ip ) ) ;
memset ( skb - > n e t w o r k _h eade r ,0 , sizeof ( struct iphdr ) ) ;
memcpy ( skb - > n e t w o r k _h eade r ,& ip , sizeof ( struct iphdr ) ) ;
// ...
d e v _ q u e u e _ x m i t ( skb ) ; // D e s p a c h a o s k _ b u f f
kfree ( skb ) ;
// ...
if ( skb == NULL )
return -1;
iph = ip_hdr ( skb ) ; // Pega o c a b e c a l h o IP
// ...
// V e r i f i c a se o " p r o t o c o l" eh mesmo o ICMP
if ( iph - > p r o t o c o l == I P P R O T O _ I C M P ) {
icmph = i c m p _ h d r( skb ) ; // Pega o c a b e c a l h o ICMP
if ( icmph - > type == I C M P _ E C H O R E P L Y ) { // eh um ECHO REPLY ?
// S e r v i d o r esta a c e s s i v e l entao
} else if ( icmph - > type == I C M P _ D E S T _ U N R E A C H ) { // eh um DEST .
U N R E A C H A B L E?
// S e r v i d o r esta inacessivel , deve ser r e m o v i d o t e m p o r a r i a m e n t e do
c l u s t e r de tempos em tempos sera v e r i f i c a d o o seu r e t o r n o ...
}
}
de uma conexo TCP. Pode ser criar um raw packet de um segmento TCP com a flag do
tipo SYN ativada (bit = 1), e ento envi-lo ao servidor e esperar como resposta um
TCP segmento TCP com as flags SYN e ACK ativadas, a diferena de tempo entre esses
dois eventos indica a latncia do servio (KOPPARAPU, 2002, p. 30). Caso o servio
seja baseado em UDP, por exemplo, essa tcnica no surtir efeito j que o protocolo
no possui segmentos de reconhecimento (ACK), podendo como alternativa ser verificada
71
O protocolo SSH prov a estrutura para conexo remota entre hosts: <http://pt.wikipedia.org/wiki/
SSH>
<https://pypi.python.org/pypi/scp>
72
import scp
import p a r a m i k o
# Cria o c l i e n t e SSH
def c r e a t e S S H C l i e n t ( server , port , user , p a s s w o r d) :
client = p a r a m i k o. S S H C l i e n t ()
client . l o a d _ s y s t e m _ h o s t _ k e y s ()
client . s e t _ m i s s i n g _ h o s t _ k e y _ p o l i c y ( p a r a m i k o. A u t o A d d P o l i c y () )
client . c o n n e c t( server , port , user , p a s s w o r d)
return client
# C o n e c t a com o s e r v i d o r
s s h _ c l i e n t e = c r e a t e S S H C l i e n t ( " 1 0 . 1 0 . 1 0 . 2" , 22 , " root " , " passwd " )
s c p _ c l i e n t e = scp . S C P C l i e n t( s s h _ c l i e n t e . g e t _ t r a n s p o r t () )
# Transfere o arquivo
s c p _ c l i e n t e . put ( files =[ " / etc / slb / s l b c o n f. conf " ] , r e m o t e _ p a t h = " / etc / slb /
s l b c o n f. conf " , r e c u r s i v e= False , p r e s e r v e _ t i m e s = False )
73
5
6
74
23
case A D D _ S E R V E R :
c o p y _ f r o m _ u s e r ( buf , ( char *) arg , len ) ;
// Aqui deve se a d i c i o n a r o s e r v i d o r a lista de servidores , seu
IP : Porta e s t a r a o na v a r i a v e l " buf "
break ;
d e f a u l t:
return - ENOTTY ;
}
return len ;
24
25
26
27
28
29
30
31
32
75
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
O IP verso 4 a verso do protocolo IP mais utilizada atualmente na internet. Mas a verso 6 (IPv6)
aos poucos vem crescendo e tende a substituir o IPv4 por conta dos seus benefcios.
76
ter acesso a todas as conexes devero ser acessadas todas as listas de conexes por
servio (uma lista de listas).
Como um esboo de representao dessas estruturas na linguagem de programao
a ser utilizada, o Quadro 6 define um esboo de uma lista com possveis structs C que
sero utilizadas.
Quadro 6 Cdigo fonte C: Structs para o slbcore
1
2
3
4
5
// R e p r e s e n t a uma c o n e x a o
t y p e d e f struct {
u i n t 3 2 _ t c l i e n t _ i p 4 ; // IP do c l i e n t e
u i n t 1 6 _ t c l i e n t _ p o r t ; // Porta do c l i e n t e
} conn ;
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
// R e p r e s e n t a todos os s e r v i d o r e s reais
t y p e d e f struct {
server * s e r v e r s; // Lista de s e r v i d o r e s reais
u i n t 1 6 _ t s e r v e r s _ c o u n t ; // Q u a n t i d a d e de s e r v i d o r e s reais
} server_table;
// R e p r e s e n t a todos as c o n e x o e s
t y p e d e f struct {
c o n n _ l i s t ** c o n n _ l i s t s _ l i s t ; // Uma lista de listas de c o n e x o e s
u i n t 1 6 _ t c o n n _ l i s t s _ l i s t _ c o u n t ; // Q u a n t i d a d e de listas de c o n e x o e s
} c o n n _ t a b l e;
Essas estruturas servem somente como esboo para demonstrao dos dados que
devero ser mantidos e manipulados. Uma real implementao iria requerer o uso de estruturas de dados auxiliares mais complexas, como listas ligadas, tabelas hash e vetores,
77
fazendo escolhas de qual usar de acordo com as necessidades de uso dos dados, por exemplo, caso existam remoes constante de elementos de uma estrutura, recomendado o
uso de listas ligadas ao invs de vetores, ou se existe uma iterao contgua constante sobre
elementos de uma estrutura, recomendado o uso de vetores ao invs de listas ligadas.
Alm do problema da escolha das estruturas auxiliares, tambm ser necessrio
estabelecer uma forte poltica de alocao e desalocao de memria para as estruturas,
pois algumas delas teriam referencias cruzadas (e.g. Servidor tem uma lista de servios,
servio tem uma lista de conexes, conexo est associada a um servidor), uma desalocao de memria poderia levar uma outra estrutura que tinha referncia a ela agora
referenciar uma rea de memria indevida, podendo levar a falhas de segmentao. Uma
m desalocao de memria tambm poderia resultar em vazamentos de memria, que
so reas da memria devidamente alocadas, mas que no possuem atualmente nenhuma
referncia a ela, ou seja, a rea fica reservada e inutilizvel (LEVY, 1996).
78
ao chegar uma nova requisio de um cliente, deve ser verificado se ele j possui uma
recente conexo estabelecida com algum servidor (acessado via a tabela de conexes),
caso ele possua alguma a requisio ser enviada ao servidor em questo, caso no possua
a requisio ser enviada a algum servidor selecionado pelo algoritmo de escalonamento.
Infelizmente o mtodo de persistncia baseado em IP no infalvel, Kopparapu
(2002, p. 58) descreve o problema deste mtodo com proxies de rede. Um proxy um servidor que atua como intermedirio de um grupo de usurios a uma rede externa para melhorar a segurana (firewall) e desempenho (caching). Este grupo de usurios ao fazerem
requisies a uma rede externa so representados externamente pelo proxy, consequentemente este ir fazer um processo de NAT para que as requisies tenham como remetente
o seu endereo. Caso usurios de um mesmo proxy faam requisies ao servio de balanceamento de carga, todos os n usurios tero o mesmo IP de remetente (o IP do proxy
que os representa), o que poder sobrecarregar um servidor real, que receber um grande
nmero de requisies de diferentes usurios por causa da persistncia de sesso. Existem
alguns meios de contornar parte deste problema, mas devido as suas complexidades de
implementao eles no sero trabalhados neste projeto.
79
NF_STOLEN: O pacote dever ser esquecido pelo netfilter, o responsvel pelo seu
destino agora ser do prprio mdulo.;
NF_QUEUE: O pacote deve ser enfileirado para uso de aplicativos no modo usurio
de CPU;
NF_REPEAT: Esse hook com este mesmo pacote em questo dever ser chamado
novamente.
Para registrar um hook necessrio informar alguns dados ao framework netfilter,
estes dados so passados via a struct nf_hook_ops, que possui o formato do cdigo no
Quadro 7.
Quadro 7 Cdigo fonte C: Struct de cofigurao de um hook
1
2
3
4
5
6
7
8
struct n f _ h o o k _ o p s
{
struct l i s t _ h e a d list ; // Nao deve ser p r e e n c h i d o
n f _ h o o k f n * hook ; // P o n t e i r o para a funcao que ira r e g i s t r a r o hook
int pf ; // A f a m i l i a do p r o t o c o l o de rede
int h o o k n u m; // O i d e n t i f i c a d o r do tipo de hook
int p r i o r i t y; // P r i o r i d a d e do hook
};
Cada um dos campos sero explicados para melhor entendimento do funcionamento do netfilter. O primeiro campo hook um ponteiro para uma funo implementada
no prprio mdulo do kernel, ela ser a funo de callback que ir receber os pacotes
de rede. O netfilter define um prottipo para essa funo com o formato do cdigo no
Quadro 8.
Quadro 8 Cdigo fonte C: Prottipo de funo para registrar um hook
1
2
3
4
5
80
in: Ponteiro para a estrutura que representa a interface de rede em que o pacote chegou ao
host (e.g eth0). Vlido para pacotes que acabaram de chegar, seno far referncia
a NULLl;
out: Ponteiro para a estrutura que representa a interface de rede em que o pacote ser
destinado para sair do host (e.g eth0), o que foi definido aps roteamento do mesmo.
Vlido para pacotes que esto para sair, seno far referncia a NULL;
okfn: Ponteiro para uma funo que ser invocada caso todas as funes de callback
registradas ao hook em questo retornem NF_ACCEPT.
Dentro da funo hook_function_name que poder ser feita a manipulao e filtragem dos pacotes de rede. O prximo campo da estrutura principal o pf, que faz
uma simples referncia a famlia do protocolo que est sendo trabalhado, PF_INET para
IPv4 e PF_INET6 para IPv6, no caso do slbcore o pf ser a princpio PF_INET. O prximo
campo o hooknum, este um dos mais importantes pois define qual tipo de hook ser
trabalhada na funo de callback, definindo em que ponto da travessia de rede o pacote
ficar acessvel. A Figura 16 define os cinco hooks acessveis da travessia. A descrio de
cada hook e cada evento da travessia vir a seguir.
81
82
// Funcao que r e a l i z a o b a l a n c e a m e n t o
int p r o c e s s _ s e g m e n t ( struct s k _ b u f f * skb ) {
// V e r i f i c a se eh o pacote eh valido
if (! skb ) return N F _ A C C E P T ;
if (!( skb - > nh . iph ) ) return N F _ A C C E P T ;
struct tcphdr * tcp = NULL ;
struct iphdr * iph = NULL ;
iphdr = ip_hdr ( skb ) ;
if ( iph - > p r o t o c o l == I P P R O T O _ T C P) {
tcphdr = t c p _ h d r( skb ) ;
u i n t 1 6 _ t dport = tcphdr - > t h _ d p o r t;
// ...
// V e r i f i c a se algum s e r v i d o r real contem o s e r v i c o com " dport "
// Se nao e x i s t i r eh dado um " return N F _ D R O P ;"
// ...
// Caso existam , eh feito o e s c a l o n a m e n t o de qual s e r v i d o r sera
o responsavel
u i n t 3 2 _ t r e a l s e r v e r _ i p = s c h e d u l i n g _ a l g o r i t h m () ;
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
}
return N F _ A C C E P T;
}
// Funcao de c a l l b a c k para o hook
static u_int s l b c o r e _ h o o k _ f n ( u_int hooknum ,
struct s k _ b u f f ** skb ,
const struct n e t _ d e v i c e * in ,
const struct n e t _ d e v i c e * out ,
int (* okfn ) ( struct s k _ b u f f *) ) {
// V e r i f i c a se o pacote chega pela i n t e r f a c e do VIP
// se nao vier desta o pacote s e g u i r a o seu c a m i n h o
if ( strcmp ( in - > name , " eth0 " ) != 0) {
return N F _ A C C E P T;
}
return p r o c e s s _ s e g m e n t (* skb ) ;
}
// Funcao de i n i c i a l i z a c a o do modulo
struct n f _ h o o k _ o p s s l b c o r e _ n f h _ o p s ;
static int __init s l b c o r e _ i n i t () {
// C o n f i g u r a o hook
s l b c o r e _ n f h _ o p s . hook = s l b c o r e _ h o o k _ f n ;
slbcore_nfh_ops. hooknum = NF_IP_PRE_ROUTING;
s l b c o r e _ n f h _ o p s . pf = P F _ I N E T;
slbcore_nfh_ops. priority = NF_IP_PRI_FIRST;
// R e g i s t r a o hook
n f _ r e g i s t e r _ h o o k (& s l b c o r e _ n f h _ o p s ) ;
return 0;
}
83
6 Concluso
Por intermdio deste trabalho de concluso de curso foi possvel realizar um estudo
sobre diversas reas da computao que tangem desde redes de computadores, sistemas
operacionais, engenharia de software e outras. Todo este estudo foi necessrio para se
obter maior entendimento sobre ferramentas de balanceamento de carga de servidores,
deste o seu histrico de uso, suas principais funcionalidades, benefcios e sua arquitetura
geral.
Na introduo deste trabalho foi indicada a motivao real da implementao desta
ferramenta, e na concluso deve ser feita uma reafirmao da importncia que este tipo
de produto tem no mundo hoje. O uso de balanceadores de carga uma das formas de
garantia de desempenho, disponibilidade e confiabilidade de servios, e juntamente com
outros tipos de solues forma uma estrutura bsica de uma infraestrutura de TI que visa
oferecer estes servios a um grande nmero de usurios sem pecar com a sua qualidade a
um nvel tcnico.
Para fins de pesquisa e desenvolvimento foi feito o projeto de uma soluo original
de balanceamento de carga, tendo como participantes os presentes autor e orientador deste
trabalho. A soluo proposta conseguiu atingir dois nveis de projeto que iro proporcionar
a base de uma futura implementao, foi atingido um nvel arquitetural, mais genrico
e mais abstrato, onde foram definidos, descritos e relacionados todos os componentes
que iro agregar a soluo de balanceamento de carga, com a viso de sua organizao
lgica e com a viso de sua disposio fsica. Outro nvel de projeto atingido foi um nvel
mais detalhado, mais especfico e concreto, onde foram levantados e descritos importantes
problemas que deveriam ser solucionados para se tornar vivel a futura implementao do
balanceador de carga. Estes resultados alcanados conseguem demonstrar que os objetivos
deste trabalho foram atingidos.
84
Captulo 6. Concluso
Exemplo: 0, 1, 1, 2,
%AAncia_de_Fibonacci>)
3,
5,
8,
13,
21,
...(<http://pt.wikipedia.org/wiki/Sequ%C3
85
Referncias
ATWOOD, J. Understanding User and Kernel Mode. 2008. Blog Coding Horror.
Disponvel em: <http://blog.codinghorror.com/understanding-user-and-kernel-mode/>.
Citado na pgina 30.
BENVENUTI, C. Understanding Linux Network Internals. 1. ed. EUA: OReilly, 2005.
Citado 2 vezes nas pginas 68 e 69.
BOURKE, T. Server Load Balancing. 1. ed. EUA: OReilly, 2001. Citado 5 vezes nas
pginas 25, 35, 37, 39 e 52.
BOVET, D. P.; CESATI, M. Understanding the Linux Kernel. EUA: OReilly, 2000.
Citado 2 vezes nas pginas 25 e 31.
CASAVANT, T. L.; KUHL, J. G. A taxonomy of scheduling in general-purpose
distributed computing systems. Software Engineering, IEEE Transactions, v. 14, n. 2,
1988. Citado na pgina 44.
CISCO SYSTEMS. Cisco ASA 5500 Series Configuration Guide using the CLI. 8.2. ed.
[S.l.], 2010. Cap. 33. Disponvel em: <http://www.cisco.com/c/en/us/td/docs/security/
asa/asa82/configuration/guide/config.html>. Citado na pgina 48.
COMER, D. E. Internetworking with TCP/IP: Principles, Protocol, and Architecture. 6.
ed. New Jersey, EUA: Pearson, 2013. Citado 2 vezes nas pginas 28 e 53.
FREE SOFTWARE FOUNDATION. What is free software? 2014. Verso 1.135.
Disponvel em: <https://www.gnu.org/philosophy/free-sw.en.html>. Citado na pgina
29.
GARLAN, D.; SHAW, M. An introduction to software architecture. Advances in
Software Engineering and Knowledge Engineering, v. 1, 1994. Citado na pgina 51.
HORMAN, S. Linux Virtual Server Tutorial. 2003. Ultra Monkey Project. Disponvel
em: <http://www.ultramonkey.org/papers/lvs_tutorial/html/>. Citado na pgina 54.
IBM RATIONAL SOFTWARE. Rational Unified Process (RUP): Diretrizes de um
Documento de Arquitetura de Software. 2001. Disponvel em: <http://www.wthreex.
com/rup/portugues/process/modguide/md_sad.htm>. Citado 4 vezes nas pginas 51,
57, 62 e 65.
JAYASWAL, K. Administering Data Centers: Servers, Storage, and Voice over IP.
Indianapolis, EUA: Wiley, 2006. Citado 4 vezes nas pginas 25, 46, 47 e 48.
KARIMI, A. et al. A new fuzzy approach for dynamic load balancing algorithm.
International Journal of Computer Science and Information Security (IJCSIS), v. 6,
n. 1, 2009. Citado na pgina 32.
KOPPARAPU, C. Load Balancing Servers, Firewalls, and Caches. New York, EUA:
Wiley, 2002. Citado 6 vezes nas pginas 47, 67, 70, 72, 77 e 78.
86
Referncias
Referncias
87
ZHANG, W. Linux virtual server for scalable network services. National Key Laboratory
of Parallel and Distributed Processing, 2000. The Linux Virtual Server Project. Citado
6 vezes nas pginas 39, 40, 41, 42, 43 e 44.
Apndices
91
92