Beruflich Dokumente
Kultur Dokumente
o desempenho do site
Descubra as possibilidades de Virtualização com Storage HP
Introdução
O memcached é usado para acelerar processos de aplicativos e, aqui, teremos como foco
as melhores práticas para sua implementação dentro de seus aplicativos e ambientes.
Isto inclui o que deveria e o que não deveria ser armazenado, como tratar a distribuição
flexível de dados e como regular o método para atualizar o memcached e versões
armazenadas dos dados. Também será coberto o suporte a soluções de alta
disponibilidade, incluindo o IBM WebSphere eXtreme Scale.
Apesar de vários servidores web poderem ser configurados para usar um cache para
retornar informações, isto não funciona com a natureza dinâmica da maioria dos
aplicativos. É aqui que o memcached pode ajudar. Ele fornece um armazenamento
generalizado em memória que pode conter qualquer coisa, incluindo objetivos nativos
de linguagens, permitindo o armazenamento de uma variedade de informações e acessá-
las de muitos aplicativos e ambientes.
Os fundamentos
Por exemplo, considere um aplicativo típico baseado em web. Mesmo um web site
servido dinamicamente provavelmente tem alguns componentes de informações
constantes durante a vida da página.
Dentro de um blog, é improvável que a lista de categorias para os tópicos individuais do
blog altere regularmente entre visualizações de páginas. Carregar estas informações
toda vez durante uma consulta ao banco de dados é comparativamente caro,
especialmente quando os dados não alteraram. É possível ver na Figura 1 alguns dos
fragmentos de página dentro de um blog que poderiam ser armazenadas em cache.
Figura 1. Elementos que poderiam ser colocados em cache em uma página de blog
típica
Extrapole esta estrutura para outros elementos do blog, informações da pessoa que o
publicou, comentários mesmo os tópicos do blog em si e é possível identificar 10-20
consultas ao banco de dados e formatações que ocorrem somente para exibir o conteúdo
da página principal. Repita isto para centenas, ou mesmo milhares de visualizações de
páginas a cada dia, e seus servidores e aplicativos estarão executando muito mais
consultas do que o necessário para exibir o conteúdo da página.
A interface para o memcached é fornecida por meio de uma conexão à rede. Isto
significa que é possível compartilhar um único servidor do memcached (ou vários
servidores, como será demonstrado posteriormente neste artigo) com vários clientes. A
interface de rede é rápida e, para melhorar o desempenho, o servidor deliberadamente
não suporta autenticação ou comunicação segura.
As informações são retidas no cache indefinidamente, a não ser que um dos seguintes
ocorra:
1. A memória alocada para o cache foi esgotada Neste caso, o memcached usa o
método least-recently used (LRU) para remover itens do cache. Itens que não
tenham sido usados recentemente são excluídos do cache, primeiro as com
acesso mais antigo.
2. O item é especificamente excluído É sempre possível excluir um item do
cache.
3. O item expirou Itens individuais podem ter uma expiração para permitir que
sejam retirados do cache quando as informações armazenadas com relação à
chave são provavelmente muito antigas.
Essas situações podem ser usadas em combinação com a lógica de seu aplicativo para
garantir que as informações no cache estejam atualizadas. Com isso em mente, vamos
examinar o quão melhor é usar o memcached em seus aplicativos.
Há uma série de processos e etapas chave que podem ser modificados ao usar o
memcached para melhorar o desempenho do aplicativo.
Na primeira vez que este processo ocorre, os dados serão carregados do banco de dados
ou outra origem, como normalmente, e, a seguir, armazenados no memcached. Da
próxima vez que as informações forem armazenadas, elas serão retiradas do
memcached, em vez de serem carregadas do banco de dados, economizando tempo e
ciclos de CPU.
O outro lado da equação é garantir que, se as informações que possam ser armazenadas
dentro do memcached forem alteradas, a versão do memcached é atualizada ao mesmo
tempo em que são atualizadas as informações no backend. Isto modifica a sequência
típica daquela mostrada na Figura 4 para a ligeira modificação na Figura 5.
Figura 4. Atualizando ou armazenando dados em um aplicativo típico
Por exemplo, usando o blog como base, quando o sistema do blog atualiza a lista de
categorias no banco de dados, a atualização deverá seguir esta sequência:
A maioria das interfaces de linguagem, incluindo Java, Perl, PHP e muitas outras,
podem serializar objetos de linguagem para armazenamento com o memcached. Isto
permite armazenar e, posteriormente, recuperar objetos inteiros do cache de memória,
em vez de reconstruí-los manualmente dentro de seu aplicativo.
Muitos objetos, ou as estruturas que eles usam, são baseados em algum tipo de hash ou
estrutura de matriz. Para ambientes entre linguagens, como quando você deseja
compartilhar as mesmas informações entre seu ambiente JSP e um ambiente JavaScript,
é possível usar o formato independente de arquitetura, como o JavaScript Object
Notation (JSON) ou mesmo XML.
Seria impossível listar todas as interfaces suportadas e ambientes oferecidos, mas todos
suportam a API básica fornecida pelo protocolo do memcached. Essas descrições foram
simplificadas e deverão ser interpretadas dentro do contexto de diferentes linguagens,
onde os erros podem ser indicados usando diferentes valores. As funções principais são:
Por exemplo, dentro do Perl, uma operação básica de conjunto seria tratada como
mostra a Listagem 1.
use Cache::Memcached;
require 'memcache'
memc = MemCache::new '192.168.0.100:11211'
memc["mykey"] = "myvalue"
Resiliência e disponibilidade
Uma das perguntas mais comuns sobre o memcached é "O que acontece quando o cache
está indisponível?" Como deveria estar claro das seções anteriores, as informações no
cache nunca deverão ser a única origem das informações. É preciso ser capaz de
carregar os dados armazenados no cache a partir de algum outro local.
Apesar de a praticidade ser de que não ser capaz de acessar informações do cache
reduzirá o desempenho de seu aplicativo, ela não deverá impedir que o aplicativo
continue funcionando. Existem alguns cenários que poderão ocorrer:
Ao encarar esta ideia, a tentação é presumir que é necessário algum tipo de mecanismo
de distribuição ou replicação que copiará os pares chave/valor entre as máquinas. O
problema com esta abordagem é que você está, na verdade, diminuindo seu cache
disponível em RAM, e não aumentando. Se observar a Figura 6, você verá que existem
três servidores de aplicativo, cada um com acesso a uma instância do memcached.
Como o memcached fornece suas informações sobre uma interface de rede, um único
cliente pode acessar os dados de qualquer instância do memcached ao qual tenha acesso.
Se os dados não forem copiados ou duplicados em cada instância, o que você terá é 3
GB de cache de RAM disponível para cada servidor de aplicativos, como mostra a
Figura 7.
Figura 7. Uso correto de várias instâncias do memcached
O problema com esta abordagem é escolher qual servidor armazenará seu par
chave/valor e como determinar qual servidor do memcached acessar quando quiser
recuperar um valor. A solução é ignorar complexidades como tabelas de consulta ou
esperar que o servidor do memcached trate o processo para você. Em vez disso, os
clientes do memcached deverão pensar de forma simples.
Para dar um exemplo, a chave mykey é convertida para o valor 23875. Não importa se
você está armazenando ou obtendo informações, sempre usará a mesma chave como
identificador exclusivo para carregar do servidor do memcached, portanto "mykey"
sempre obterá o hash com um valor de 23875, pelo menos neste exemplo.
Se houver dois servidores, o cliente do memcached obtém este valor numérico e realiza
um cálculo simples nele (por exemplo, módulo) para determinar se deveria armazenar o
valor na primeira ou na segunda instância configurada do memcached.
Existem complexidades neste processo (como o que acontece quando um servidor está
indisponível), mas a documentação oferece mais informações (consulte detalhes
Recursos).
Como não usar o memcached
O memcached nunca deverá ser usado como a única origem de dados de que necessita
para executar seu aplicativo; os dados sempre deverão ser deriváveis de alguma outra
origem. Além disso, tenha em mente que o memcached é somente um armazenamento
de chave/valor.
Não é possível realizar uma consulta sobre os dados ou realizar uma iteração no
conteúdo para extrair informações. Ele deverá ser usado para armazenar blocos ou
objetos de dados que você precisa usar em estilo de atacado.
Apesar de ser possível usar o memcached para armazenar as linhas de dados como
carregadas de um banco de dados, isto é na verdade armazenamento em cache de
consultas, e a maioria dos bancos de dados fornecem seus próprios mecanismos de
armazenamento de consultas em cache. O mesmo pode ser dito para outros objetos,
como imagens ou arquivos do sistema de arquivos. Muitos aplicativos e servidores web
já têm soluções bem otimizadas para este tipo de trabalho.
Não se limite
Apesar das coisas para as quais você não deveria usar suas instâncias do memcached, a
flexibilidade do memcached não deve ser ignorada. Como o memcached está no mesmo
nível de arquitetura que seu aplicativo, ele é fácil de integrar e conectar. E alterar seu
aplicativo para tirar vantagem do memcached não é complicado.
Além disso, como o memcached é somente um cache, ele não deverá interromper a
execução de seu aplicativo no caso de um problema. O que ele faz, se usado
corretamente, é diminuir a carga no resto da infraestrutura do servidor (reduz leituras de
bancos de dados e origens de dados), e isto significa suportar mais clientes sem a
necessidade de mais hardware.
Resumo
Como um aplicativo de software livre, e um que tem um objetivo bem simples e direto,
o poder e a utilidade do memcached advêm dessa simplicidade. Ao fornecer um grande
armazenamento em RAM para informações, tornando-as disponíveis na rede e, a seguir,
acessíveis por meio de tal imensa gama de diferentes interfaces e linguagens, é possível
integrar o memcached em uma enorme variedade de instalações.