16 abril 2012

Explorando o software por trás do Facebook, a maior rede social do mundo





Na escala em que o Facebook opera, muitas abordagens tradicionais para servir conteúdo web falham ou não são práticas. O desafio para os engenheiros do Facebook tem sido manter o site no ar com mais de meio bilhão de usuários ativos.
Este artigo analisa técnicas e softwares que o Facebook usa para funcionar nesse nível.

Facebook: desafio de escalabilidade

Antes de entrar em detalhes, aqui estão alguns factóides para dar uma idéia do desafio de escalabilidade com o qual o Facebook tem que lidar:

Softwares para escalar

A infraestrutura de software que o Facebook usa pode ser vista como a de um site LAMP, mas com melhorias e extensões de vários serviços. Por exemplo:
  • O Facebook usa PHP, mas tem um compilador que permite que o sistema execute código nativo nos servidores web, aumentando significativamente seu desempenho;
  • O Facebook usa Linux, mas é um Linux otimizado para garantir alta vazão de rede;
  • O Facebook usa MySQL, mas principalmente para persistência de chaves-valores (Hashes), movendo lógicas de consultas e JOINS para a camada de aplicação dos servidores web em que otimizações são mais fáceis de implementar, usando por exemplo caches em memória;
  • Por fim, há sistemas customizados, como o Haystack, um objeto de armazenamento altamente escalável usado para servir a imensa quantidade de fotos do Facebook, e o Scribe, um sistema de logging (registro de ações) que consegue operar na escala do Facebook (nada trivial).
Vamos ao que interessa. Abaixo são apresentados os softwares (alguns) que o Facebook usa para fornecer a todos nós a maior rede social do mundo.

Memcached

Memcached é no momento um dos softwares mais famosos na Internet. É um sistema de cache em memória distribuído que o Facebook (e vários outros sites) usam como uma camada de cache entre aplicação web e banco de dados (já que acesso a disco rígido é relativamente lento). Ao longo dos anos, o Facebook realizou diversas otimizações no Memcached e nos softwares que rodam em conjunto com ele.
O Facebook roda milhares de servidores Memcached com dezenas de tearabytes de dados em cache a todo momento. É provavelmente a maior instalação de Memcached do mundo.

HipHop for PHP

PHP é uma linguagem interpretada e por isso seu código quando executado é relativamente lento quando comparado com código que executa nativamente. O HipHop converte PHP em código C++ que pode ser então compilado e apresentar um desempenho melhor. Isso permite que o Facebook aproveite muito melhor seus servidores web já que dependem demais de PHP para servir conteúdo.
Uma pequena equipe de engenheiros no Facebook (inicialmente, apenas três) passou 18 mesesdesenvolvendo o HipHop, que agora é usado em produção.

Haystack

Haystack é o sistema de armazenamento e recuperação de fotos de alto desempenho do Facebook (a rigor, o Haystack é um armazenador de objetos, então ele não armazena apenas fotos). Existem mais de 20 bilhões de fotos no Facebook e cada uma é armazenada em quatro diferentes resoluções, resultando em mais 80 bilhões de fotos.
O desafio do Haystack não é apenas armazenar bilhões de fotos, mas também executar tarefas com elas em que o desempenho é crítico, como por exemplo remoção, atualização ou acesso.

BigPipe

BigPipe é um sistema dinâmico para servir páginas web que o Facebook desenvolveu. Ele é capaz de dividir uma página em seções (chamadas “pagelets“) e servi-las em paralelo com desempenho ideal.
Por exemplo, a janela de chat é carregada separadamente, o feed de notícias é carregado separadamente, e assim por diante. Esses “pagelets” podem ser carregados em paralelo, que é de onde vem o ganho de desempenho, e os usuários recebem um site que funciona mesmo se uma parte dele for desativada ou estiver com defeitos.

Cassandra

Cassandra é um sistema de armazenamento distribuído baseado no projeto doBigTable. Ele é um dos filhos de destaque do movimento NoSQL e se tornou open source (virou um projeto Apache). O Facebook o usa na pesquisa Inbox.
Além do Facebook, uma série de outros sites também o usam, como o Twitter e o Digg. É um sistema capaz de armazenar uma quantidade imensa de dados sem comprometer o tempo de busca e acesso a eles.

Scribe

Scribe é um sistema de logging flexível e escalável que o Facebook usa para uma infinidade de propósitos internos. Ele foi criado para ser capaz de registrar todas as ações ocorridas no Facebook, e automaticamente lida com novas categorias de ações registradas conforme aparecem (o Facebook tem centenas).

Hadoop e Hive

