RSS
 

Perl e a Amazon Cloud – Parte 1/5

09 Apr

Pessoal, segue minha traduçao livre do artigo da IBM sobre o Perl e o Amazon Cloud  escrito Teodor Zlatanov.

Original emCultured Perl: Perl and the Amazon cloud, Part 1

Aprenda o Básico sobre o Amazon S3 e os serviços SimpleDB construindo um site simples de compartilhamento de fotos.

Na Parte 1 dessa série de 5 partes, Ted Zlatanov explicará os pros e contras do Amazon Simple Storage Service (S3) e do SimpleDB. Esse visual tour explicará a arquitetura dos dois serviços e como utilizá-los em exemplos práticos, para isso será construído um site de compartilhamento de fotos utilizando uma biblioteca em Perl

Requisitos:

É preciso ter conhecimento básico de HTTP e HTML, bem como conhecimento intermediário em JavaScript e Perl (particularmente mod_perl). Algum conhecimento de bancos de dados relacionais, armazenamento e redes ajudarão. A série ficará cada vez mais técnica, então veja a área de “Recursos” se você precisar de ajuda com algum dos tópicos.

Nessa série, utilizarei o domínio share.lifelogs.com para construir os exemplos. Agora vamos dar uma olhada no Amazon S3.

Amazon S3 overview

Sendo um administrador linux por um bom tempo, posso afirmar que backups e áreas de armazenamento de arquivos não são coisas nada triviais. Se acrônimos como SAN, NAS, LUN, LVM, RAID, JBOD, IDE e SCSI não significam nada para você, fique grato! Se você sabe do que se trata com certeza tem alguma mémoria triste que te dá calafrios só de lembrar.

Computação em nuvem é uma forma de desenvolver aplicações em um ambiente virtual, no qual a capacidade de processamento, largura de banda, armazenamento, segurança e confiabilidade não são problemas – você não precisa instalar nenhum software em seus sistemas. Em um ambiente de computação virtual, você pode desenvolver, lançar, e gerenciar aplicações, pagando apenas pelos recursos que você realmente utiliza, enquanto os recursos crescem ou diminuem de forma transparente para acomodar as suas necessidades de mudança ou de negócio.

O Amazon S3 é uma área de armazenamento distribuída. Se você estiver tranqüilo em confiar os seus dados (“my precious”) à Amazon isso vai tornar sua vida muito mais fácil. Claro, você sempre pode tirar os seus próprios backups para ter mais segurança. (Segurança pode ser uma questão: colocando seus dados no S3 significa dizer que vc terá de usar o controle de acesso deles, que eventualmente pode não encaixar com o seu modelo de autênticaçao ou autorização. Verifique a documentação do S3 para maiores detalhes)

Então, o que vc ganha com o S3? O S3 utiliza uma chave de usuário (uma string longa e aleatória) e uma senha (outra string longa) para permitir que você armazene e recupere seus arquivos. Você é cobrado de acordo com a tabela de preço da Amazon. Não é muito caro; quando comparado com o custo de manter seus dados em uma NAS, SAM ou discos locais, o S3 é bem razoável.

No momento (início de 2009), os dados do S3 são armazenados em dois data centers da Amazon (USA e Europa) com uma boa conectividade de rede. Se você pretende distribuir seus dados para uma grande audiência fora desses dois eixos, deve rodar uns testes com serviços como o Gomez ou Keynote, que são desenhados para determinar a performance de seu site/sistema de forma global. Mesmo se estiver nos USA ou Europa, se o seu negócio depende de entregar dados rapidamente e com confiabilidade, você deveria configurar testes diários de performance através desses serviços.

O maior problema com sistemas de armazenamento distribídos é a latência de atualização. Isso é o tempo entre a atualização feita pelo dono do conteúdo e sua propagação. Mas esse simples atraso pode não ser o único ponto de atenção: a propagação pode não ser uniforme também, assim seus clientes podem ver diferentes conteúdos em momentos distintos. A Amazon garante a consistência entre os servidores, significando que não existirão dados corrompidos, mas você deve ter isso em mente enquanto avalia os serviços do S3. Quando você faz o upload, modifica ou apaga um arquivo não espere que isso aconteça imediatamente.

