MongoDB vs Cassandra [ditutup]

738

Saya mengevaluasi apa yang mungkin menjadi opsi migrasi terbaik.

Saat ini, saya menggunakan MySQL (partisi horizontal) sharded, dengan sebagian besar data saya disimpan dalam gumpalan JSON. Saya tidak punya pertanyaan SQL yang rumit (sudah dimigrasikan setelah saya mempartisi db).

Saat ini, sepertinya MongoDB dan Cassandra akan menjadi pilihan. Situasi saya:

  • Banyak bacaan di setiap kueri, penulisan kurang teratur
  • Tidak khawatir tentang skalabilitas "besar"
  • Lebih peduli tentang pengaturan sederhana, pemeliharaan dan kode
  • Minimalkan biaya perangkat keras / server
ming kamu
sumber
4
Statistik tolok ukur kinerja resmi tersedia. Cassandra vs MongoDB vs HBase
Ravi
1
> Banyak bacaan di setiap kueri, tulis kurang teratur => Cari CQRS (pisahkan bacaan Anda dari tulisan Anda mungkin tanpa sumber acara, tetapi periksa apakah Anda dapat memperbarui model baca Anda async .. sinkronisasi mungkin juga berfungsi .. itu tergantung pada penggunaan Anda -cases)
bodrin
2
Ini sebenarnya pertanyaan yang bagus. Saya ingin tahu apakah ada versi yang diperbarui? Yang ini sudah sangat tua sekarang
slashdottir

Jawaban:

584

Banyak bacaan di setiap kueri, lebih sedikit tulisan biasa

Kedua basis data bekerja dengan baik pada pembacaan di mana set data panas cocok di memori. Keduanya juga menekankan model data join-less (dan sebagai gantinya mendorong denormalisasi), dan keduanya memberikan indeks pada dokumen atau baris , meskipun indeks MongoDB saat ini lebih fleksibel.

Mesin penyimpanan Cassandra menyediakan penulisan dengan waktu konstan tidak peduli seberapa besar set data Anda tumbuh. Menulis lebih bermasalah di MongoDB, sebagian karena mesin penyimpanan berbasis b-tree, tetapi lebih karena penguncian multi-granularitas yang dilakukannya.

Untuk analitik, MongoDB menyediakan peta khusus / mengurangi implementasi; Cassandra menyediakan dukungan Hadoop asli, termasuk untuk Hive (gudang data SQL yang dibangun di atas peta Hadoop / reduksi) dan Pig (bahasa analisis khusus Hadoop yang menurut banyak orang lebih cocok untuk memetakan / mengurangi beban kerja daripada SQL). Cassandra juga mendukung penggunaan Spark .

Tidak khawatir tentang skalabilitas "besar"

Jika Anda melihat satu server, MongoDB mungkin lebih cocok. Bagi mereka yang lebih mementingkan penskalaan, arsitektur tanpa-kegagalan-tunggal Cassandra akan lebih mudah diatur dan lebih dapat diandalkan. (Kunci tulis global MongoDB cenderung menjadi lebih menyakitkan juga.) Cassandra juga memberikan lebih banyak kontrol atas bagaimana replikasi Anda bekerja, termasuk dukungan untuk beberapa pusat data.

Lebih peduli tentang pengaturan sederhana, pemeliharaan dan kode

Keduanya sepele untuk diatur, dengan standar out-of-the-box yang wajar untuk satu server. Cassandra lebih mudah diatur dalam konfigurasi multi-server karena tidak ada node peran khusus yang perlu dikhawatirkan.

Jika saat ini Anda menggunakan gumpalan JSON, MongoDB adalah pasangan yang sangat baik untuk kasus penggunaan Anda, mengingat bahwa ia menggunakan BSON untuk menyimpan data. Anda akan dapat memiliki data yang lebih kaya dan lebih dapat ditanyakan daripada yang Anda miliki dalam database Anda saat ini. Ini akan menjadi kemenangan paling penting bagi Mongo.

