Avançar para a área de conteúdo

Ao clicar em Enviar, você concorda com os termos e condições do developerWorks.

A primeira vez que acessar o developerWorks, um perfil será criado para você. Informações do seu perfil (tais como: nome, país / região, e empresa) estarão disponíveis ao público, que poderá acompanhar qualquer conteúdo que você publicar. Seu perfil no developerWorks pode ser atualizado a qualquer momento.

Todas as informações enviadas são seguras.

  • Fechar [x]

Ao se conectar ao developerWorks pela primeira vez, é criado um perfil para você e é necessário selecionar um nome de exibição. O nome de exibição acompanhará o conteúdo que você postar no developerWorks.

Escolha um nome de exibição de 3 - 31 caracteres. Seu nome de exibição deve ser exclusivo na comunidade do developerWorks e não deve ser o seu endereço de email por motivo de privacidade.

Ao clicar em Enviar, você concorda com os termos e condições do developerWorks.

Todas as informações enviadas são seguras.

  • Fechar [x]

Introdução ao Riak, Parte 2: Integrando o Riak como um Servidor de Armazenamento em Cache de Uso Industrial para Aplicativos da Web

Usando o Riak como um servidor de armazenamento em cache para ajudar a aliviar a carga nos servidores de aplicativos e banco de dados

Simon Buckle, Independent Consultant, Freelance
Photograph of Simon Buckle
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.

Resumo:  Este artigo é a Parte 2 de uma série de duas partes sobre o Riak, um armazenamento de dados altamente escalável e distribuído escrito em Erlang e com base no Dynamo, armazenamento de valor da chave de alta disponibilidade do Amazon. Para websites pesados, uma solução escalável de armazenamento em cache pode aliviar a carga sobre os servidores de aplicativo e de banco de dados. Isso se aplica particularmente aos dados que são lidos com frequência, mas atualizados apenas ocasionalmente. Explore um exemplo aprofundado de um site de apostas online e como é possível usar o Riak para implementar uma solução de armazenamento em cache. Você também aprenderá a integrar o Riak a um website existente, a olhar outros recursos do Riak, como busca, e como usá-lo para atender diretamente às solicitações do usuário. Será necessário um cluster Riak em funcionamento se desejar acompanhar os exemplos. É possível localizar as etapas para a configuração local de um cluster na Parte 1 desta série.

Visualizar mais conteúdo nesta série

Data:  30/Mai/2012
Nível:  Intermediário Também disponível em :   Inglês
Atividade:  1823 visualizações
Comentários:  


Introdução

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.

Outros Artigos nesta Série

Veja mais artigos na série Introdução ao Riak .

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áveis​para 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.


Integração de website

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.


Usando o Riak como um cache

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).


Procurando algo?

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.


Conclusão

Outros Artigos nesta Série

Veja mais artigos na série Introdução ao Riak .

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.



Download

DescriçãoNomeTamanhoMétodo de download
Article source coderiakpt2sourcecode.zip85KBHTTP

Informações sobre métodos de download


Recursos

Aprender

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

Sobre o autor

Photograph of Simon Buckle

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.

Ajuda para Relatar Abuso

Relatar abuso

Obrigado. Esta entrada foi sinalizada para atenção do moderador.


Ajuda para Relatar Abuso

Relatar abuso

Falha no envio do Relatório de abuso. Tente novamente mais tarde.


developerWorks: Registre-se


Precisa de um ID IBM?
Esqueceu seu ID IBM?


Esqueceu sua senha?
Alterar sua senha

Ao clicar em Enviar, você concorda com os termos de uso do developerWorks.

 


Na primeira vez que você efetua sign in no developerWorks, um perfil é criado para você. Informações selecionadas do seu perfil developerWorks são exibidas ao público, mas você pode editá-las a qualquer momento. Seu primeiro nome, sobrenome (a menos que escolha ocultá-los), e seu nome de exibição acompanharão o conteúdo que postar.

Selecione seu nome de exibição

Ao se conectar ao developerWorks pela primeira vez, é criado um perfil para você e é necessário selecionar um nome de exibição. O nome de exibição acompanhará o conteúdo que você postar no developerWorks.

Escolha um nome de exibição de 3 - 31 caracteres. Seu nome de exibição deve ser exclusivo na comunidade do developerWorks e não deve ser o seu endereço de email por motivo de privacidade.

(Deve possuir de 3 a 31 caracteres.)


Ao clicar em Enviar, você concorda com os termos de uso do developerWorks.

 


Classificar este artigo

Comentários

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=80
Zone=Software livre
ArticleID=818697
ArticleTitle=Introdução ao Riak, Parte 2: Integrando o Riak como um Servidor de Armazenamento em Cache de Uso Industrial para Aplicativos da Web
publish-date=05302012