Pertanyaan ini adalah tentang membuat pilihan arsitektur sebelum menggali rincian eksperimen dan implementasi. Ini tentang kesesuaian, dalam skalabilitas dan kinerja, dari elasticsearch vs MongoDB, untuk tujuan yang agak spesifik.
Secara hipotetis keduanya menyimpan objek data yang memiliki bidang dan nilai, dan memungkinkan untuk menanyakan objek tersebut. Jadi mungkin menyaring subset objek sesuai dengan bidang yang dipilih ad-hoc, adalah sesuatu yang cocok untuk keduanya.
Aplikasi saya akan berputar di sekitar memilih objek sesuai dengan kriteria. Ini akan memilih objek dengan memfilter secara simultan oleh lebih dari satu bidang, dengan kata lain, kriteria penyaringan kueri biasanya akan terdiri dari antara 1 dan 5 bidang, mungkin lebih dalam beberapa kasus. Sedangkan bidang yang dipilih sebagai filter akan menjadi bagian dari jumlah bidang yang jauh lebih besar. Bayangkan sekitar 20 nama bidang yang ada, dan setiap kueri adalah upaya untuk memfilter objek berdasarkan beberapa bidang dari keseluruhan 20 bidang (Bisa kurang dari atau lebih dari 20 nama bidang keseluruhan yang ada, saya hanya menggunakan nomor ini untuk menunjukkan rasio dari bidang ke bidang yang digunakan sebagai filter dalam setiap permintaan diskrit). Pemfilteran bisa dengan keberadaan bidang yang dipilih, serta oleh nilai bidang, misalnya memfilter objek yang memiliki bidang A, dan bidang B di antara x dan y,
Aplikasi saya akan terus melakukan pemfilteran semacam ini, sedangkan tidak akan ada atau sedikit konstanta dalam hal bidang mana yang digunakan untuk pemfilteran setiap saat. Mungkin dalam indeks pencarian elastics perlu didefinisikan, tetapi mungkin bahkan tanpa indeks kecepatan setara dengan MongoDB.
Sesuai data yang masuk ke toko, tidak ada detail khusus tentang itu .. objek akan hampir tidak pernah berubah setelah dimasukkan. Mungkin objek lama perlu dijatuhkan, saya ingin mengasumsikan bahwa dukungan data store kedaluwarsa menghapus hal-hal secara internal atau oleh permintaan aplikasi yang dibuat. (Lebih jarang, objek yang cocok dengan kueri tertentu juga perlu dijatuhkan).
Bagaimana menurut anda? Dan, sudahkah Anda mencoba aspek ini?
Saya tertarik pada kinerja dan skalabilitasnya, dari masing-masing dari dua penyimpanan data, untuk tugas semacam ini. Ini adalah semacam pertanyaan desain arsitektur, dan rincian opsi khusus toko atau pilar permintaan yang harus membuatnya menjadi arsitek dapat diterima sebagai demonstrasi dari saran yang dipikirkan sepenuhnya.
Terima kasih!
sumber
Jawaban:
Pertama, ada perbedaan penting untuk dibuat di sini: MongoDB adalah database tujuan umum, Elasticsearch adalah mesin pencari teks terdistribusi yang didukung oleh Lucene. Orang-orang telah berbicara tentang menggunakan Elasticsearch sebagai basis data tujuan umum tetapi tahu bahwa itu bukan desain aslinya. Saya pikir bahwa tujuan umum database NoSQL dan mesin pencari sedang menuju konsolidasi tetapi seperti berdiri, keduanya berasal dari dua kubu yang sangat berbeda.
Kami menggunakan MongoDB dan Elasticsearch di perusahaan saya. Kami menyimpan data kami di MongoDB dan menggunakan Elasticsearch secara eksklusif untuk kemampuan pencarian teks lengkapnya. Kami hanya mengirim subset bidang data mongo yang kami perlu kueri ke elastis. Kasing penggunaan kami berbeda dengan milik Anda karena data Mongo kami berubah setiap saat: catatan, atau subset bidang catatan, dapat diperbarui beberapa kali sehari dan ini dapat meminta pengindeksan ulang catatan tersebut menjadi elastis. Untuk alasan itu saja, menggunakan elastis sebagai satu-satunya penyimpan data bukanlah pilihan yang baik bagi kami, karena kami tidak dapat memperbarui bidang yang dipilih; kita perlu mengindeks ulang dokumen secara keseluruhan. Ini bukan batasan elastis, ini adalah cara kerja Lucene, mesin pencari yang mendasari elastis. Dalam kasus Anda, fakta bahwa catatan tidak akan t diubah setelah disimpan menyelamatkan Anda dari keharusan membuat pilihan itu. Karena itu, jika keamanan data menjadi perhatian, saya akan berpikir dua kali tentang menggunakan Elasticsearch sebagai satu-satunya mekanisme penyimpanan untuk data Anda. Mungkin sampai di sana pada suatu titik tetapi saya tidak yakin itu ada di sana.
Dalam hal kecepatan, tidak hanya Elastis / Lucene setara dengan kecepatan kueri Mongo, dalam kasus Anda di mana ada "sangat sedikit konstanta dalam hal bidang mana yang digunakan untuk penyaringan setiap saat", itu bisa berupa pesanan dari besarnya lebih cepat, terutama karena dataset menjadi lebih besar. Perbedaannya terletak pada implementasi permintaan yang mendasarinya:
Untuk catatan lama yang kedaluwarsa, Elastic memiliki fitur TTL bawaan. Mongo baru saja memperkenalkannya pada versi 2.2 saya pikir.
Karena saya tidak tahu persyaratan Anda yang lain seperti ukuran data yang diharapkan, transaksi, keakuratan atau seperti apa filter Anda, sulit untuk membuat rekomendasi khusus. Semoga ada cukup banyak di sini untuk memulai.
sumber