Seberapa besar model data memengaruhi skalabilitas dan kinerja dalam apa yang disebut basis data "NoSQL"?

13

Anda tidak pernah dapat berbicara tentang apa yang disebut database "NoSQL" tanpa membawa teorema CAP (Konsistensi, Ketersediaan, Partisi: pilih dua). Jika Anda harus memilih mengatakan, antara MongoDB (Partisi, Konsistensi) dan CouchDB (Ketersediaan, Partisi), yang pertama Anda perlu pikirkan adalah "Apakah saya perlu data yang benar atau saya perlu akses sepanjang waktu?".

Database baru itu dibuat untuk dipartisi. Tetapi bagaimana jika saya tidak melakukannya ? Bagaimana jika saya pikir cukup keren untuk memiliki Kunci / Nilai, Kolom, Dokumen, basis data apa pun alih-alih yang relasional, dan hanya membuat satu contoh server dan tidak pernah membuangnya? Dalam hal itu, bukankah saya akan memiliki ketersediaan dan konsistensi? MongoDB tidak perlu mereplikasi apa pun, jadi itu akan tersedia. Dan CouchDB hanya akan memiliki satu sumber data, jadi itu akan sangat konsisten.

Jadi itu berarti bahwa, dalam hal ini, MongoDB dan CouchDB akan memiliki sedikit perbedaan dalam hal use case? Yah, kecuali tentu saja kinerja, API, dan al, tapi itu akan lebih seperti memilih antara PostgreSQL dan MySQL daripada memiliki dua set persyaratan yang berbeda secara fundamental.

Apakah saya di sini? Bisakah saya mengubah database AP atau CP menjadi AC dengan tidak membuat lebih dari satu instance? Atau ada sesuatu yang saya lewatkan?

Mari kita ajukan pertanyaan secara terbalik. Bagaimana jika saya mengambil basis data relasional, katakanlah MySQL, dan letakkan di konfigurasi master / slave. Saya tidak menggunakan transaksi ACID Jika saya meminta agar setiap tulisan segera disinkronkan ke slave, bukankah itu membuatnya menjadi basis data CP? Dan bagaimana jika saya menyinkronkannya beberapa interval yang telah ditentukan, dan tidak masalah jika klien membaca data basi dari seorang budak. Bukankah itu membuatnya menjadi database AP? Bukankah itu berarti bahwa jika saya melepaskan kepatuhan ACID saya masih dapat menggunakan model hubungan untuk database yang dipartisi?

Intinya: apakah skalabilitas tentang apa yang Anda siap untuk menyerah dalam teorema CAP, lebih dari model data yang mendasarinya? Apakah memiliki Kolom, Dokumen, Nilai Utama, apa pun yang memberi dorongan pada skalabilitas atas model relasional? Bisakah kita merancang basis data relasional yang dirancang dari bawah ke atas untuk toleransi partisi? (Mungkin sudah ada). Bisakah kita membuat ACID database NoSQL sesuai?

Maaf, ini banyak pertanyaan, tetapi saya telah membaca banyak tentang basis data NoSQL baru-baru ini dan bagi saya manfaat terbesar dari penggunaannya adalah mereka lebih sesuai dengan "bentuk" data Anda, daripada hanya partisi, CAP dan menyerah kepatuhan ACID. Bagaimanapun, tidak semua orang memiliki begitu banyak data sehingga mereka perlu mempartisi itu. Apakah ada manfaat kinerja / skalabilitas untuk tidak menggunakan model relasional sebelum saya bahkan berpikir tentang mempartisi data saya?

Laurent Bourgault-Roy
sumber

Jawaban:

8

