Version 16 (modified by leonardolopes, 14 anos atrás) (diff)

--

Como fazer balanceamento de carga com Zope/ZEO = em construção

Para que haja uma melhor compreensão do processo do balanceamente de carga com cache feito com Squid, Zeo e Zope, é necessário que coloquemos alguns conceitos e informações em destaque:

  • Cluster - Que na sua forma mais básica um cluster é um sistema que compreende dois ou mais computadores ou sistemas (denominados
    nodos no caso aqui seriam instâncias) na qual trabalham em conjunto para executar aplicações ou realizar outras tarefas, de tal forma para que os usuários que os utilizam tenham a impressão que somente um único sistema responde para eles, criando assim uma ilusão de um recurso único (computador virtual). Este conceito é denominado transparência do sistema. Como características fundamentais para a construção destas plataformas inclui-se elevação da: confiança, distribuição de carga e performance.

  • Balanceamente de Carga - Este modelo distribui o tráfego ou requisições de recursos provenientes das mesmas instâncias (Zopes) que executam os mesmos programas entre as máquinas que compõem o cluster. Todas as instâncias estão responsáveis em controlar os pedidos. Se uma instância falhar, as requisições são redistribuídas entre as outas instâncias disponíveis no momento. Este tipo de solução é normalmente utilizado em fazendas de servidores de web (web farms).
  • Squid - É uma ferramenta (proxy-cache) que alivia a latência da rede. A idéia por trás é de criar um "banco de dados" onde os objetos mais utilizados sejam guardados para os próximos acessos. Isto significa que caso tenhamos 20 acessos ao site ao mesmo tempo, somente uma vai ser realizada na instancia as outras vão ser cacheadas, dando assim uma melhor performance.
  • Zeo - É um sistema que permite rodar um site em mais de um computador, que geralmente é chamado de clustering e balanceador de carga. É bom lembrar que todas as instâncias devem ter os mesmos produtos para que o zeo funcione perfeiamente.
  • É bom deixar claro que é possível fazer isso utilizando somente uma máquina, contudo a configuração que fizemos foi com 4 máquimas (uma que vai rodar squid, outra para rodar o zeo e duas para rodas as instancias zope) .

  • Esta configuração foi feita no ubuntu 5.04 que tem a base de pacotes Debian. A localização de determinados arquivos podem ser encontrados em diferentes locais dependendo do sistema operacional utilizado. No caso do sistema operacional Windows é necessário a instalação do cygwin e nele instalar o squid.

Antes de começar vamos criar uma interface em cada maquina do cluster. Digite no console o seguinte comando.

vi /etc/network/interfaces

Dentro desse arquivo insira as seguintes linhas de comando.

# Interface estatica
auto eth0:0
iface eth0:0 inet static
 address 10.10.10.21
 netmask 255.255.255.0
 network 10.10.10.0
 broadcast 10.10.10.255

Em cada máquina altere o ip de address. Por exemplo:

 address 10.10.10.22
 address 10.10.10.23
 address 10.10.10.24
 address 10.10.10.25

Esta alteração server para que cada maquina tenha um ip diferente. Agora você deve estar se perguntando por que criar estas interfaces? A resposta é bem simples, é para que você trabalhar com ip's fixos e não precisar ficar olhando todo dia quais são os ip's das máquinas em questão.

Depois de termos dado alguns conceitos, informações e a criação da interface, agora vamos começar criando um cluster com o ZEO e ZOPE.

Para criar uma instância ZEO você precisa entrar na sua pasta bin dentro do zope instalado. Por exemplo:

cd /home/usuario/pastazope/bin

Dentro da pasta digite:

./mkzeoinstance /home/usuario/zeo/ 9000

Onde /home/usuario/zeo é o local onde vai ficar sua instância zeo e 9000 será a porta onde o zeo ouviram as requisições. Depois de feito isso, crie as duas instâncias zope. Em seguida faça uma copia de backup do zope.conf.

cp /home/usuario/instanciazope/etc/zope.conf /home/usuario/instanciazope/etc/zope.conf.orig

Agora entre zope.conf de cada instância zope e faça a seguinte alteração. Comente as seguintes linha, que se encontram no final do zope.conf como no exemplo abaixo:

#<zodb_db main>
#    # Main FileStorage database
#    <filestorage>
#      path $INSTANCE/var/Data.fs
#    </filestorage>
#    mount-point /
#</zodb_db>