Michael
sumber
86
Sangat berbeda, sebuah komentar tidak cukup besar, tapi ... Cassandra adalah linear yang dapat diskala linear (waktu diamortisasi diamortisasi baca & tulis) dynamo / google bigtable hybrid yang fitur menulis cepat terlepas dari ukuran data. Set fiturnya minimalis, sedikit di luar nilai kunci yang dipesan. MongoDB adalah toko dokumen yang sangat banyak fitur (dan cepat) dengan biaya daya tahan dan jaminan tentang menulis tetap ada (karena mereka tidak segera ditulis ke disk). Mereka binatang buas yang berbeda dengan filosofi yang berbeda, MongoDB lebih dekat dengan pengganti RDMS ...
Michael
28
sementara Cassandra adalah level yang lebih rendah tetapi memungkinkan untuk skala uber (lihat Twitter / Digg / Facebook), tetapi Anda harus mempertimbangkan bagaimana Anda mengeluarkan data, membuat indeks sekunder, dll, karena tidak ada permintaan fleksibel yang diizinkan.
Michael
11
Karena semua orang menyebut twitter di sini sehubungan dengan Cassandra: mereka tidak menggunakan Cassandra untuk tweet yang bertahan, mereka masih menggunakan MySQL di sini ( engineering.twitter.com/2010/07/cassandra-at-twitter-today.html ). Oke, tapi saya bisa bayangkan mereka masih menyimpan banyak data untuk keperluan lain di Cassandra.
H6.
7
Sepertinya kunci tulis global mungkin telah dihapus di Mongo 2.2 ...
Matt Farmer
16
Bahkan sebelum proyek saya ditayangkan, saya merasakan titik sakit Mongodb. Cadangan panas adalah persyaratan dasar. Untuk melakukan cadangan panas di server Linux, Anda harus terlebih dahulu menyiapkan partisi LVM (tidak begitu umum) dan mengambil snapshot sebelum setiap sesi cadangan. Cara mudah lainnya adalah menggunakan layanan backup berbayar Mongodb. Tapi, layanan itu mahal ($ 2,3 / GB / bulan). Anda akan segera membutuhkan replika untuk toleransi kesalahan. Dengan versi open source, node hanya dapat bertukar data sebagai teks yang jelas. Untuk SSL Anda harus menggunakan edisi Entprise. Dan itu $ 10.000. Selamat tinggal Mongodb. Refactoring kode saya ke Cassandra.
Karthik Sankar
146

Saya telah menggunakan MongoDB secara luas (selama 6 bulan terakhir), membangun sistem manajemen data hirarkis, dan saya dapat menjamin kemudahan pengaturan (instal, jalankan, gunakan!) Dan kecepatannya. Selama Anda berpikir tentang indeks dengan hati-hati, itu bisa benar-benar menjerit, dengan cepat.

Saya mengetahui bahwa Cassandra, karena penggunaannya dengan proyek-proyek skala besar seperti Twitter, memiliki fungsi penskalaan yang lebih baik, meskipun tim MongoDB bekerja pada paritas di sana. Saya harus menunjukkan bahwa saya tidak menggunakan Cassandra di luar tahap uji coba, jadi saya tidak dapat berbicara secara detail.

Tingkah laku nyata bagi saya, ketika kami menilai basis data NoSQL, adalah kueri - Cassandra pada dasarnya hanya toko kunci / nilai raksasa, dan kueri sedikit rumit (setidaknya dibandingkan dengan MongoDB), jadi untuk kinerja Anda harus duplikat data yang cukup banyak sebagai semacam indeks manual. MongoDB, di sisi lain, menggunakan model "permintaan dengan contoh".

Misalnya, Anda memiliki Koleksi (bahasa MongoDB yang setara dengan tabel RDMS) yang berisi Pengguna. MongoDB menyimpan catatan sebagai Dokumen, yang pada dasarnya adalah objek JSON biner. misalnya:

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

Jika Anda ingin menemukan semua pengguna yang disebut Smith yang memiliki hak Admin, Anda cukup membuat dokumen baru (di konsol admin menggunakan Javascript, atau dalam produksi menggunakan bahasa pilihan Anda):

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

