Artigos 11:42 AM
Memcached, optimizando aplicações PHP com cache em memória
Aplicações de grande porte tendem a passar por problemas de performance, por N motivos como o crescimento do número de usuários simultâneos, complexidade da lógica, cresicmento da base de dados, dentre outros.
Geralmente o primeiro passo a seguir quando uma aplicação está com a performance degradada é tentar detectar no código os problemas de performance e corrigi-los. Em caso de aplicações WEB um sistema de cache como o do PHP Smarty pode ajudar e quando isso não for o bastante pode ser possível partir para a clusterização dos servidores.
Quando o problema está na base dados, a solução comumente utilizada é clusterizar a base, geralmente adicionando servidores slave que se por um lado melhoram o tempo de resposta de consultas a base, por outro lado perdem no momento da escrita, pois cada nó do cluster deve ser atualizado.
Pensando nesses problemas, Brad Fitzpatrick desenvolveu um sistema de cache em memória distribuido. Fitzpatrick se deparou com o problema de rápido cresicmento da audiência do site LiveJournal.com. Ao chegar a casa dos 20 milhões de usuários por dia, clusters de servidores web e de banco de dados já não eram mais suficientes, e então o Memcached surgiu garantindo rápido acesso aos dados e melhor utilização de recursos.
O Memcached é simples de ser utilizado e sua biblioteca cliente está disponível para as principais linguagens, dentre elas C, Perl, PHP, Python, e Java.
Com o Memcached é possível armazenar qualquer valor no sistema de cache, seja ele um ponteiro para registros de banco de dados, uma array multi-dimensional ou até mesmo uma simples string.
Uma de suas principais vantagens em relação a clusters de banco de dados por exemplo, é que nesses tipos de clusters temos N máquinas respondendo pelo mesmo conteúdo, enquanto que num cluster Memcached, os dados são distribuídos e somados nos N servidores disponíveis, ou seja, se criarmos um cluster com 3 servidores e 1GB de memória em cada, teremos no final um total de 3GB de cache total, sem conteúdo duplicado ao contrário do cluster de banco.
Outra vantagem é que a instalação do memcache costuma ser simples, principalmente nas principais distribuições. No Gentoo por exemplo, para dar suporte a linguagem PHP basta instalar o pacote pecl-memcache no servidor WEB. O pacote memcached deve ser instalado nos servidores que irão compor o sistema de cache.
Nos servidores do cache o arquivo /etc/conf.d/memcached deve ser editado e informações como quantidade de memória a ser utilizada e número máximo de conexões devem ser especificadas.
# emerge pecl-memcache memcached # vim /etc/conf.d/memcached (se desejar, altere a configuração padrão) # /etc/init.d/memcached start
Certifique-se de que regras de firewal estejam atualizadas para permitir a conexão entre servidor e cliente.
No lado da aplicação é necessária pouca alteração no código, bastando antes de executar o código necessário para popular uma variável, tentar buscar o valor no Memcached e caso esse não exista executar o código pertinente.
O código abaixo exemplifica o uso do Memcache em PHP.
<?php // cria nova instância do Memcached $m = new Memcache; // adiciona 3 servidores, podendo ser especificados nomes ou endereços // com ou sem especificação da porta $m->addserver("127.0.0.1:11211"); $m->addserver("servidor2"); // aqui é utilizada a porta padrão (11211) $m->addserver("servidor2:11212"); // mais de uma cópia do memcached pode ser executada por máquina // pede ao Memcached o conteúdo da chave array_teste $array_teste = $m->get("array_teste"); // se o valor não existir executa a rotina para gerar o valor if(!$array_teste){ $array_teste = array(); $array_teste[] = array("valor 1", "valor 2", "valor 3"); $array_teste[] = array("valor 4", "valor 5", "valor 6"); $array_teste[] = array("valor 7", "valor 8", "valor 9"); // em seguida o valor é adicionado no cache por 1 minuto // o 3º parâmetro indica se deve ser usada compressão com zlib // o 4º parâmetro indica o tempo de vida do cache (em segundos) $m->add("array_teste", $array_teste, false, 60); } var_dump($array_teste); ?>
Outros 2 pontos interessantes do Memcached é que o valor a ser armazenado pode ser compactado com uso da zlib e também o tempo de vida do cache pode ser especificado.
Vale lembrar é claro que por se tratar de cache em memória, caso um dos servidores falhe, os dados nele armazenados serão perdidos e uma vez que os dados não são replicados nos demais servidores, o Memcached não deve ser adotado como solução de failover. No entanto com um pouco de estudo para identificar os pontos críticos do sistema é possível criar uma arquitetura de cache simples e eficiente.
Mais informações podem ser obitdas na página do projeto Memcached e no Wiki
Posts Relacionados:
- Optimizando a compilação com ccache e distcc
- Instalando Mysql 5 e Php 5 no Fedora Core 4
- PHP Conference 2006 – PhpGtk2
Related posts brought to you by Yet Another Related Posts Plugin.