Em seguida, descomente as seguintes linhas como no exemplo abaixo:

# Other storage examples
#
# ZEO client storage:
#
<zodb_db main>
  mount-point /
  # ZODB cache, in number of objects
  cache-size 5000
  <zeoclient>
    server 10.10.10.100:9000
    storage 1
    name zeostorage
    var $INSTANCE/var
    # ZEO client cache, in bytes
    cache-size 20MB
    # Uncomment to have a persistent disk cache
    #client zeo1
  </zeoclient>
</zodb_db>

Repare na linha server 10.10.10.100:9000, onde você pode ver que 10.10.10.100 é o ip da maquina com a instancia zeo e 9000 é a portal que o zeo está ouvindo as requisições.
Agora inicie suas instancias zope. Crie um pasta em uma das instancias e abra a outra instancia para ver se esta pasta foi criada lá também, se vc conseguir ver a pasta é porque o cluster está funcionando.

Ainda dentro do zope.conf descomente a ICP port como segue abaixo:

<icp-server>
  # valid key is "address"
  address 3132
</icp-server>

Agora instale o squid (No Ubuntu).

sudo apt-get install squid

Em seguida faça uma cópia de backup do squid.conf,

sudo cp /etc/squid/squid.conf /etc/squid/squid.conf.orig

depois entre nele com os seguintes comandos.

sudo gedit /etc/squid/squid.conf

Apague todo o squid.conf e insira as seguintes linhas

http_port 80
icp_port 3130
cache_mem 256 MB
cache_dir ufs /var/spool/squid 1024 16 256

redirect_program /etc/squid/iredir/iRedirector.py
redirect_children 100
redirect_rewrites_host_header off

request_body_max_size 0 KB
cache_mgr leonardolopes@interlegis.gov.br
cache_effective_user proxy

acl QUERY urlpath_regex \?
no_cache deny QUERY

acl all src 0.0.0.0/0.0.0.0
acl in_backendpool dstdomain backendpool
acl manager proto cache_object
acl localhost src 127.0.0.1/255.255.255.255
acl to_localhost dst 127.0.0.0/8
acl CONNECT method CONNECT

cache_peer 10.10.10.23 parent 8080 3132 no-digest no-netdb-exchange round-robin
cache_peer 10.10.10.25 parent 8080 3132 no-digest no-netdb-exchange round-robin
cache_peer_access 10.10.10.23 allow in_backendpool
cache_peer_access 10.10.10.23 deny all
cache_peer_access 10.10.10.25 allow in_backendpool
cache_peer_access 10.10.10.25 deny all

http_access allow manager localhost
http_access deny manager
http_access allow all
never_direct allow all
#http_reply_access allow all
#icp_access allow all

httpd_accel_host virtual
httpd_accel_port 0
httpd_accel_with_proxy on
httpd_accel_uses_host_header on

Veja se as portas HTTP e ICP do cache_peer é a mesma da suas instancias zope. No caso porta HTTP é a 8080 e a porta ICP é a 3132. Observe que é possível usar as mesmas portas para as duas instancias porque elas estão em maquinas diferentes.

Concluido a configuração do squid passemos para o redirecinador de URL. Caso não queria fazer um, existe um pronto no seguinte site: http://longsleep.org/projects/iredir

Ou instale o SquidGuard?(nessa configuração utilizaremos o redirecionador da primeira opção).

Descompacte o arquivo e copie a pasta iredir para /etc/squid/. Depois de feito isso, abra o arquivo redirector_class.py. Dentro do arquivo encontrará as seguintes linhas de comando.

# define sitemap matching regex mapping
sitemap = {

           # (10, '[\S]*plone.org'): 'backendpool/VirtualHostBase/http/$netloc$:80/plone.org/VirtualHostRoot',
           # (20, '[\S]*mydomain.com'):  '127.0.0.1:9065',

          }

Nesta parte do codigo é necessário fazer algumas alterações para que o squid redirecione corretamente o site que criado. veja o exemplo abaixo.

# define sitemap matching regex mapping
sitemap = {

            (10, 'localhost'): 'backendpool/VirtualHostBase/http/$netloc$:80/portal/VirtualHostRoot',
            (11, 'testandoplone'): 'backendpool/VirtualHostBase/http/$netloc$:80/interlegis/VirtualHostRoot',
            (12, 'siteplonedeteste'): 'backendpool/VirtualHostBase/http/$netloc$:80/intranet/VirtualHostRoot',
            
          }

