25 of novembro de 2009

Nova infraestrutura de servidores Web do Sistema boo-box

Institucional, Notícias Postado por

Quando se trabalha numa empresa como a boo-box, é preciso ter uma equipe capaz de desenvolver soluções tecnológicas extraordinárias, em um espaço de tempo extraordinário.

Nos últimos meses, a boo-box experimentou um crescimento sensacional:

impressions

Como podem ver, o aumento de exibição de publicidade deu um salto de 85% no último mês!
Para aguentarmos o ritmo, os sistemas tiveram que ser revistos e reestruturados.

Antes de uma explicação mais detalhada, vou resumir nossa abordagem: monitore ao máximo, use cache em tudo o que puder, e cuide bem do seu banco de dados :)

Explicando em detalhes

Para se destacar como um player de publicidade online[bb], é preciso seguir alguns princípios:

  1. Velocidade: ninguém vai ficar esperando para ver um anúncio carregar.
  2. Escalabilidade: viralizações, crescimentos acelerados etc. Se sua aplicação não for altamente escalável, melhor mudar de atividade, ou abrir mão de dormir todos os dias :)
  3. Monitoramentos: monitore tudo! E automatize os monitoramentos sempre que possível.
  4. Processos: crie, e siga, processos para os diversos tipos de situações.

Com isso em mente, nossos Ninjas fizeram um refactoring no coração do sistema: na
Camada de Aplicação.

O objetivo era esgotar ao máximo a capacidade das linguagens e plataformas nginx + Ruby + Merb + MySQL, com algoritmos e topologias mais poderosos.

Portanto, mudamos a lógica, sincronicidade e cacheamento de partes-chave. Em comparação com o post anterior “A infraestrutura de servidores Web do Sistema boo-box“, alguns pontos da topologia foram alterados:

infra

Além disso, implementamos metodologias de monitoramento que nos fizeram ter maior controle sobre a aplicação.

Nomes das máquinas e versões de releases

Conforme explicamos no post anterior sobre nossa infraestrutura, nossas máquinas são batizadas em homenagem a personagens do anime Dragon Ball Z[bb], como Korin, Kami, Cell, Raditz, Trunks, Goku, Gohan entre outros.

Ultimamente, começamos também a identificar nossos releases, que levam nomes de filmes clássicos. Os dois primeiros releases foram:

  1. Metropolis, do clássico de ficção científica de 1927 de Fritz Lang;
  2. Hannibal, filme de 2001 bastante conhecido.

Cluster Application

Essa camada é composta pelo conjunto de servidores que processam nossas regras de negócio. São eles que decidem quais anúncios serão exibidos nas vitrines, o que acontece quando há um clique e o que fazer com os dados de um novo publisher cadastrado no sistema.

Essa foi a camada com maiores modificações. O refactoring priorizou quatro pontos essenciais:

  1. Lógica: otimizamos o algoritmo de processamento, tornando-o muito mais eficiente para esta nova fase do sistema.
  2. Memcached: aumentamos em 80% a utilização de memcached. Sempre respeitando as regras de negócio, foi possível cachear grande quantidade de informações de forma a otimizar o tempo de resposta. Essa alteração afetou diretamente a camada de banco de dados de aplicação, pois fez com que a aplicação consultasse consideravalmente menos esse banco de dados.
  3. Gravação de logs: tornamos a gravação de logs assíncrona. Isso quer dizer que a camada de aplicação não fala mais diretamente com nosso MySQL[bb] de logs. Ele coloca numa fila (Beanstalkd) que, posteriormente, será consumida por um programa Ruby que, por sua vez, será responsável por armazenar no banco de dados.
  4. Número de Workers: fizemos alguns benchmarks que nos indicaram o número ideal de workers. Antes, usávamos uma lógica complexa que media a capacidade total de processamento de cada máquina para chegar no número ideal que era, à época, muito alto. Porém, nossos benchmarks indicaram que esse número não deve ser muito grande. Quanto mais workers, mais os núcleos (cores) das máquinas ficarão ocupados e, portanto, mais lento será o processamento individual deles. Porém, se esse número for pequeno demais, o loadbalancer poderá não achar workers disponíveis, mesmo que eles processem rapidamente. No nosso caso, o número ideal está entre 20 e 30 workers.