Existem bibliotecas Perl no CPAN para acesso ao S3. Mostrarei como utilizar a Net::Amazon::S3 mas existem várias outras.

Um exemplo da Amazon S3

Agora, vamos adiante com o que podemos fazer com a S3. Arquivos (chamado de objetos pelo S3) são armazenados em cestos, o nome do arquivo (a chave) tem que ser único. Você pode dar ao arquivo atributos como “cor” ou “língua”, mas isso não é parte do nome do arquivo.

Digamos que você tenha uma foto da bandeira Brasileira como “images/bandeira.png” no cesto “br.images.share.lifelogs.com” e uma imagem da bandeira Alemã como “images/bandeira.png” no cesto “al.images.share.lifelogs.com” (o arquivo tem o mesmo nome mas estão em cestos diferentes). Seus usuários podem solicitar http://br.images.share.lifelogs.com.s3.amazonaws.com/images/bandeira.png para acessar a bandeira Brasileira ou http://al.images.share.lifelogs.com.s3.amazonaws.com/images/bandeira.png para acessar a bandeira Alemã.

Note que o nome dos cestos tem que ser único dentre todas as contas da Amazon S3, evite nomes como “teste” e “default”. Acrescente ao nome dos cestos os domínios completos se possível. Isso faz a identificação dos cestos mais simples e dificilmente ocorrerá duplicidade.

Lembre-se: o S3 é um serviço complexo, é recomendável que você dê uma olhada na página deles antes de prosseguir.

Amazon SimpleDB

Ordenadas, filtradas, agregadas, analisadas, com medianas, a avalanche de dados crús que nos deparamos todos os dias pode se tornar um ingerenciavel fluxo de informação. Armazenar esses dados é uma atividade que merece um profissional dedicado na TI. É preciso espaço, energia, backup e uma porrada de outros recursos. Utilizando serviços hospedados em terceiros como o SimpleDB pode valer a pena levando-se em conta todo esse cenário; Explicarei apenas o lado técnico dessa decisão.

Um exemplo simples de banco de dados é uma lista do itens a fazer (to-do-list). Em um banco de dados relacional tradicional esse modelo pode ser construído com duas tabelas de duas colunas cada.:

Tabela 1. todo_foreign

item statuscode (FK to status.statuscode, default 0)
Ligar para Mãe 0
Ligar para IRS 2
Trazer o leite 1

Tabela 2. Status

statusdesc statuscode
0 ativo
1 concluído
2 apagado

“Espere,” você diz. “E quando as tarefas são concluídas ou apagadas, quem modifica ele, e quais são os tipos de dados? É para isso, afinal de contas, que nós treinamos o todo poderoso DBA. Eles sabem tudo a respeito da forma normal, das chaves estrangeiras e de SQL. Certamente você precisará de um deles para olhar sua modelagem, correto?”

Sim, obrigado, Sr. Sabe Tudo, mas deixe-me explicar isso sozinho. Chore suas pitangas depois em cima da sua cópia de “Secrets Of The SQL and RDBMS Gods For Dummies.”

Amazon SimpleDB é um banco de dados vastamente distribuído do tipo chave-valor. Definitivamente não é o tipo de banco que serve para todo tipo de negócio, e possuí uma série de restrições de desempenho e escalibilidade. Atributos são limitados a 1KB cada então os seus itens a fazer não podem ter nomes maiores que um kilobyte.

O modelo de controle de acesso do SimpleDB é similar ao S3. Uma rede social simples como essa que iremos fazer (compartilhamento de fotos) pode conviver e utilizar sem problemas o SimpleDB como back end de banco de dados. Mesmo assim, você deve avaliar os seus requisitos de negócio, orçamento e qualquer outra restrição técnica para descobrir se o SimpleDB servirá aos seus propositos.

Os itens de latência que afetam o S3 também afetam o SimpleDB. Suas atualizações não terão efeito imediato em todos os pontos do sistema.

Usando o nosso exemplo, a estrututa do SimpleDB seria:

Tabela 3. Estrutura SimpleDB “todo”

Item Status
ligar para Mãe ativo
ligar para IRS apagado
trazer o leite concluído

