MongoDB vs. Cassandra [fechado]

738

Estou avaliando qual pode ser a melhor opção de migração.

Atualmente, estou em um MySQL fragmentado (partição horizontal), com a maioria dos meus dados armazenados em blobs JSON. Eu não tenho nenhuma consulta SQL complexa (já migrada depois que particionei meu banco de dados).

No momento, parece que tanto o MongoDB quanto o Cassandra seriam opções prováveis. Minha situação:

  • Muitas leituras em todas as consultas, gravações menos regulares
  • Não está preocupado com escalabilidade "maciça"
  • Mais preocupado com a configuração, manutenção e código simples
  • Minimize o custo de hardware / servidor
ming yow
fonte
4
Está disponível uma estatística oficial de benchmark de desempenho. Cassandra vs MongoDB vs HBase
Ravi
1
> Muitas leituras em todas as consultas, gravações menos regulares => Procure CQRS (separe suas leituras das gravações, provavelmente sem fonte de eventos, mas verifique se você pode atualizar o modelo de leitura como assíncrono. A sincronização também pode funcionar .. depende do seu uso (case)
bodrin
2
Esta é uma ótima pergunta, na verdade. Gostaria de saber se existe uma versão atualizada dele? Este é muito velho agora #
slashdottir

Respostas:

584

Muitas leituras em todas as consultas, menos gravações regulares

Ambos os bancos de dados têm um bom desempenho nas leituras onde o conjunto de dados quentes se encaixa na memória. Ambos também enfatizam modelos de dados sem junção (e incentivam a desnormalização) e fornecem índices em documentos ou linhas , embora os índices do MongoDB sejam atualmente mais flexíveis.

O mecanismo de armazenamento do Cassandra fornece gravações em tempo constante, independentemente do tamanho do seu conjunto de dados. As gravações são mais problemáticas no MongoDB, em parte por causa do mecanismo de armazenamento baseado em árvore b, mas mais por causa do bloqueio de granularidade múltipla .

Para análises, o MongoDB fornece um mapa personalizado / reduz a implementação; Cassandra fornece suporte nativo ao Hadoop, inclusive para o Hive (um data warehouse SQL construído no mapa / redução do Hadoop) e o Pig (uma linguagem de análise específica do Hadoop que muitos consideram mais adequada para mapear / reduzir as cargas de trabalho do que o SQL). Cassandra também suporta o uso do Spark .

Não está preocupado com escalabilidade "maciça"

Se você está procurando um único servidor, o MongoDB provavelmente é o mais adequado. Para os mais preocupados com o dimensionamento, a arquitetura sem ponto único de falha do Cassandra será mais fácil de configurar e mais confiável. (O bloqueio de gravação global do MongoDB também tende a se tornar mais doloroso.) Cassandra também oferece muito mais controle sobre como sua replicação funciona, incluindo suporte para vários data centers.

Mais preocupado com a configuração, manutenção e código simples

Ambos são triviais de configurar, com padrões prontos para uso razoáveis ​​para um único servidor. O Cassandra é mais simples de configurar em uma configuração de vários servidores, pois não há nós de função especial para se preocupar.

Se atualmente você está usando blobs JSON, o MongoDB é uma combinação incrivelmente boa para o seu caso de uso, já que ele usa o BSON para armazenar os dados. Você poderá ter dados mais ricos e questionáveis ​​do que em seu banco de dados atual. Esta seria a vitória mais significativa para Mongo.

Michael
fonte
86
Totalmente diferente, um comentário não é grande o suficiente, mas ... Cassandra é um híbrido de dínamo linearmente escalável (leituras e gravações em tempo constante amortizado) / google bigtable que apresenta gravações rápidas, independentemente do tamanho dos dados. Seu conjunto de recursos é minimalista, um pouco além do de um armazenamento de valores-chave ordenado. O MongoDB é um repositório de documentos com muitos recursos (e rápido), ao custo de durabilidade e garante a persistência de gravações (já que elas não são gravadas imediatamente em disco). Eles são diferentes animais, com diferentes filosofias, MongoDB de mais perto de um substituto RDMS ...
Michael
28
enquanto Cassandra é de nível mais baixo, mas permite escalonamento excessivo (consulte Twitter / Digg / Facebook), mas você terá que ser deliberado sobre como distribuir seus dados, criar índices secundários etc., pois nenhuma consulta flexível é permitida.
244 Michael
11
Como todos mencionaram o twitter aqui em relação ao Cassandra: eles não estão usando o Cassandra para persistir tweets, eles ainda usam o MySQL aqui ( engineering.twitter.com/2010/07/cassandra-at-twitter-today.html ). Ok, mas posso imaginar que eles ainda armazenam muitos dados para outros fins no Cassandra.
H6
7
Parece que o bloqueio de gravação global pode ter sido removido em Mongo 2,2 ...
Matt fazendeiro
16
Mesmo antes de meu projeto ser lançado, estou sentindo os pontos negativos do Mongodb. O backup a quente é um requisito básico. Para fazer um backup quente em um servidor Linux, você deve primeiro configurar uma partição LVM (não tão comum) e tirar uma captura instantânea antes de cada sessão de backup. Outra maneira fácil é usar o serviço de backup pago Mongodb. Mas, esse serviço é caro (2,3 $ / GB / mês). Em breve, você precisará de um replicaset para tolerância a falhas. Com a versão de código aberto, os nós podem trocar dados apenas como texto não criptografado. Para SSL, você precisa ir com a edição do Entprise. E isso é 10.000 $. Adeus, Mongodb. Refatorando meu código para Cassandra.
Karthik Sankar
146

Eu usei o MongoDB extensivamente (nos últimos 6 meses), construindo um sistema hierárquico de gerenciamento de dados e posso garantir a facilidade da instalação (instale, execute, use!) E a velocidade. Contanto que você pense nos índices com cuidado, ele pode gritar com toda a velocidade.

Entendo que o Cassandra, devido ao seu uso em projetos de grande escala como o Twitter, possui uma melhor funcionalidade de dimensionamento, embora a equipe do MongoDB esteja trabalhando em paridade lá. Devo salientar que não usei Cassandra além do estágio de teste, por isso não posso falar pelos detalhes.

A verdadeira vantagem para mim, quando estávamos avaliando os bancos de dados NoSQL, era a consulta - Cassandra é basicamente apenas um armazenamento de chave / valor gigante, e a consulta é um pouco complicada (pelo menos em comparação com o MongoDB). duplicar muitos dados como uma espécie de índice manual. O MongoDB, por outro lado, usa um modelo "consulta por exemplo".

Por exemplo, digamos que você tenha uma coleção (linguagem do MongoDB para o equivalente a uma tabela RDMS) contendo usuários. O MongoDB armazena registros como Documentos, que são basicamente objetos JSON binários. por exemplo:

{
   FirstName: "John",
   LastName: "Smith",
   Email: "[email protected]",
   Groups: ["Admin", "User", "SuperUser"]
}

Se você deseja encontrar todos os usuários chamados Smith que têm direitos de administrador, basta criar um novo documento (no console administrativo usando Javascript ou em produção usando o idioma de sua escolha):

{
   LastName: "Smith",
   Groups: "Admin"
}

... e, em seguida, execute a consulta. É isso aí. Existem operadores adicionados para comparações, filtragem RegEx, etc., mas tudo é bastante simples, e a documentação baseada em Wiki é muito boa.

Richard K.
fonte
54
Atualização (8 de agosto de 2011): O datacenter da Amazon EC2 na Irlanda teve um incidente relacionado a raios na noite passada e, ao resolver a recuperação de servidores, descobri um ponto crucial: se você tem um conjunto de replicação de dois servidores (e eles é fácil de configurar), verifique se você possui um nó de árbitro; portanto, se um cair, o outro não entrará em pânico e parado no modo secundário! Confie em mim, isso é difícil para resolver um grande banco de dados.
Richard K.
8
para adicionar o que @Richard K disse, você deve ter um nó de árbitro quando tiver um número par de nós (primário + secundário) em um conjunto de réplicas.
Amareswar
Adicionado a isso, considere o mongodb quando mais agregação for feita na análise de dados.
user1503117
As long as you think about indexes carefully, it can absolutely scream along, speed-wise.Espere até que sua memória física fica cheio eo sistema operacional começa página falha lol
sturcotte06
117

Por que escolher entre um banco de dados tradicional e um repositório de dados NoSQL? Use ambos! O problema com as soluções NoSQL (além da curva de aprendizado inicial) é a falta de transações - você faz todas as atualizações no MySQL e o MySQL preenche um repositório de dados NoSQL para leituras - e então se beneficia dos pontos fortes de cada tecnologia. Isso adiciona mais complexidade, mas você já tem o lado MySQL - basta adicionar MongoDB, Cassandra, etc à mistura.

Os datastores NoSQL geralmente têm uma escala melhor do que um banco de dados tradicional para as mesmas especificações - existe uma razão pela qual o Facebook, Twitter, Google e a maioria das empresas iniciantes estão usando as soluções NoSQL. Não são apenas os nerds que estão no topo das novas tecnologias.

Jason Grant Taylor
fonte
8
Eu concordo totalmente. Estou usando o mongodb + mysql em um dos próximos produtos que estou arquitetando. É uma próxima nuvem de produtos financeiros. O mysql é usado onde precisamos absolutamente de recursos transacionais. O mongodb é usado para armazenar estruturas de dados complexas que não são de computação e que precisam ser extraídas quando necessário. trabalhando bem até agora. :)
Ram on Rails-n-React
Também usei uma abordagem dupla na maioria dos meus projetos e, em outras, o sistema de arquivos montado NFS foi usado junto com o PostgreSQL para blobs sísmicos próximos de 1 Gb em alguns casos. Um caminho é um tipo de consulta ao banco de dados de valores-chave.
Audrius Meskauskas
1
Aqui está um link para uma pergunta que eu fiz sobre como arquitetar bancos de dados sql e nosql : dba.stackexchange.com/questions/102053/… Eu poderia usar algumas dicas que você possa ter
j
Ele já escapou de transações para boa => agora escalabilidade infinita pode ser possível .. outra forma -> não :)
bodrin
1
Esta não é uma boa solução se seus dados são distribuídos
Esteban Verbel
60