Testamos também a utilização do método run_later do MERB. Porém, chegamos à conclusão que teríamos maior poder de gerenciamento usando o Beanstalkd. Além disso, o Beanstalkd possui uma funcionalidade de persistência.

Cluster Log e BI

Todas as requisições feitas a boo-box são gravadas em nosso Cluster de Log. Vitrines visualizadas, cliques em anúncios, ações efetuadas em sites de parceiros, tudo é registrado.

Como disse no começo do post: tome cuidado com seu banco de dados[bb]! Ele poderá tirar suas noites de sono :)

Nessa camada, foi importante unir tunning com processamento assíncrono:

  1. Tunning: fique atento às configurações de key_buffer, max_connections, table_cache, thread_concurrency, innodb_buffer_pool_size e, claro, à sua estrutura de índices nas tabelas.
    Além disso, implementamos um sistema de particionamento nativo do MySQL que otimiza a estrutura de armazenamento no HD (MySQL Reference Manual – Chapter 18. Partitioning).
  2. Processamento assíncrono: como explicado no Cluster Application, a aplicação não fala mais diretamente com os banco de dados de logs, mas sim com uma fila. Dessa forma, um não dependerá mais do outro, melhorando, e muito, o tempo de resposta de nossas vitrines.

Essas otimizações também afetaram nosso BI, responsável por processar todos os dados recebidos para serem utilizados posteriormente (relatórios, métricas, projeções etc).

Cluster data source

Essa camada é responsável por armazenar informações específicas do sistema.

Com todas as otimizações feitas nas outras camadas (principalmente o aumento de utilização de Memcached), não foi necessário realizar grandes modificações aqui. Pelo contrário: reduzimos a quantidade de máquinas dessa camada, diminuindo o número de servidores.

Cluster products cache

Grande parte dos anúncios exibidos nas vitrines boo-box são produtos ofertados por e-commmerces parceiros. Como as informações dos produtos não precisam ser mantidas ao longo do tempo, fazemos um cache temporário dos dados.

Com as alterações no Cluster Application, foi possível diminuir consideravelmente a quantidade de máquinas dessa camada.

Lembre-se: sempre que utilizar CouchDB ou MySQL, é importante ter máquinas de armazenamento rápido, para uma melhor performance de I/O. Portanto, Cloud Computing pode não ser uma boa opção para essa camada.

Load balancer e Static Files

São as máquinas que recebem as requisições dos usuários e direcionam a carga para um dos servidores de aplicação.

No webserver nginx, usávamos o algoritmo round-robin. Com o aumento de escala, essa lógica se mostrou não ser a melhor pra nós, pois quando algum de nossos servidores (workers) demorava a responder, comprometia todas as requisições que ali entravam. Dessa forma, aplicamos o módulo Fair, que permite ao nginx enviar requisições para as máquinas de aplicação que estiverem com menor processamento no momento.

Monitor

Para garantir a saúde dos sistemas, é importante monitorar ao máximo as diversas camadas e aplicativos envolvidos. Porém, isso não requer apenas ferramentas. É importante implantar processos manuais e automáticos.

Atualmente, utilizamos ferramentas como Munin, Monit, Webalizer, Pingdom além de ferramentas próprias que fazem esse papel.

Realizamos checks horários, diários, semanais e mensais, que nos geram dados para tomadas de decisão de mudanças ou manutenção da nossa estrutura.

É importante observar que a automatização de processos é a meta ideal, porém não deve ser impeditivo. Muitos técnicos e gestores de infraestrutura negligenciam as práticas de monitoramento por “não terem automatizado o processo”, gerando muito mais problemas do que soluções. Se necessário, implemente processos manuais constantes. A disciplina é sua maior aliada.

Conclusão

Construir um sistema de alta disponibilidade não requer apenas soluções tecnológicas.

Práticas de gestão serão um diferencial necessário na solução final. Sem se perder no excesso de burocracia, a criação de processos e práticas de trabalho bem definidas farão com que a equipe possa unir soluções de longo prazo (implementação lenta), com soluções de curto prazo (implementação veloz), sabendo, portanto, lidar com todos os tipos de problemas que um sistema dessa complexidade irá criar.