... lalu jalankan kueri. Itu dia. Ada tambahan operator untuk perbandingan, pemfilteran RegEx dll, tetapi semuanya sangat sederhana, dan dokumentasi berbasis Wiki cukup bagus.

Richard K.
sumber
54
Pembaruan (8 Agustus 2011): Pusat data Amazon Irlandia Irlandia EC2 mengalami insiden terkait petir tadi malam, dan dalam memilah-milah pemulihan server kami, saya menemukan satu poin yang sangat penting: jika Anda punya satu set replikasi dari dua server (dan mereka mudah diatur), pastikan Anda memiliki simpul Arbiter, jadi jika salah satu turun, yang lain tidak panik dan berhenti dalam mode Sekunder! Percayalah, itu menyakitkan di belakang untuk memilah-milah dengan database besar.
Richard K.
8
untuk menambahkan apa yang dikatakan @Richard K, Anda harus memiliki node arbiter ketika Anda memiliki jumlah genap (primer + sekunder) dalam set replika.
Amareswar
Ditambahkan ke yang mempertimbangkan mongodb ketika agregasi lebih banyak dilakukan pada analisis data.
user1503117
As long as you think about indexes carefully, it can absolutely scream along, speed-wise.Tunggu sampai memori fisik Anda penuh dan OS memulai kesalahan halaman lol
sturcotte06
117

Mengapa memilih antara database tradisional dan penyimpanan data NoSQL? Gunakan keduanya! Masalah dengan solusi NoSQL (di luar kurva belajar awal) adalah kurangnya transaksi - Anda melakukan semua pembaruan untuk MySQL dan memiliki MySQL mengisi toko data NoSQL untuk dibaca - Anda kemudian mendapat manfaat dari kekuatan masing-masing teknologi. Ini memang menambah kerumitan, tetapi Anda sudah memiliki sisi MySQL - cukup tambahkan MongoDB, Cassandra, dll ke dalam campuran.

Datastore NoSQL umumnya berskala jauh lebih baik daripada DB tradisional untuk spesifikasi yang sama - ada alasan mengapa Facebook, Twitter, Google, dan sebagian besar pemula menggunakan solusi NoSQL. Bukan hanya Geeks yang mendapatkan teknologi tinggi.

Jason Grant Taylor
sumber
8
Saya sangat setuju. Saya menggunakan mongodb + mysql di salah satu produk yang akan saya buat. Ini adalah awan produk keuangan yang akan datang. mysql digunakan di mana kita benar-benar membutuhkan kemampuan transaksional. mongodb digunakan untuk menyimpan struktur data kompleks non-komputasi yang hanya perlu ditarik ketika diperlukan. bekerja dengan baik sejauh ini. :)
Ram on Rails-n-React
Saya juga menggunakan pendekatan ganda seperti itu di sebagian besar proyek saya, dan di beberapa yang lain sistem file yang dipasang NFS digunakan bersama dengan PostgreSQL untuk gumpalan seismik mendekati 1 Gb dalam beberapa kasus. Path adalah sejenis query ke database nilai kunci.
Audrius Meskauskas
1
Berikut ini adalah tautan ke pertanyaan yang saya ajukan tentang cara membuat basis data sql dan nosql: dba.stackexchange.com/questions/102053/... Saya dapat menggunakan beberapa wawasan yang mungkin Anda miliki
j
Dia sudah melarikan diri dari transaksi untuk kebaikan => sekarang skalabilitas yang tak terbatas mungkin terjadi .. jika tidak -> tidak :)
bodrin
1
Ini bukan solusi yang baik jika data Anda didistribusikan
Esteban Verbel
60

Saya mungkin akan menjadi orang aneh, tapi saya pikir Anda harus tetap menggunakan MySQL. Anda belum menggambarkan masalah nyata yang perlu Anda selesaikan, dan MySQL / InnoDB adalah back-end penyimpanan yang sangat baik bahkan untuk data gumpalan / json.