Hadoop é uma implementação open source de MapReduce que permite a execução de cálculos em uma quantidade massiva de dados. O Facebook o usa para análise de dados de sua rede. O Hive é uma interface de acesso ao Hadoop através de consultas SQL, facilitando seu uso, e teve origem dentro do Facebook.
Tanto o Hadoop quanto o Hive são open source (projetos Apache) e são usados por uma série de grandes sites, como o Yahoo e o Twitter.

Thrift

O Facebook usa diferentes linguagens para os seus diferentes serviços. PHP é usada para front-end, Erlang é usada para Chat, Java e C++ são usados em diversas áreas. Thrift é um framework cross-language desenvolvido internamente que junta todas as diferentes linguagens, permitindo que elas conversem entre si. Isso facilita enormemente o desenvolvimento cross-language no Facebook.
O Facebook tornou o Thrift open source e adicionou suporte a mais linguagens de programação.

Varnish

Varnish é um acelerador HTTP, que pode agir como um balanceador de carga e também realiza cache de conteúdo para servi-lo rapidamente.
O Facebook usa o Varnish para servir fotos, lidando com bilhões de requisições todos os dias. Como quase tudo que o Facebook usa, o Varnish também é open source.

Outras coisas que ajudam o Facebook a funcionar bem

Foram mencionados os softwares que constituem o Facebook e o ajudam a escalar. Mas operar um sistema tão grande é uma tarefa complexa, por isso serão listadas outras coisas que ajudam o Facebook a funcionar sem problemas:

Lançamento gradual de novas funcionalidades e execuções no escuro

O Facebook tem um sistema chamado de “Gatekeeper” (porteiro) que permite que eles rodem diferentes versões do sistema para diferentes conjuntos de usuários. Ele permite que o Facebook lance novas funcionalidades gradualmente e que testes A/B sejam realizados com usuários.
O “Gatekeeper” também é responsável por realizar o que é chamado de “dark launches” (lançamentos no escuro), que é a ativação de elementos de uma nova funcionalidade antes de ela ir pro ar. É uma maneira de realizar testes de carga do sistema antes de uma funcionalidade ser oficialmente lançada. Normalmente os “dark launches” são realizados duas semanas antes do lançamento oficial da funcionalidade.

Monitoramento do sistema em produção

O Facebook cuidadosamente monitora seu sistema e o desempenho de cada função PHP executada em ambiente de produção. Com isso é possível projetar um perfil do sistema que está no ar com a ajuda de uma ferramenta chamadaXHProf e identificar gargá-los ou áreas que estão operando incorretamente.

Desativação gradual de recursos para aumento de desempenho

Se o Facebook tiver algum problema de desempenho, existe um grande número de recursos não-críticos que podem ser desativados para aumentar o desempenho de funcionalidades vitais da rede social. Desta forma, em uma situação de emergência, o núcleo da rede social poderá continuar funcionando normalmente.

Coisas que não foram mencionadas

O hardware usado pelo Facebook não entrou em discussão neste artigo, mas é um aspecto importante de analisar quando se pensa em escalabilidade. Por exemplo, o Facebook usa a rede CDN para servir conteúdo estático e possui enormes data centers que hospedam milhares de servidores.
E além do que foi mencionado, existem diversos outros softwares envolvidos na operação do Facebook. Neste artigo foram destacadas as escolhas mais interessantes que o Facebook fez.

Facebook e projetos open source

Antes de encerrar o artigo, é importante mencionar o quanto o Facebook, assim como outras grandes empresas de Internet, apoia projetos open source. O Facebook não apenas usa e contribui com software open source como Linux, Memcached, MySQL e Hadoop, como também desenvolve internamente diversas ferramentas que são disponibilizadas como projetos open source.
Uma lista com todos os projetos open source em que o Facebook atua pode ser encontrada na página Open Source – Desenvolvedores do Facebook.

Mais desafios de escalabilidade por vir

O Facebook cresce a passos incríveis. Sua base de usuários aumenta quase que exponencialmente e já superou 500 milhões de usuários. Ele tem mantido uma taxa de cerca de 100 milhões de novos usuários a cada 6 meses.
O rápido crescimento significa que o Facebook vai ter problemas e diversos desafios de desempenho para apresentar cada vez mais páginas, buscas, imagens, mensagens e todos os outros recursos com os quais os usuários interagem. Para um site como o Facebook, este sempre será um fato com o qual ele terá que viver, e seus engenheiros estarão sempre atentos e criando novas maneiras de fazer o sistema escalar.
Vamos acompanhar o que os engenheiros do Facebook estão desenvolvendo! Com certeza surgirão coisas interessantes, afinal de contas, eles estão escalando uma montanha que muitos de nós podemos apenas sonhar; um site com mais pessoas do que a maioria dos países. Quando isso acontece, é preciso ser criativo.


Este artigo é uma adaptação/atualização para o português do artigo em inglês Exploring the software behind Facebook, the world’s largest site.

Nenhum comentário:

Postar um comentário