Pergunta

Eu estou procurando uma solução de back-end para um aplicativo escrito em Ruby on Rails ou Merb com dados do punho com vários milhares de milhões de registros. Eu tenho um sentimento que eu tenho que ir com um modelo distribuído e no momento em que eu olhei

HBase com Hadoop

Couchdb

Problemas com solução HBase como eu vê-lo - suporte a Ruby não é muito forte, e Couchdb não chegou a versão 1.0 ainda

.

Você tem sugestão que você usaria para uma quantidade tão grande de dados?

Os dados exigirá importações bastante rápido, por vezes, de 30-40Mb de uma vez, mas as importações virá em pedaços. Então, ~ 95% dos dados de tempo será somente leitura.

Foi útil?

Solução

Dependendo da utilização de dados reais, MySQL ou PostgreSQL deve ser capaz de lidar com um par de bilhões de registros sobre o hardware certo. Se você tem um alto volume particular de pedidos, essas duas bases de dados pode ser replicado em vários servidores (e replicação de leitura é bastante fácil de configurar (em comparação com a replicação vários mestres / gravação).

A grande vantagem de usar um RDBMS com Rails ou Merb é você ganha acesso a todo o suporte excelente ferramenta de acesso a estes tipos de bancos de dados.

Meu conselho é, na verdade, o perfil de seus dados em um par destes sistemas e levá-la de lá.

Outras dicas

Há uma série de soluções diferentes pessoas têm usado. Na minha experiência, isso realmente depende mais de seus padrões de uso relacionados a esses dados e não o grande número de linhas por tabela.

Por exemplo, "Quantas inserções / atualizações por segundo estão ocorrendo." Perguntas como estas vão jogar em sua decisão de qual solução de banco de dados back-end que você vai escolher.

Tome Google, por exemplo:. Há realmente não existe um armazenamento / solução que satisfizesse as suas necessidades de busca, então eles criaram o seu próprio baseado em um Mapa / Reduzir modelo

Uma palavra de aviso sobre HBase e outros projetos dessa natureza (não sei nada sobre CouchDB - I pensar , não é realmente um db em tudo, apenas um armazenamento de chave-valor):

  1. HBase não está sintonizado para a velocidade; ele está atento para escalabilidade. Se a velocidade de resposta é de todo um problema, executar algumas provas de conceito antes de cometer a este caminho.
  2. HBase não suporta junta. Se você estiver usando ActiveRecord e têm mais de uma relação .. bem você pode ver onde isso vai dar.

O projeto Hive, também construído em cima do Hadoop, suporta junta; o mesmo acontece com Pig (mas não é realmente sql). Ponto 1 aplica-se a ambos. Elas são destinadas para dados pesados ??processar tarefas, não o tipo de tratamento que são susceptíveis de fazer com Rails.

Se você quiser escalabilidade para um aplicativo web, basicamente, a única estratégia que funciona é particionar seus dados e fazer o máximo possível para garantir que as partições são isoladas (não precisa falar uns com os outros). Este é um pouco complicado com Rails, uma vez que assume por padrão que não há um banco de dados central. Pode ter havido melhorias nessa frente desde que eu olhei para a questão cerca de um ano e meio atrás. Se você pode particionar seus dados, você pode escalar horizontalmente bastante ampla. Uma máquina MySQL único pode lidar com alguns milhões de linhas (PostgreSQL, provavelmente, pode ser escalado para um maior número de linhas, mas pode trabalhar um pouco mais lento).

Outra estratégia que funciona é ter um mestre-escravo configurado, onde todas as gravações são feitas pelo mestre, e lê são compartilhados entre os escravos (e, possivelmente, o mestre). Obviamente, isso tem que ser feito com bastante cuidado! Assumindo uma alta taxa de leitura / gravação, este pode escalar muito bem.

Se a sua organização tem bolsos profundos, confira o que Vertica, AsterData, e Greenplum tem para oferecer.

O backend dependerá dos dados e como os dados serão acessados.

Mas para o ORM, eu usaria provavelmente DataMapper e escrever um DataObjects adaptador para chegar a qualquer backend que você escolher personalizado.

Eu não tenho certeza o que CouchDB não estar no 1.0 tem a ver com isso. Eu recomendo fazer alguns testes com ele (basta gerar um bilhão de documentos aleatórios) e ver se ele vai realizar-se. Eu diria que ele vai, apesar de não ter um número de versão específico.

CouchDB vai ajudá-lo muito quando se trata de particionamento / sharding seus dados e como, parece que pode encaixar com o seu projecto - especialmente se o seu formato de dados pode mudar no futuro (adicionando ou removendo campos) desde bancos de dados CouchDB não têm esquema.

Há uma abundância de otimizações no CouchDB para aplicativos de leitura pesada, bem e, com base na minha experiência com ele, é onde ele realmente brilha.

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