Ada trik umum di antara para insinyur Web untuk mencoba menggunakan lebih banyak NoSQL segera setelah realisasi datang bahwa tidak semua fitur dari RDBMS digunakan. Ini saja bukan alasan yang baik, karena paling sering database NoSQL memiliki mesin data yang agak buruk (apa yang MySQL sebut sebagai mesin penyimpanan).

Sekarang, jika Anda bukan dari jenis itu, maka silakan tentukan apa yang hilang di MySQL dan Anda cari di database yang berbeda (seperti, sharding otomatis, failover otomatis, replikasi multi-master, jaminan konsistensi data yang lebih lemah di cluster membayar dalam throughput tulis yang lebih tinggi, dll).

Kostja
sumber
13
Dia menggunakan sharding, yang berarti datanya dipartisi secara manual di seluruh server. Mongodb dapat mengotomatiskan sharding, yang mungkin bermanfaat.
fabspro
18
Dia juga menyimpan sebagian besar gumpalan JSON di RDBMS - membuat desain relasional (fitur) tidak berguna.
Damir Sudarevic
4
Model data dan sharding otomatis memang berbeda, tetapi ketika memilih database, Anda harus melihat mesin penyimpanan terlebih dahulu , dan sisa bel dan peluit kedua. Bagaimana kinerja mesin penyimpanan di bawah lonjakan beban? Bagaimana cara fitur autosharding akan tampil di bawah lonjakan inflow data? Sebelum Anda melepaskan kontrol ke database untuk aspek-aspek penting ini, Anda sebaiknya memastikan itu akan mampu melakukan tugas.
Kostja
7
Model relasional adalah salah satu model data yang paling dipikirkan dengan baik, efisien untuk diterapkan dan hemat di luar sana. "Rendering fitur-fitur desain relasional tidak berguna" mungkin berhubungan dengan kendala, pemicu, atau integritas referensial - tetapi ini semua dibayar per penggunaan.
Kostja
20

Saya belum pernah menggunakan Cassandra, tetapi saya telah menggunakan MongoDB dan berpikir itu luar biasa.

Jika Anda setelah penyetelan sederhana, ini dia: Anda cukup untar MongoDB dan jalankan daemon mongod dan hanya itu ... sedang berjalan.

Jelas itu hanya permulaan, tetapi untuk memulai Anda mudah.

Dalton
sumber
22
AFAIK, hal yang sama berlaku untuk Cassandra juga. Untar, jalankan daemon. Cluster pengujian telah siap dan siap untuk diproduksi!
asgs
13

Saya melihat presentasi di mongodb kemarin. Saya pasti bisa mengatakan bahwa pengaturan itu "sederhana", sesederhana membongkar dan menyalakannya. Selesai

Saya percaya bahwa baik mongodb dan cassandra akan berjalan di hampir semua perangkat keras linux biasa sehingga Anda tidak akan menemukan banyak penghalang di daerah itu.

Saya pikir dalam kasus ini, pada akhirnya, itu akan turun ke mana Anda secara pribadi merasa lebih nyaman dengan dan yang memiliki perangkat yang Anda sukai. Sejauh presentasi di mongodb, presenter menunjukkan bahwa toolset untuk mongodb cukup ringan dan tidak ada banyak (mereka mengatakan benar-benar) alat yang mirip dengan apa yang tersedia untuk MySQL. Ini tentu saja pengalaman mereka jadi YMMV. Satu hal yang saya sukai dari mongodb adalah bahwa tampaknya ada banyak dukungan bahasa untuk itu (Python, dan .NET menjadi dua yang saya terutama gunakan).

Daftar situs yang menggunakan mongodb cukup mengesankan , dan saya tahu bahwa twitter baru saja beralih menggunakan cassandra.

GrayWizardx
sumber
4
Pada akhirnya, itu adalah perbandingan apel dengan jeruk. Kedua database memiliki kekuatan masing-masing. Berikut adalah beberapa hal yang perlu dipertimbangkan - Model objek, indeks sekunder, skalabilitas tulis, ketersediaan tinggi, dll. Memiliki posting blog yang menjelaskan perbedaan strategis tingkat tinggi antara mongodb dan cassandra di sini - scalegrid.io/blog/cassandra-vs-mongodb
Dharshan