Certos tipos de dados demonstram padrões de acesso que os permitem ser armazenados em cache. Por exemplo, sites de apostas online têm uma característica interessante de carga: as probabilidades e os erros de apostas são solicitados com frequência, mas não são atualizados muito frequentemente.
Essas situações precisam de um sistema altamente escalável com as seguintes características para lidar com as demandas de cargas elevadas:
- O sistema atua como um cache confiável para reduzir a demanda sobre os servidores e bancos de dados de aplicativo
- Os itens em cache são pesquisáveispara que seja possível atualizá-los ou invalidá-los
- Qualquer solução é facilmente integrada a um site existente
O Riak é uma boa opção para uma solução como essa.
O Riak não é o único candidato para a implementação dessa solução de armazenamento em cache; muitos caches diferentes estão disponíveis. Um popular é o memcached. No entanto, ao contrário do Riak, o memcached não fornece qualquer tipo de replicação de dados, o que significa que, se o servidor que contém um item especial cair, esse item ficará indisponível. O Redis, outro armazenamento de chave/valor popular que poderia ser usado como cache, suporta replicação por meio de uma configuração mestre-escravo. O Riak não tem nenhum conceito de um mestre (nó), portanto, ele torna o sistema resiliente a falhas.
Qualquer solução precisa ser integrada facilmente a um website existente. É importante ser capaz de fazê-lo, pois pode não ser possível—ou mesmo desejável—migrar todos os seus dados existentes para o Riak. Conforme mencionado anteriormente, certos tipos de dados são passíveis de serem armazenados em cache, particularmente no caso de um armazenamento de chave/valor, caso esses dados sejam acessados com uma chave primária. Esse é o tipo de dado mais adequado para ser migrado para o Riak.
Conforme mencionado na Parte 1 desta série do Riak, várias bibliotecas de cliente estão disponíveis em linguagens como PHP, Ruby e Java™; as bibliotecas fornecem uma API que facilita bastante a integração com o Riak. Nesse exemplo, demonstro o uso da biblioteca PHP para mostrar como integrar o Riak a um website existente.
A Figura 1 mostra a configuração a ser considerada para esse exemplo. Não considerei detalhes, como balanceamento de carga, firewall, etc. Os próprios servidores, nesse caso, são apenas simples caixas de front-end com uma pilha LAMP instalada.
Suponhamos que o Riak só seja usado internamente (não é acessível de fora) e que ele seja executado em um ambiente não hostil, para que não haja problemas de segurança, como autenticação. Essa não é uma suposição tão ruim quanto possa parecer, pois, de qualquer maneira, o Riak não possui qualquer autorização integrada; é realmente preciso delegar a autenticação e afins para o aplicativo.
Figura 1. Uma simples integração de website
Segue um exemplo básico de como é possível integrar o Riak a um website existente. Você criará um formulário simples que, quando enviado, usará o cliente de PHP para armazenar um objeto no Riak, com base nos valores que foram inseridos no formulário.
A Figura 2 mostra um exemplo de um formulário simples que um
administrador pode usar para criar uma entrada de aposta no sistema. Crie esse
formulário em HTML e faça com que ele realize um POST no script
de PHP na Listagem 1; é possível usar um formulário semelhante
no código de origem que acompanha este artigo
como um ponto de início. O campo "chave" inserido no formulário será usado como a chave para
armazenar o objeto no bucket.
Figura 2. Formulário de exemplo para criar uma aposta
A Listagem 1 possui um exemplo de código PHP que mostra como usar a biblioteca do cliente PHP para se integrar ao Riak. Altere o caminho para a biblioteca do cliente PHP —especificada em require_once—aonde quer que você tenha instalado. Nesse caso, apenas coloquei no mesmo diretório que o script PHP. Por padrão, todas as bibliotecas do cliente esperam que o Riak esteja disponível na porta 8098.
Listagem 1. Exemplo de código PHP a ser integrado ao Riak
<?php
require_once('./riak.php');
# Poderia verificar aqui para ver se o usuário atual possui as
# credenciais apropriadas? delegado ao aplicativo.
$client = new RiakClient('192.168.1.1', 8098);
$bucket = $client->bucket('odds');
$bet = $bucket->newObject($_POST['key']);
$data = array(
'odds' => $_POST['odds'],
'description' => $_POST['description']
);
$bet->setData($data);
# Salvar o objeto no Riak
$bet->store();
echo "Thanks!";
?>
|
Salve o código em um arquivo PHP (dê a ele o nome que preferir), faça o upload dele e
do formulário em algum local de seu website. Por exemplo:
http://www.yoursite.com/riak-test.php. Preencha
o formulário de exemplo e o envie. Para provar que isso realmente funcionou, tente recuperar o
item diretamente do Riak usando a chave inserida no formulário para criar
o item (consulte a Listagem 2).
Listagem 2. Recuperando o item do Riak
$ curl ?i http://localhost:8098/riak/odds/<key>
?
{ "odds":"-", "description":"..." }
|
Embora esse exemplo de integração tenha usado o cliente PHP, a abordagem é semelhante a outras linguagens ou estruturas de aplicativos, como Java ou Ruby on Rails.
Atendendo a solicitações diretamente
Além de usar as bibliotecas do cliente para integrar o Riak à sua atual configuração, é possível atender às solicitações do usuário diretamente do Riak, usando-o como um mecanismo simples de HTTP. Para demonstrar isso, criarei uma demo simples para mostrar como é possível solicitar páginas diretamente do Riak.
Faça download do pacote binário do código de origem para este artigo. Certifique-se de que o Riak esteja em execução; em seguida, execute o script load.sh. Esse script copiará todos os arquivos HTML e JavaScript em um bucket chamado demo. Esse exemplo usa o cliente JavaScript.
Para visualizar a demo, abra esta URL em seu navegador:
http://localhost:8098/riak/demo/demo.html
Se você digitar alguns valores no formulário para criar uma aposta e enviar o formulário, um objeto JSON será armazenado no Riak. As propriedades do objeto corresponderão aos campos no formulário. Você será redirecionado a uma página que exibe o valor do objeto que acabou de ser criado.
A Listagem 3 mostra o código para criar o objeto a partir dos valores inseridos. Os valores
key, oddse o
description advêm dos valores inseridos no
formulário.
Listagem 3. Exemplo de uso da biblioteca do cliente JavaScript no Riak
client.bucket("odds", function(bucket) {
var key = $('#key').val();
bucket.get_or_new(key, function(status, object) {
object.contentType = 'application/json';
object.body = { 'odds': $('#odds').val(), 'description': $('#desc').val() };
object.store(function(status, object, request) {
if (status == 'ok') {
window.location = "http://localhost:8098/riak/odds/"+key;
} else {
alert("Failed to create object.");
}
});
});
});
|
Conforme mencionado anteriormente, presumo que o Riak esteja sendo executado em um ambiente confiável. Nesse caso, não há problema de segurança na inclusão de páginas que armazenam e recuperam itens no Riak. No entanto, em geral, você não deseja expor esse tipo de funcionalidade na Internet sem ter alguma forma de autenticação funcionando.
Embora seja um exemplo simples, ele mostra como o Riak pode atender diretamente às solicitações da página. É possível, por exemplo, incluir os dados armazenados no Riak diretamente nas páginas da web existentes usando uma técnica como JSONP ou o compartilhamento de recurso de origem cruzada—as solicitações Ajax são restritas ao mesmo servidor em que a página reside pela mesma política de domínio—ou pelas solicitações de proxy através de seus servidores até o Riak, para buscar os dados necessários.
Os caches são usados para fornecer acesso rápido aos dados. Se os dados solicitados estiverem contidos no cache (acertos do cache), o aplicativo poderá atender rapidamente à solicitação por meio da leitura do valor do cache, comparativamente mais rápido do que recuperar o valor de um banco de dados. Se algo não estiver no cache (perda de acerto no cache), então, o aplicativo normalmente precisará alcançar o banco de dados para recuperar os dados. Geralmente, quanto mais solicitações puderem ser atendidas a partir do cache, mais rápido será o sistema. O Riak possui uma série de recursos que o tornam uma boa escolha para implementar uma solução de armazenamento em cache.
Um desses recursos do Riak é seu backend de armazenamento conectável; o backend de armazenamento determina como os dados são armazenados. Existem vários disponíveis, mas não abordarei todos aqui (consulte Recursos) para obter informações adicionais). O backend padrão de armazenamento é o Bitcask, um aplicativo Erlang que fornece uma API para armazenar e recuperar dados apoiados por um hashtable, que fornece acesso rápido aos dados. Os dados são persistidos.
Um backend talvez seja mais relevante para este artigo: o backend de Memória. O backend de Memória usa uma tabela na memória para armazenar todos os seus dados (internamente, ele usa tabelas ets do Erlang) e, quando ativado, faz com que o Riak se comporte como um cache LRU com expiração vencida. A vantagem de usar um armazenamento na memória é que ele é significativamente mais rápido que acessar o disco para recuperar os dados. Quando os dados são armazenados na memória—não persistidos—e um nó fica indisponível, os dados armazenados nesse nó serão perdidos. Conforme o seu uso como um cache, ele se torna menos um problema—o aplicativo pode sempre recuperar os dados a partir do banco de dados—como seria se o Riak fosse usado como seu armazenamento de dados primário. O Riak replica os dados em vários nós no cluster, por isso, eles ainda estarão disponíveis.
O Riak é enviado com o backend de Memória incluído. Para usar o backend de Memória,
abra o app.config para cada nó no cluster, localize a propriedade
storage_backend e altere-a de
riak_kv_bitcask_backend
a riak_kv_memory_backend. Agora, inclua o
código na Listagem 4 ao final do arquivo.
Listagem 4. Usando o backend de Memória
{memory_backend, [
{max_memory, 4096}, %% 4 GB de memória
{ttl, 86400} %% Tempo em segundos
]}
|
Altere os valores para o que for apropriado para a sua configuração. Reinicie os nós no cluster.
Também é possível executar o armazenamento de diversos backends em um cluster Riak. Isso é útil porque significa que é possível usar diferentes backends para diferentes buckets. Por exemplo, seria possível configurar um bucket (vamos chamá-lo de cache) para usar o backend de Memória, mas para os outros buckets—aqueles que devem persistir os dados—para usar, por exemplo, o Bitcask.
Agora que você possui o Riak configurado para se comportar como um cache, é necessário encontrar alguma maneira de acessar os dados no cluster para atualizá-los ou, possivelmente, invalidá-los por algum motivo (antes do seu tempo de expiração).
Conforme já visto, para recuperar os dados armazenados no Riak ao usar a
interface HTTP, constrói-se uma URL que consiste no nome do bucket e na
chave do objeto que deseja recuperar, em seguida, faz-se um HTTP
GET nessa URL. Isso é perfeitamente adequado
quando você sabe o que é a chave! No entanto, às vezes, você
não conhece a chave do objeto que deseja recuperar ou deseja
recuperar um conjunto de objetos que satisfazem determinados critérios.
Então, é necessária uma maneira para procurar por objetos retidos no cluster.
Já vimos como consultar dados executando uma tarefa de Mapear/Reduzir sobre os documentos que estão armazenados no cluster. Em geral, o tempo necessário para executar a consulta será proporcional ao número de documentos no cluster; quanto mais documentos, mais tempo levará para consultar esses documentos. Isso não é um problema para consultas que não são sensíveis ao tempo. Com isso, me refiro às consultas em que o usuário não espera obter uma resposta de imediato. Para algo como uma procura, não é viável pesquisar (dinamicamente) todos os documentos toda vez. A obtenção dos resultados poderia demorar alguns minutos ou horas!
Felizmente, o Riak já tem uma solução para esse problema: o Riak Search. O Riak Search fornece a funcionalidade necessária para procurar documentos armazenados em seu cluster. O tema da pesquisa é muito grande para aprofundarmos neste artigo, mas, em linhas gerais, funciona assim: Os documentos são convertidos em token (o Riak Search usa analisadores padrão Lucene) e incluídos a um índice invertido. Esse índice é, então, consultado com base nos termos de procura inseridos por um usuário. À medida que novos documentos são incluídos, eles também são indexados e incluídos ao índice.
O Riak Search é desativado por padrão. Antes de poder usá-lo, é necessário
ativá-lo. Para cada nó em seu cluster, abra
rel/riakN/etc/app.config, localize a propriedade
riak_search e configure-a para verdadeiro. Será necessário
reiniciar os nós no cluster.
O Riak permite especificar o nome de uma função a ser executada antes e depois de um
documento ser incluído a um bucket por meio do uso de ganchos pré- e pós-confirmação.
Por exemplo, talvez você deseje verificar se um documento possui determinados campos
obrigatórios antes de incluí-lo ao cluster. Para procurar por um documento, é
necessário que ele esteja indexado. Para fazer isso, instale um gancho pré-confirmação
no bucket em que os documentos são armazenados. Para fazer isso, execute o
comando a seguir:
$ rel/riak/bin/search-cmd install <bucket name>
Isso instalará um gancho de pré-confirmação
riak_search_kv_hook no bucket. Agora,
quando quer que um documento seja incluído a esse bucket, ele será analisado e incluído
ao índice. O analisador de espaço em branco é o analisador
padrão. Ele processa caracteres em tokens com base no espaço em branco, que são,
então, indexados. Vários analisadores diferentes estão disponíveis
e é possível definir o seu.
Em muitos casos, o Riak Search sabe como indexar seus dados. Por exemplo, simples de instalar, se um objeto JSON for incluído a um bucket, o valor de cada propriedade será indexado e poderá ser consultado usando o nome da propriedade na sequência de consultas. Consulte o exemplo de procura na Listagem 5. Para estruturas mais complicadas, é possível definir o seu próprio esquema, que diz ao Riak Search como indexar seus dados.
Quando há alguns documentos indexados, é preciso emitir consultas com relação a eles. Uma maneira é executar uma consulta a partir do shell Erlang. Por exemplo, a consulta na Listagem 5 procura pelos bucket de probabilidade para todas as apostas relacionadas a corrida de cavalos. Isso é possível ser feito consultando a propriedade de descrição do item armazenado.
Listagem 5. Procurando os buckets de probabilidade para apostas relacionadas a corrida de cavalos
$ rel/riak/bin/riak attach search:search(<<"odds">>, <<"description:horse">>). |
Além disso, o Riak search também fornece uma API de HTTP compatível com Solr para
procurar documentos. O Apache Solr é um servidor popular de procura corporativa
com uma API parecida com o REST. Tornando a API compatível com o Solr, deve ser possível
sair do Solr —se usá-la—e usar o Riak Search
para melhorar suas pesquisas. Por exemplo, para procurar pelas probabilidades
para um determinado evento usando a interface do Solr, você faria algo do
tipo:
$ curl "http:localhost:8098/solr/odds/select?start=0&q=description:horse"
Com a configuração de procura, agora é possível localizar itens no armazenamento de dados sem saber a chave primária dos itens que estão sendo procurados.
A capacidade do Riak de escalar e replicar dados de forma confiável —além de outros recursos, como procura —o tornam a opção ideal para implementar uma solução de armazenamento em cache para sites pesados. É possível integrá-lo facilmente a um site existente. Com sua capacidade de atender a solicitações diretamente, é possível usar o Riak para reduzir e eliminar a carga no aplicativo e nos servidores de banco de dados.
| Descrição | Nome | Tamanho | Método de download |
|---|---|---|---|
| Article source code | riakpt2sourcecode.zip | 85KB | HTTP |
Informações sobre métodos de download
Aprender
- Part 1: The language-independent HTTP API: Store and retrieve data using Riak's HTTP interface (Simon Buckle, developerWorks, março de 2012): Leia esta introdução ao Riak que aborda o básico do armazenamento e recuperação de itens no Riak usando a sua API de HTTP.
- Leia os página da wiki da Procura Riak para saber mais sobre como ela funciona.
- Veja o que os backends de armazenamento Riak fornecem e como eles se diferenciam uns dos outros.
- Obtenha uma lista de bibliotecas do cliente disponíveis para integração com o Riak.
- Consulte Basic Cluster Setup and Building a Development Environment para
obter informações mais detalhadas sobre como configurar um cluster de três nós.
- Leia o texto do Google MapReduce:
Simplified Data Processing on Large Clusters.
- Leia Introduction to programming in Erlang (Martin Brown, developerWorks, maio de 2011) e saiba mais sobre o Erlang e como o seu estilo de programação funcional se compara a outros paradigmas de programação, como programação imperativa, processual e orientada a objetos.
- Leia o documento do Amazon's Dynamo sobre o qual o Riak tem base. Bastante recomendado!
- Consulte o artigo How To Analyze Apache Logs para saber como usar o Riak para
processar seus logs do servidor.
- Obtenha uma explicação sobre os relógios vetoriais e por que eles são mais fáceis de entender do que se poderia imaginar.
- Encontre uma boa explicação para relógios vetoriais e
informações mais detalhadas sobre link
walking no wiki do Riak.
- O atributo de website Project Gutenberg é um ótimo recurso se você precisar de alguns recursos de texto
para experimentação.
- O atributo de área de Software Livre no developerWorks fornece muitas informações sobre ferramentas de software livre e de como utilizar tecnologias de software livre.
- especializadas em artigos que cobrem diversas soluções baseada na web.
- Fique por dentro dos eventos técnicos e webcasts do developerWorks focados em uma variedade de produtos IBM e assuntos sobre o mercado de TI.
- Participe de um briefing ao vivo e gratuito do developerWorks Live! para inteirar-se sobre os produtos e ferramentas IBM, além das tendências do mercado de TI.
- Acompanhe as demos on demand do developerWorks , que abrangem desde demos de instalação e configuração de produtos para iniciantes até funcionalidades avançadas para desenvolvedores experientes.
- Siga o developerWorks no Twitter, ou inscreva-se em um feed de tweets sobre o Linux no developerWorks.
Obter produtos e tecnologias
- Avalie produtos IBM da maneira que for melhor para você: faça download da versão de teste de um produto, avalie um produto on-line, use-o em um ambiente de nuvem ou passe algumas horas na SOA Sandbox para saber mais sobre como implementar arquitetura orientada a serviço (SOA) de maneira eficiente.
Discutir
- Confira Blogs do developerWorks e participe da comunidade do developerWorks.
- Participe da comunidade do developerWorks. Entre em contato com outros usuários do developerWorks e explore os blogs, fóruns, grupos e wikis voltados para desenvolvedores.

Simon Buckle é consultor independente. Seus interesses incluem sistemas distribuídos, algoritmos e simultaneidade. Ele possui um mestrado em computação pela Imperial College, Londres. Confira seu website em simonbuckle.com.