Provavelmente vou ser um homem estranho, mas acho que você precisa ficar com o MySQL. Você não descreveu um problema real que precisa resolver, e o MySQL / InnoDB é um excelente back-end de armazenamento, mesmo para dados blob / json.

Existe um truque comum entre os engenheiros da Web para tentar usar mais NoSQL, assim que a realização ocorre, que nem todos os recursos de um RDBMS são usados. Isso por si só não é um bom motivo, já que os bancos de dados NoSQL costumam ter mecanismos de dados bastante ruins (o que o MySQL chama de mecanismo de armazenamento).

Agora, se você não é desse tipo, especifique o que está faltando no MySQL e procurará em um banco de dados diferente (como compartilhamento automático, failover automático, replicação multimestre, garantia de consistência de dados mais fraca no cluster pagando com maior taxa de transferência de gravação, etc).

Kostja
fonte
13
Ele está usando sharding, o que significa que seus dados são particionados manualmente entre servidores. O Mongodb pode automatizar o sharding, o que pode ser um benefício.
Fabspro #
18
Ele também está armazenando principalmente blobs JSON no RDBMS - tornando o design relacional (recursos) inútil.
Damir Sudarevic 22/03
4
O modelo de dados e o sharding automático são realmente diferentes, mas ao escolher um banco de dados, é necessário examinar primeiro o mecanismo de armazenamento e, em seguida, o restante dos sinos e assobios. Como o mecanismo de armazenamento vai funcionar sob um pico de carga? Como o recurso de compartilhamento automático será executado sob um pico de entrada de dados? Antes de abandonar o controle do banco de dados por esses aspectos importantes, é melhor garantir que ele seja capaz da tarefa.
precisa saber é o seguinte
7
O modelo relacional é um dos modelos de dados mais bem pensados, eficientes para implementar e econômicos por aí. "Tornar inúteis os recursos de design relacional" pode estar relacionado a restrições, gatilhos ou integridade referencial - mas todos são pagos por uso.
21413 Kostja
20