Apakah menggunakan database NoSQL memberikan dorongan untuk skalabilitas bahkan jika Anda tidak membagikan data? Baiklah mari kita mendefinisikan skalabilitas. Jika Anda mengacu pada skalabilitas sebagai basis data / sistem backend yang bersangkutan, dalam hal Anda memiliki penskalaan vertikal dan horizontal di mana penskalaan horizontal IS data pecahan maka ini menjadi pertanyaan sepele karena kemudian jawabannya sama sekali tidak, karena satu-satunya pilihan yang tersisa adalah penskalaan vertikal (yaitu mendapatkan perangkat keras yang lebih baik). Namun jika Anda berbicara tentang skalabilitas dalam arti yang lebih luas mengacu pada fleksibilitas aplikasi, nilai data, dll ... Maka itu adalah pertanyaan yang sama sekali berbeda dengan sejumlah jawaban. Dan seperti yang Anda sebutkan, seringkali akan sampai pada apa yang Anda lakukan dengan data dan bagaimana data itu harus disimpan. Saya perkenalkan semuanya di sini dengan pernyataan bahwa dalam kebanyakan kasus Anda masih harus menggunakan RDBMS dan NoSQL harus mengisi ceruk pasar. Berikut ini adalah deskripsi dari contoh spesifik di mana basis data NoSQL akan lebih menguntungkan mengingat persyaratan spesifik, dan di mana kita dapat mengabaikan penskalaan horizontal.

Ambil contoh gagasan bahwa Anda membuat sistem penyimpanan file cloud yang mirip dengan google drive, dropbox, atau kotak tetapi alih-alih menggunakan sistem file yang sebenarnya Anda memutuskan bahwa akan lebih bermanfaat bagi Anda untuk melakukan virtualisasi sistem file. Sekarang Anda memiliki masalah karena model data Anda tiba-tiba struktur pohon yang akan menjadi sangat tidak efisien dalam RDBMS (terlepas dari kenyataan bahwa itu adalah bagaimana semuanya diindeks). Karena sekarang Anda memiliki tabel 3 kolom dengan Nama, Pengguna, dan Induk. Pengguna adalah kunci asing ke tabel pengguna dan Parent adalah referensi asing yang dapat dibatalkan kunci asing (nullable karena direktori root tidak dapat memiliki orangtua). Jadi apa kunci utamanya? Dalam hal ini, ini adalah kunci gabungan di semua kolom ... Yang tiba-tiba menjadikan Orang Tua musuh terburuk kita.

Sekarang, alih-alih pikirkan bagaimana Anda akan meletakkannya di beberapa bentuk penyimpanan dokumen? Alih-alih memperjuangkan data Anda dapat bekerja dengannya dan menyimpannya sebagai struktur pohon yang pada gilirannya akan mengurangi waktu pengembangan Anda serta mengurangi biaya pemeliharaan. Jika Anda mengurangi biaya bukankah itu memungkinkan skalabilitas yang berbeda? Plus dalam hal ini Anda membuat sistem dengan benar dari bawah ke atas yang seharusnya memberikan lebih banyak fleksibilitas untuk aplikasi itu sendiri. Saat ini saya menjalankan ini pada satu server menggunakan MongoDB, yang seperti yang Anda jelaskan memberi saya model yang Tersedia, Konsisten yang tidak jauh berbeda dari melihat perbedaan MySQL atau Postgres.

Dengan MongoDB setidaknya Anda dapat menentukan berapa banyak server yang Anda butuhkan untuk berkomunikasi agar permintaan berhasil, ya, Anda dapat mengonversinya menjadi model yang Konsisten dan Tersedia jika Anda memberi tahu semua pertanyaan untuk berkomunikasi dengan semua instance server.

Jadi saya pikir Anda berhak melakukannya karena ada manfaat besar dalam bagaimana data disimpan. Ada hal-hal yang tidak cocok dengan model relasional yang cocok dengan model lain (sebagai contoh singkat lain, Amazon menggunakan beberapa bentuk Graph Database untuk mesin rekomendasi mereka untuk produk).

Apakah saya benar memahami pertanyaan Anda?

