Nova infraestrutura de servidores Web do Sistema boo-box
Postado por Thyago Liberalli
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:

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, é preciso seguir alguns princípios:
- Velocidade: ninguém vai ficar esperando para ver um anúncio carregar.
- 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 :)
- Monitoramentos: monitore tudo! E automatize os monitoramentos sempre que possível.
- 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:

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, 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:
- Metropolis, do clássico de ficção científica de 1927 de Fritz Lang;
- 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:
- Lógica: otimizamos o algoritmo de processamento, tornando-o muito mais eficiente para esta nova fase do sistema.
- 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.
- 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
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.
- 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! Ele poderá tirar suas noites de sono :)
Nessa camada, foi importante unir tunning com processamento assíncrono:
- 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). - 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.


André Amaral
novembro 25, 2009 @ 23:15 -
Impressão minha ou o Chapolin está de meia?
Danillo César de Oliveira Melo
novembro 25, 2009 @ 23:33 -
Bom trabalho, quando crescer quero ser como vocês.
Felipe Vieira
novembro 25, 2009 @ 23:33 -
O Chapolin esta nos conformes… de shorts, botas amarelas e antenas de vinil (ali oh! no cantinho).
Eu sou um mero nerd seguidor ;)
Cairo Noleto
novembro 26, 2009 @ 1:46 -
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!
Henrique
novembro 26, 2009 @ 2:27 -
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.
Jota
novembro 26, 2009 @ 16:14 -
Parabens cara! De coração, que vc tenha o melhor!
Fabio C da Silva
novembro 28, 2009 @ 6:00 -
Muito bom mesmo, matou a pau!
Thomas Lopes
novembro 28, 2009 @ 17:04 -
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.
Flávio Alves
dezembro 22, 2009 @ 0:53 -
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!
Luciano Condé
janeiro 7, 2010 @ 17:31 -
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é
CAPC-MEGADROM
fevereiro 26, 2010 @ 22:36 -
Conan, mandou bem! Parabens e sucesso pra vc e todos desse super time.
Leo Cabral
setembro 26, 2010 @ 2:40 -
Valeu pela aula, rapaziada.
Abração.
Dirceu
outubro 10, 2010 @ 17:37 -
Brutal!
Juliana Neves
outubro 31, 2010 @ 13:37 -
Esse sistema é fantástico… vendo coisas como esta é que me dou conta que o Brasil tem muito potencial para ser explorado. Meus parabéns!
Vinicius
novembro 18, 2010 @ 14:54 -
Cara! Mandarem bem pacas! Obrigado por compartilhar ;D
… Quando vi os nomes dos servidores logo achei que os caras eram
ninjas mesmo.
Parabéns!
Cleber Dantas
dezembro 19, 2010 @ 20:29 -
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
www.SHOWJA.com
fevereiro 11, 2011 @ 12:14 -
Boo-Box está com uma equipe de profissionais de ponta… Suce$$o!
Caio Serra
fevereiro 23, 2011 @ 16:50 -
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!
PublicaOn
março 26, 2011 @ 22:42 -
Caramba, show de bola…
Quando eu cresçer também quero ser como vocês!
Parabéns!
Felipe Fernandes Horn
abril 10, 2011 @ 2:22 -
Black Flag!!!!
Abraço pra galera da boo-box!
Danilo Santos
abril 25, 2011 @ 17:11 -
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.
Marco
maio 21, 2011 @ 4:04 -
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
João Bosco Seixas
junho 30, 2011 @ 10:48 -
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!
Oh doido
agosto 9, 2011 @ 19:49 -
boo-box, melhor programa de brasileiro afiliados da internet.
Oscar Nogueira Neto
setembro 5, 2011 @ 11:29 -
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!
Ricardo
setembro 7, 2011 @ 8:58 -
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!
Furious Downloads - Clique aqui
outubro 26, 2011 @ 4:08 -
Parabéns o boo-box é otimo… valew
Downloads - Click Aqui
novembro 5, 2011 @ 0:38 -
bo-box Excelente :)
@maario_souza/BARATOLOUKO
novembro 12, 2011 @ 14:20 -
Programa fantástico e de fácil utilização pelos afiliados…
Parabéns!
luiz alexandre
novembro 18, 2011 @ 10:32 -
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
ProcureAqui
fevereiro 7, 2012 @ 22:03 -
Por isto é mito bom trabalhar com o boo-box, pois um trabalho excelente gera resultados excelentes.
Ricardo Belo
março 8, 2012 @ 0:31 -
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.