Pergunta

Eu pensei que eu poderia usar SimpleDB para cuidar da área mais desafiadora da minha aplicação (tanto quanto escala vai) - twitter-como comentários, mas com localização no topo - até o ponto em que me sentei para realmente começar implementá-lo com SDB.

A primeira coisa, SDB tem um bytes limitação por valor de 1.000 atributo, que não é o suficiente até mesmo para comentários (provavelmente precisará quebrar valores mais longos em vários atributos).

Então, o tamanho máximo de domínio é 10GB. A promessa era que você poderia escalar sem se preocupar com banco de dados sharding etc., desde SDB não se degradam com o aumento da carga de dados. Mas se eu entendi corretamente, com domínios que eu teria exatamente o mesmo problema que com sharding, ie. em algum ponto necessidade de implementar distribuição e consultas registros de dados em vários domínios em nível de aplicação.

Mesmo para os objetos mais simples que eu tenho em toda a aplicação, ou seja. user ratings atômicas, SDB não é uma opção, porque não pode calcular uma média dentro da consulta (tudo é seqüência de base). Assim, para calcular classificação média de usuário para um objeto, eu teria que carregar todos os registros - 250 de cada vez -. E calcular-lo em nível de aplicativo

Estou faltando alguma coisa sobre SDB? 10GB é realmente muito de uma base de dados para superar todas as limitações SDB? Fiquei sinceramente entusiasmado com aproveitando SDB, desde que eu uso S3 e EC2 já, mas agora eu simplesmente não vê um caso de uso.

Foi útil?

Solução

Eu uso SDB em um par de aplicações de grande-ish. A 10 GB limite por domínio faz preocupação mim, mas estamos apostando na Amazon permitindo que este se estender caso precisamos dela. Eles têm um formulário de solicitação em seu site se você quiser mais espaço.

Quanto domínio cruz junta, não pensa em SDB como um banco de dados tradicional. Durante a migração dos meus dados para SDB, eu tive que desnormalizar parte dela para que eu pudesse fazer manualmente o domínio de cruz junta.

Os 1000 byte por limitação atributo era difícil de contornar também. Uma das aplicações que eu tenho é um serviço de blog que armazena mensagens e comentários no banco de dados. Enquanto portá-la sobre a SDB, eu corri para esta limitação. Acabei armazenar os posts e comentários como arquivos no S3, e ler que no meu código. Uma vez que este servidor está em EC2, o tráfego para o S3 não está custando nada extra.

Talvez um dos outros problemas que atente para é o modelo de consistência eventual na SDB. Você não pode gravar dados e, em seguida, lê-lo de volta com qualquer garantia de que os dados recém-escritos será devolvido a você. Eventualmente, os dados serão atualizados.

Tudo isso dito, eu ainda amo SDB. Eu não me arrependo de mudar para ele. Mudei-me de um servidor SQL 2005. Eu acho que tinha muito mais controle com SQL, mas uma vez dando-se que o controle, eu tenho mais flexibilidade. Não necessitando de pré-definir o esquema é incrível. Com uma camada de cache forte e robusto em seu código, é fácil de fazer SDB mais flexível.

Outras dicas

Eu tenho cerca de 50GB em SimpleDB, Sharded por 30 domínios. Eu uso isso para permitir que várias chaves em objetos armazenados no S3, e também para reduzir meus custos S3. Eu não tenho jogado com o uso SimpleDB para pesquisa de texto completo, mas eu não iria tentar fazê-lo.

SimpleDB funciona, é fácil, e assim por diante, mas não é o conjunto certo de recursos para cada situação. No seu caso, se você precisar de agregação, SimpleDB não é a solução certa. Ele é construído em torno da escola de pensamento que o DB é apenas um armazenamento de chaves de valor, e agregação deve ser tratado por um processo de agregação que escreve os resultados de volta para o armazenamento de chaves de valor. Este é exatamente o que é necessário para algumas aplicações.

Aqui é uma descrição de como eu beliscar tostões usando SimpleDB

Vale acrescentar que, enquanto ter que escrever sua própria lógica de fragmentação entre domínios não é o ideal, é em termos de desempenho. Se por exemplo você precisa pesquisar em 100GB de dados, é melhor pedir 20 máquinas segurando 5GB cada para executar a mesma pesquisa na parte eles são responsáveis ??por, em vez de uma máquina ter que realizar toda a tarefa. Se o seu objetivo é acabar com uma lista ordenada, você pode ter os melhores resultados retornados a partir das 20 consultas simultâneas e agrupar-los na máquina de iniciar a solicitação.

Dito isso, eu gostaria mais de ver este abstraído do uso normal e ter algo como "dicas" na API se você deseja obter de nível inferior. Portanto, se acontecer para armazenar 100GB de dados, vamos Amazon decidir se é dividida em 20 máquinas, 10 ou 40, e distribuir o trabalho. Por exemplo, no projeto BigTable do Google, como uma tabela cresce é continuamente dividido em 400MB tablets. Pedindo uma linha de uma tabela é tão simples como isso, e BigTable faz o trabalho de descobrir onde no um comprimido ou milhões de comprimidos em que vive.