Quem faz isso acontecer

  1. André Amaral | novembro 25, 2009 @ 23:15 - Responder

    Impressão minha ou o Chapolin está de meia?

  2. Danillo César de Oliveira Melo | novembro 25, 2009 @ 23:33 - Responder

    Bom trabalho, quando crescer quero ser como vocês.

  3. Felipe Vieira | novembro 25, 2009 @ 23:33 - Responder

    O Chapolin esta nos conformes… de shorts, botas amarelas e antenas de vinil (ali oh! no cantinho).
    Eu sou um mero nerd seguidor ;)

  4. Cairo Noleto | novembro 26, 2009 @ 1:46 - Responder

    Devo dar meus parabéns a esse time e a “audácia” da Boo-box, não é toda empresa/startup que mostra suas soluções tecnológicas. Por conta disso, nós do Jus Navigandi (http://jus.uol.com.br/) sempre estamos de olho nas soluções que vocês produzem.

    Vocês ainda estão usando CouchDB certo? Se estão, não consegui identificar no gráfico e tenho duas dúvidas: Vocês usam replicação contínua? Se sim, isso gera muito overhead?

    E mais uma vez quero dar meus parabéns a Boo-box, tecnologicamente falando é uma das empresas de ponta!

  5. Henrique | novembro 26, 2009 @ 2:27 - Responder

    Legal, belo estudo de caso!

    Tenho certeza de que o Chapolin Colorado ajudou muito nisso ;)

    PS: Quanto a não usar Cloud Computing… bom, pelo menos a Amazon oferece o Elastic Block Storage (http://aws.amazon.com/ebs/). Como existe a possibilidade de se conectar inumeros EBS a mesma instância EC2 e montar um RAID0, não é dificil montar um array com 10 ou mais discos de 1GB e conseguir uma performance tremenda no I/O pagando pouco. O gargalo acaba sendo mais a interface interna entre as máquinas e a CPU da instância EC2.

  6. Jota | novembro 26, 2009 @ 16:14 - Responder

    Parabens cara! De coração, que vc tenha o melhor!

  7. Fabio C da Silva | novembro 28, 2009 @ 6:00 - Responder

    Muito bom mesmo, matou a pau!

  8. Thomas Lopes | novembro 28, 2009 @ 17:04 - Responder

    Olá Pessoal!
    Ficou bem bacana a nova implementação, mas eu ainda passo por problemas com o boo-boxfy: os anúncios demoram a carregar, e isso quando simplesmente nem aparecem.

  9. Flávio Alves | dezembro 22, 2009 @ 0:53 - Responder

    Realmente, uma arquitetura de ninjas! :)
    Vcs são feras, solução bem inteligente.

    Além disso, foram muito generosos em compartilhar esse conhecimento.

    Parabéns.
    Sucesso!

  10. Luciano Condé | janeiro 7, 2010 @ 17:31 - Responder

    Excelente desenho de arquitetura. Isto prova que o alinhamento negócios e arquitetura é vital para manter a saúde de um serviço/produto em tempos de uso exaustivo de tecnologia.

    abs
    Condé

  11. CAPC-MEGADROM | fevereiro 26, 2010 @ 22:36 - Responder

    Conan, mandou bem! Parabens e sucesso pra vc e todos desse super time.

  12. Leo Cabral | setembro 26, 2010 @ 2:40 - Responder

    Valeu pela aula, rapaziada.

    Abração.

  13. Dirceu | outubro 10, 2010 @ 17:37 - Responder

    Brutal!

  14. Juliana Neves | outubro 31, 2010 @ 13:37 - Responder

    Esse sistema é fantástico… vendo coisas como esta é que me dou conta que o Brasil tem muito potencial para ser explorado. Meus parabéns!

  15. Vinicius | novembro 18, 2010 @ 14:54 - Responder

    Cara! Mandarem bem pacas! Obrigado por compartilhar ;D
    … Quando vi os nomes dos servidores logo achei que os caras eram
    ninjas mesmo.

    Parabéns!

  16. Cleber Dantas | dezembro 19, 2010 @ 20:29 - Responder

    Muito legal ver um time brasileiro matando a pau quando o assunto Eh tecnologia de ponta e em como usar isso da melhor forma. Muito boa a arquitetura não Eh a toa q a empresa soh cresce a cada dia.

    Parabéns boo-box e a comunidade agradece o conhecimento compartilhado.

    Abs Cleber Dantas

  17. www.SHOWJA.com | fevereiro 11, 2011 @ 12:14 - Responder

    Boo-Box está com uma equipe de profissionais de ponta… Suce$$o!

  18. Caio Serra | fevereiro 23, 2011 @ 16:50 - Responder

    Esses caras merecem o sucesso que estão tendo… O serviço coube como uma luva em meu blog.
    Essa é uma iniciativa que só tem a crescer.

    Parabéns!

  19. PublicaOn | março 26, 2011 @ 22:42 - Responder

    Caramba, show de bola…
    Quando eu cresçer também quero ser como vocês!

    Parabéns!

  20. Felipe Fernandes Horn | abril 10, 2011 @ 2:22 - Responder

    Black Flag!!!!

    Abraço pra galera da boo-box!

  21. Danilo Santos | abril 25, 2011 @ 17:11 - Responder

    O mais normal de vocês baba né :P

    Parabéns, trabalho com desenvolvimento de aplicações para web, e sei muito bem o que significa o não dormir rs.

    Mas aposto que como todos da área quando pequeno seus pais falavam “Menino sai do computador e vai estudar”.

    Deu nisso.

    Parabéns mais uma vez.

  22. Marco | maio 21, 2011 @ 4:04 - Responder

    Vida longa ao Boo-Box. Acompanho o trabalho de vocês a bastante tempo e vejo o quanto a ferramenta evoluiu. Muito bom.

    Parabéns ao meu xará e companhia

    Em breve vou voltar com o boo-box no MELHORES DO YOUTUBE

    Abração

  23. João Bosco Seixas | junho 30, 2011 @ 10:48 - Responder

    Muito boa a arquitetura.

    A algum tempo atrás assisti uma palestra de um engenheiro do Twitter explicando um pouco da arquitetura do twitter na época.

    Alguns trechos são parecidos com a solução de vocês. Nessas horas vemos que boas soluções convergem para boas práticas globais.

    Parabéns!

  24. Oh doido | agosto 9, 2011 @ 19:49 - Responder

    boo-box, melhor programa de brasileiro afiliados da internet.

  25. Oscar Nogueira Neto | setembro 5, 2011 @ 11:29 - Responder

    Congratz pra vocês da boo-box!

    Trabalho com performance e capacity planning diariamente. Se metade dos nossos clientes (e estou falando de empresas grandes, muito grandes) tivesse essa maturidade quanto a monitoramento e planejamento de crescimento de seu parque computacional, nosso trabalho seria bem mais tranquilo!

    Parabéns!

  26. Ricardo | setembro 7, 2011 @ 8:58 - Responder

    Parabéns pessoal! Para mim vocês forma o melhor programa de afiliados até agora da web. Se eu achar algum melhor vou falar também viu?

    Isso com certeza ajuda vocês a não ficarem por baixo de outros ok? Parabéns mais uma vez!

  27. Furious Downloads - Clique aqui | outubro 26, 2011 @ 4:08 - Responder

    Parabéns o boo-box é otimo… valew

  28. Downloads - Click Aqui | novembro 5, 2011 @ 0:38 - Responder

    bo-box Excelente :)

  29. @maario_souza/BARATOLOUKO | novembro 12, 2011 @ 14:20 - Responder

    Programa fantástico e de fácil utilização pelos afiliados…
    Parabéns!

  30. luiz alexandre | novembro 18, 2011 @ 10:32 - Responder

    etou na primeira viagem ono boo box mas esotu gostando
    é mais legível que outros serviços que tem por não
    que não vá precisar deles vi o boo bosx na revista Info muiot legal

  31. ProcureAqui | fevereiro 7, 2012 @ 22:03 - Responder

    Por isto é mito bom trabalhar com o boo-box, pois um trabalho excelente gera resultados excelentes.

  32. Ricardo Belo | março 8, 2012 @ 0:31 - Responder

    Thyago e Equipe, Parabéns, ótimas soluções!
    Sim, adorei o nome das maquinas! rsr..

    Já tive bastante problemas com banco de dados também.
    Uma das soluções que encontrei foi Varnish
    (https://www.varnish-software.com/), que é
    bem parecido com Nginx, e em alguns benchmarks
    ele mostra ser bastante eficiente e
    pode cachear suas paginas dinâmicas também.

  33. Drogas Nunca Mais | maio 18, 2012 @ 11:49 - Responder

    Eu realmente espero que funcione bem, pois a equipe é show de bola.

  34. Rafael Grassmann Mancini | junho 14, 2012 @ 12:07 - Responder

    Parabens pela ferramenta e pelo trabalho de vocês.