Observe que localhost, testandoplone e siteplonedeteste são as URL que o squid reconhecerá em seu browser, contudo é necessário que esses nomes estejam configuradas dentro de /etc/hosts. E portal, interlegis e intranet são os objetos que serão mandados para o squid faça o cache.

Depois disso abra o seu browser e digite a URL que foi colocada no redirector_class.py. Aparecendo o objetos selecionado, quer dizer que o squid está fazendo o balanceamento das instâncias, para testar se ele está fazendo cache, digite no console.

ab -n 100 -c 4 http://url no redirector_class.py/

Depois faça o mesmo teste, mas dessa vez com a url direto da instancia zope. Normalmente com esta configuração o squid consegue dar em torno de 350 resquests por segundo.

  • Observação
  • Caso a diferença não seje no mínimo o triplo de requests é porque o squid não está fazendo cache. Isso pode ocorrer caso o zope não estija mandando informações para o squid fazer o cache dos objetos, então acrescente na sua instancia zope o produto Accelerated HTTP Cache Manager ou o CacheFu? que pode ser encontrado no plone.org.

MINI-GLOSSÁRIO DAS TAG DO SQUID

http_port – Especifica a porta (ou IP e portal ) que o squid ouvira as requisições.

cache_mem – Especifica a soma ideal de memória que será usada para: In−Transit objects, Hot Objects e Negative−Cached objects. Porém este parâmetro não limita o tamanho máximo do processo que pode se tornar duas, três vezes maiores que isso.

cache_dir no_cache – Esta Tag é usada para proibir o cache de determinados objetos e por padrão o squid previne configurações de caching que tenha URL cgi-bin ou desconhecida. Esta configuração não é muito aconselhável para o uso do squid como um acelerador Zope

hierarchy_stoplist – Esta Tag é usada quando quer consultar as outras caches sobre determinado objeto. No caso de usar o squid como acelerador, ela é inapropriada. Por Default, ela vem da seguinte maneira.

hierarchy_stoplist cgi-bin ?

request_body_max_size – Especifica o tamanho Maximo para uma http request. Caso não queira limite coloque 0 KB.

redirect_program – Todo solução front-end proxy(Squid) envolve um problema de mapeamento das URLs que são pedidas para os backend servers(instancias zope). Para resolver isso o Squid permite que se use um programa ou script externo para que haja a tradução das URLs externas dentro das URLs internas.

redirect_children – Esta tag é usada para ajustar o número de processo redirecionados para gerar. they will use RAM and other system resources.

redirect_rewrites_host_header – Por padrão o Squid reescrevi todos host. Como estamos usando o squid com acelerador não queremos este efeito.

acl – Define uma lista de acesso

http_access – Permite ou proibi acesso http baseado em listas de acesso.

cache_peer – Esta opção do squid é usada para especificar as outras caches em hierarquia. Ela é dividida basicamente em cinco campos. O primeiro campo é o hostname ou IP da cache que esta sendo pedido a informação. No segundo campo indica o relacionamento das caches. O terceiro configura a porta HTTP de destino do servidor, enquanto a quarta configura a porta de consulta ICP(UDP). O quinto campo pode conter várias ou nenhuma keyword. Na forma como estamos trabalhando com o squid colocamos somente as seguintes kewords: no-digest, no-netdb-exchange e round-robin.

cache_peer_access – Esta opção é usada para limitar o dominio para que os neighbor caches serão consultados, utilizando as listas de acesso (acl).

httpd_accel_host – Esta tag é usada para que o squid faça com que o hostname(IP) trabalhe como servidor acelerado.Para que o squid trabalhe como acelerador Zope configure como virtual.

httpd_accel_port – O squid conectará com a porta que o httpd_accel_port que for configurado. Para que faça com que o squid trabalhe como acelerador Zope, configure a porta como 0.

httpd_accel_with_proxy – Para que sua cache funcione como acelerador e como um web cache é necessário que ative esta opção.

httpd_accel_uses_host_header – Esta opção quando ativa deixa um grande furo na segurança,porém para servidores virtuais que requer o host, os header não serão propriadamente para fazer o cache.

Anexos (1)

Download de todos os anexos como .zip

 

The contents and data of this website are published under license:
Creative Commons 4.0 Brasil - Atribuir Fonte - Compartilhar Igual.