Eu não usei Cassandra, mas usei o MongoDB e acho incrível.

Se você deseja uma configuração simples, é isso: você simplesmente descompacta o MongoDB e executa o daemon mongod e é isso ... está em execução.

Obviamente, isso é apenas um começo, mas para você começar, é fácil.

Dalton
fonte
22
AFAIK, o mesmo se aplica a Cassandra também. Untar, execute o daemon. O cluster de teste está configurado e pronto para produção!
ASGs
13

Vi uma apresentação no mongodb ontem. Definitivamente, posso dizer que a instalação foi "simples", tão simples quanto descompactar e inicializar. Feito.

Eu acredito que o mongodb e o cassandra rodarão em praticamente qualquer hardware Linux normal, então você não deve encontrar muita barreira nessa área.

Penso que, neste caso, no final das contas, tudo se resume a quem você se sente mais à vontade e qual o conjunto de ferramentas que você prefere. Quanto à apresentação no mongodb, o apresentador indicou que o conjunto de ferramentas para o mongodb era bastante leve e que não havia muitas (disseram realmente) ferramentas semelhantes às disponíveis para o MySQL. Esta foi, obviamente, a experiência deles, então YMMV. Uma coisa que gostei no mongodb foi que parecia haver muito suporte à linguagem para ele (Python e .NET são os dois que eu mais uso).

A lista de sites usando o mongodb é bastante impressionante , e eu sei que o twitter acabou de usar o cassandra.

GrayWizardx
fonte
4
No final do dia, é a comparação entre maçãs e laranjas. Ambos os bancos de dados têm seus próprios pontos fortes. Aqui estão algumas coisas a considerar: modelo de objeto, índices secundários, escalabilidade de gravação, alta disponibilidade, etc., tem uma postagem no blog que explica as diferenças estratégicas de alto nível entre mongodb e cassandra aqui - scalegrid.io/blog/cassandra-vs-mongodb
Dharshan