Até agora, nenhum problema. Esse modelo é mais simples que o promeiro exemplo, não é? Oh, vamos adcionar outra atividade na nossa to-do list:

pegar a vaca ativo

Você percebe que os status estão duplicados? A palavra ativo está armazenada duas vezes no banco de dados. Isso pode ser custoso para tabelas grandes em termos de armazenamento e desempenho. Por outro lado, cada linha do SimpleDB é um modelo auto-suficiente. Quando você recupera uma linha, você tem em mãos tudo que ela contêm. Você não precisa de nenhuma query adicional na tabela de status para buscar a descrição. Dado que existe uma latência de atualização, isso importa!

Mais SimpleDB to-do lists

Digamos que você acione um novo código de status, “aguardar_ate_amanha”, e aplique ele a um item na tabela todo_foreign (Tabela 1, com as chaves estrangeiras). Então, agora você tem dois updates (um na tabela de status, um na todo_foreign). Se o update da tabela de status (Tabela 2) acontecer depois da todo_foreign, você terá uma incosistencia. Lembre-se, o SimpleDB não garante que os seus updates serão feitos imediatamente e na ordem que vc os realiza, entao nesse caso, além de ter que realizar duas buscas (uma para o item, uma para a descricao do status), você ainda corre o risco de ficar incosistente.

Aqui está a chave do SimpleDB: esqueça as colunas da tabela todo_simple (Table 2). SimpleDB não tem colunas! Ele tem atributos para cada linha, e esses atributos nao sao estaticos, voce pode adcioná-los e removê-los  a sua vontade. Se deseja que os itens tenham uma data de criação e deleçao? Apenas dê a eles esse atributo. Na todo_foreign, isso iria requerer duas colunas; a data de deleção pode ser nula para indicar que o item ainda está ativo. Vamos adicinar uma coluna a mais para a data que item foi concluído. Ou quem sabe deveria ser apenas o código de status? O que fazer??

A maneira que o SimpleDB trabalhar permita que o que você deseja seja feito de forma rápida. Você precisa de uma data de criação? Crie o atributo criado_em. A data de remoçao? Faça a atribuiçao somente aos itens que foram apagados. A presença de atributos nos conta quais as caracteristicas dos itens.

Então, o que peço é: pare de pensar em termos de colunas. As linhas do SimpleDB são como hashes em Perl. Toda chave é uma string. Todo valor é uma string ou um array de strings. Vamos tentar modelar novamente:

Lista 1. todo_freeform

{ item: “call Mom” }
{ item: “call IRS”, deleted_date: “2009-03-01″ }
{ item: “get milk”, done_date: “2009-03-02″ }

Note que o SimpleDB tem uma chave implicita chamada ItemName, que nesse caso seria o item to-do (como string):

Lista 2. SimpleDB todo list

call Mom” { }
call IRS
” { deleted_date: “2009-03-01″ }
get milk
” { done_date: “2009-03-02″ }

O SimpleDB não aceita objeto sem atributos, então dê a todos os objetos o atributo created_date :

Listing 3. SimpleDB todo list com created_date adicinada:

call Mom” { created_date: “2009-02-01″ }
call IRS
” { created_date: ”2009-02-01″, deleted_date: “2009-03-01″ }
get milk
” { created_date: “2009-02-01″, done_date: “2009-03-02″ }

E olha que maravilha (segundo o autor) não existe outro tipo que não seja String!

Dessa forma você pode adicionar o atributo “delete_reason” para os itens apagados três meses depois do site ter ido ao ar. E isso não vai quebrar nada, apenas o novo código que conhece esse novo atributo o usará.

Farei uma pausa para os DBAs de plantão tomarem uma aspirina. Enquanto isso, os programadores Perl estão dando a ele copos de água, afinal eles são camaradas. ;)

Avançando no nosso exemplo. O importante agora é descobrirmos quais queries nos retornarão os itens ativos, apagados ou concluídos. É muito simples; você pode verificar na documentação do SimpleDB para todas as opções de quereis. Nesse caso aqui usaremos a linguagem SELECT. Temos também a linguagem QUERY, mas a SELECT é mais próxima a SQL e portanto mais fácil de entender para a maioria dos leitores.

Listing 4. todo_freeform queries