Então, novamente, BigTable requer que você escreva MapReduce chama para executar uma consulta, enquanto índices SimpleDB dinamicamente para você, então você ganha alguns, você perde alguns.

Se o tamanho do armazenamento por atributo é o problema que você pode usar S3 para armazenar dados maiores, e armazenar os links para os objetos S3 no SDB. S3 não é apenas para arquivos, é uma solução de armazenamento genérico.

Amazon está tentando levá-lo a implementar um banco de dados simples objeto. Isto é principalmente por razões de velocidade. Pense nos registros do SimpleDB como sendo um ponteiro / chave para um elemento em S3. Desta forma, você pode executar consultas (lenta contra o SimpleDB para obter listas de resultados ou você pode diretamente atingido S3 com uma chave (rápido) para puxar o objeto quando você precisa recuperar ou modificar registros de um-em-um-tempo.

Os limites parecem aplicar-se à corrente Beta liberação. Presumo que permitirá que bancos de dados maiores no futuro, depois de descobrir como eles podem atender a demanda economicamente. Mesmo com os limites, uma base de dados de 10 GB que suporta alta escalabilidade e confiabilidade é um recurso útil e rentável.

Note que a escalabilidade refere-se à capacidade de manter uma curva constante e superficial desempenho , enquanto o volume de dados ou o volume de pedidos cresce. Ele faz não necessariamente desempenho médio ideal, nem significa o armazenamento de dados muito alta capacidade.

Amazon SimpleDB também oferece um serviço gratuito nível , para que possa armazenar até 1GB, transferir até 1GB / mês, usando até 25 horas de tempo de máquina. Enquanto este limite sons muito baixos, o fato de que é livre permite que alguns clientes de baixa escala para usar a tecnologia, sem investir em um farm de servidores grande.

Estou construindo uma aplicação .NET commericial que irá usar SimpleDB como seu armazenamento de dados primários. Eu ainda não estou em produção, mas eu também fui construindo uma biblioteca de código aberto que aborda alguns dos problemas com o uso SimpleDB vs um RDB. Algumas das características do meu roteiro estão relacionados com as questões que você mencionou:

  • particionamento transparente de dados
  • Pseudo transacionalidade
  • spanning transparente de atributos para ultrapassar o limite de 1.000 bytes

SimpleDB ainda está em desenvolvimento ativo e certamente vai acabar com muitas características que não temos hoje (alguns adicionados ao sistema core e alguns nas bibliotecas de código).

A biblioteca .NET é simples Savant .

Eu não comprar todo o hype em torno SimpleDB e com base nos seguintes limitações não pode ver uma razão pela qual ele deve ser usado (eu entendo que agora você pode construir quase tudo com quase qualquer tecnologia, mas esta não é a razão para selecionar um).

Assim, as limitações que eu vi:

  • só pode ser executado na Amazon AWS, você também deve pagar por um monte de funcionários
  • tamanho máximo de domínio (mesa) é de 10 GB
  • comprimento valor de atributo (tamanho do campo) é de 1024 bytes
  • itens máximos em select resposta - 2500
  • tamanho da resposta máxima para Select (a quantidade máxima de dados que podem voltar) - 1Mb, na verdade, você pode verificar todo o limitações aqui
  • tem motoristas só para alguns idiomas (java, PHP, Python, ruby, .net)
  • não permite que caso a pesquisa insensível. Você tem que introduzir campo minúsculas lógica adicional / aplicação.
  • A classificação pode ser feito apenas em um campo
  • por causa de 5s timelimit contagem em pode se comportar estranha . Se 5 segundos se passaram e a consulta não tenha terminado, você acaba com um número parcial e um símbolo que lhe permite continuar a consulta. lógica de aplicação é responsável por recolher todos esses dados um resumindo.
  • tudo é uma UTF-8 cordas, o que torna -lhe um pé no saco para o trabalho com valores não string (como números, datas).
  • triagem tem um comportamento estranho para os números (devido ao fato de que tudo é uma string). Então, agora você tem que fazer um xamânica dançar com estofamento
  • ambos não possuem operações e junta-se
  • nenhum composto,, vários índices de coluna geostática, há chaves estrangeiras

Se isto não é suficiente, então você também tem que esquecer as coisas básicas, como group by, sum average, distinct, bem como manipulação de dados. Em toda a linguagem de consulta é bastante rudimentar e lembra um pequeno subconjunto do que SQL pode fazer.

Assim, a funcionalidade não é realmente maneira mais rico do que Redis / Memcached, mas eu duvido que ele executa tão bom quanto esses dois dbs para seus casos de uso.

Posição SimpleDB-se como um banco de dados NoSQL documento-base de sem esquema, mas a sintaxe de consulta do MongoDB / CounchDB é muito mais expressivo e suas limitações são a forma mais razoável.

E, finalmente - não se esqueça sobre fornecedor bloqueio . Se em um par de anos Azure (ou qualquer outra coisa que parece) irá fornecer uma nuvem de hospedagem 5 vezes mais barato do que a AWS, seria realmente difícil de switch.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top