Sunting: Akankah lebih banyak data memperlambatnya? Iya. Berapa banyak yang akan memperlambatnya? Sejujurnya saya tidak memiliki pengalaman yang cukup untuk memberikan jawaban yang memadai. Kunci / Nilai: Pada dasarnya tabel pencarian dengan sejumlah besar data yang terkait dengan kunci pencarian. Ini akan menjadi sangat sangat cepat karena Anda hanya dapat melihat semuanya dengan kunci. Kolom / Keluarga: Pada dasarnya toko Kunci / Nilai yang jauh lebih terstruktur. Anda hanya dapat melakukan kueri berdasarkan Kolom dan karenanya ini harus sangat cepat juga. Dokumen: Skema gaya agregasi. Di sini Anda ingin menggabungkan data yang serupa menjadi satu. Denormalisasi ok dan diharapkan untuk database semacam ini. Bergantung pada apakah Anda melakukan banyak penulisan atau pembacaan, Anda dapat mengatur data Anda sehingga didistribusikan di banyak pecahan untuk mendistribusikan penulisan atau pembacaan (perhatikan bahwa Anda dapat membuat pendekatan hibrid yang baik untuk keduanya tetapi umumnya Anda perlu memilih optimasi untuk satu atau yang lain) Grafik: Kekuatan yang satu ini adalah ia dapat membuat dan menghancurkan hubungan dengan sangat cepat. Jika Anda memiliki beberapa data di mana Anda memiliki hubungan yang perlu diubah antara data (pikirkan beberapa bentuk mesin rekomendasi) maka Anda harus menggunakan ini.

Bagaimana Anda menyimpan data di salah satu basis data ini akan memengaruhi kinerja (mirip dengan fakta bahwa jika Anda menyimpan data secara tidak benar di beberapa RDBMS, itu akan memengaruhi kinerja). Jadi, semoga ini menjadi lebih jelas: Anda perlu tahu sistem basis data mana yang harus Anda gunakan serta cara menyimpan data dalam sistem basis data itu.

Harageth
sumber
Ya itu jawaban yang saya harapkan. Sebagai ketepatan, saya maksud skalabilitas sebagai kapasitas sistem untuk menangani semakin banyak tugas tanpa tersedak, lebih dari masalah skalabilitas perangkat keras murni (mungkin itu bukan istilah yang tepat). Sebagai contoh, Nginx dapat menangani lebih banyak permintaan bersamaan dari Apache, karena arsitektur berbasis acara. Dan pertanyaannya agak "Pada mesin dengan perangkat keras tetap, apakah menggunakan basis data non-relasional memungkinkan saya untuk melayani lebih banyak pengguna sebelum saya mencapai batas?"
Laurent Bourgault-Roy
Dalam hal ini tergantung pada sistem database yang Anda gunakan. Untuk contoh sistem file cloud saya di atas, saya menggunakan Redis untuk benar-benar menyimpan file, dan mereka membanggakan dapat menangani 100.000 pertanyaan / detik (karena itu dibangun sebagai kunci memori / value store). Sekarang saya belum benar-benar memuat aplikasi saya diuji untuk melihat apa yang sebenarnya bisa menangani tetapi itulah yang dikatakan situs web Redis. Makhluk ini mengatakan ingat bahwa di balik layar bahwa data diwakili dengan cara yang berbeda tergantung pada jenis sistem basis data yang Anda gunakan. Isi ceruk dengan db yang tepat.
Harageth
1
Saya mengedit respons saya karena itu lebih mudah daripada menambahkan lebih banyak komentar.
Harageth
2
+1 ini adalah awal yang luar biasa di P.SE, harap Anda akan bertahan sebentar dan terus menambahkan konten berkualitas seperti ini!
Jimmy Hoffa
1
Sempurna, dengan hasil edit itu memberi saya banyak wawasan. Terima kasih!
Laurent Bourgault-Roy