– Buscar ativos
select * from todo_freeform where done_date is null and deleted_date is null
– Buscar apagados
select * from todo_freeform where deleted_date is not null
– Buscar concluídos
select * from todo_freeform where done_date is not null

Pronto! Agora vamos integrar os dois (S3 e SimpleDB)

Integrando os serviços e compartilhando fotos

Você deve está se perguntando, como conectar o SimpleDB e o S3? Fácil: você pode simplesmente armazenar o cesto com o nome do seu objeto S3 no SimpleDB. Veja como funciona com o exemplo do compartilhamento de fotos, chega com essa história de to-do list.

O site precisa armazenar as fotos no S3 e os comentários no SimpleDB. E as contas de usuários? Nós precisamos conviver com a natureza distribuída do SimpleDB, o que significa que teremos usários inválidos algumas vezes (como por exemplo, quando o usuário foi apagado mas a linha que faz referência a ele ainda não). Todavia, nós manteremos a estrutura de usuários no SimpleDB. Não haverá dependência de nenhum banco de dados externo, o nosso objetivo é configurar o site de uma forma muito rápida, apenas com uma “cola” de Perl rodando abaixo do mod_perl com a ação mesmo rolando no S3 e no SimpleDB.

Primeiro, você precisará de uma tabela de fotos. Os registros terão uma cara parecida com essa:

Lista 5. Photo table records, share_photos

http://developer.amazonwebservices.com/connect/images/amazon/logo_aws.gif
{ user: “ted”, name: “Amazon Logo”}

http://images.share.lifelogs.com/funny.jpg
{ user: “bob”, name: “Funny Picture”, s3bucket: “images.share.lifelogs.com” }

Próximo, a tabela users:

Listing 6. Users table, share_users

ted” { given: “Ted”, family: “Zlatanov” }
bob” { given: “Bob”, family: “Leech” }

E comentários:

Listing 7. Comments, share_comments

random-string
{
url: “http://images.share.lifelogs.com/funny.jpg”,
comment: “Ha ha”,
posted_when: “2009-03-01T19:00:00+05″
}

“random-string2
{
user: “ted”,
url: “http://developer.amazonwebservices.com/connect/images/amazon/logo_aws.gif”,
comment: “No it doesn’t”,
posted_when: “2009-03-01T20:00:01+05″
}

random-string3
{
url: “http://developer.amazonwebservices.com/connect/images/amazon/logo_aws.gif”,
comment: “No it doesn’t”,
reply_to: “random-string2″,
posted_when: “2009-03-01T20:00:01+05″
}

Vale mencionar:

O Google oferece pelo menos alguns serviços compativeis com esses; esse guia não tem como objetivo comparar os dois serviços. Você poderá encontrar essas comparações online. Essa guia também nao tratará de outras ofertas da Amazon como o Elastic Compute Cloud (EC2), me sendo bem interessante e utéis e certamente poderiam facilitar a sua presença na Web. Finalmente, existem outros databases distribuídos nesse estilo chave-valor, como o CouchDB; Eu realmente recomendo que eles sejam estudados.

We’ll thread comments by looking at the reply_to key. Every post will have a random string as the unique key.

É importante atentar para as convenções abaixo:

* A falta de atributos de usuários significam que o comentário é anônimo;
* A url da foto é a chave para todos os comentários, então mudar essa URL não será permitido;
* S3 objects will have a URL, too, with a bucket name to identify them as S3 objects.
* URL duplicadas de fotos não serão permitidas.

Essa não é a versão final da modelagem da tabela (lembre-se, SimpleDB é muito flexível), mas é o suficiente para iniciarmos.

Fechamento

Você viu os pros e contras do S3 e do SimpleDB. Embora nao seja completa, essa discussao pode ajudá-lo a decidir se o S3 da Amazon e o SimpleDB servem para o seu projeto. Depois de passarmos por esse simples exemplo de uma lista de to-do no SimpleDB, você viu como começar a projetar o modelo de dados de usuário, foto e comentários. Na parte 2, eu configurarei o web site (Apache com mod_perl) e as bibliotecas necessárias para trabalhar com o S3 e o SimpleDB.

 
No Comments

Posted in Perl

 

Leave a Reply