Mnesia: kelebihan dan perbedaan

22

Apa kelebihan Mnesia dari implementasi basis data SQL utama dan bagaimana perbedaannya?

Bisakah saya menggunakan database untuk menyimpan data dalam jumlah sangat besar tanpa penurunan kinerja yang nyata?

Yasir Arsanukaev
sumber
4
Saya pikir pertanyaan ini perlu sedikit lebih fokus. Bisakah Anda membuat daftar kriteria yang akan Anda gunakan untuk menilai keuntungan atau perbedaan dari implementasi basis data lainnya? Ini sepertinya adalah kandidat untuk artikel / daftar wikipedia, bukan sesuatu yang bisa dijawab di sini. Selain itu, mengingat bagaimana Mnesia benar-benar lebih mirip dengan CouchDB, tidak adil untuk menanyakan bagaimana perbandingannya dengan implementasi SQL "utama" tanpa menyebutkan yang ingin Anda bandingkan. Dibandingkan dengan SQLServer atau Oracle, itu bahkan tidak menutup node-ke-node untuk kinerja.
jcolebrand

Jawaban:

31

Maaf sudah terlambat ke pesta. :) Inilah jawaban saya, berdasarkan telah menggunakan Mnesia sejak tahun 1996 dan berbagai teknologi database lainnya sejak tahun 1988.

Mnesia dan MySQL memang binatang yang berbeda, dan yang mana yang terbaik sangat tergantung pada bagaimana Anda bermaksud menggunakannya.

Jika aplikasi Anda ditulis dalam bahasa Erlang, Mnesia memungkinkan Anda untuk menyimpan data dalam ruang memori yang sama dengan aplikasi Anda, yang berarti Anda dapat mengambil objek data tunggal secepat beberapa mikrodetik. Ini tidak mungkin di MySQL, karena aplikasi Anda dan database akan dipisahkan dalam memori. Alasan mengapa Mnesia dapat melakukan ini dan masih kuat, adalah bahwa Erlang menerapkan 'perlindungan' memori di tingkat bahasa.

Secara keseluruhan, database SQL cenderung mendukung throughput lebih dari latensi, dan ketika datang ke latensi, Mnesia + Erlang umumnya luar biasa. Anda perlu memutuskan mana yang paling penting bagi Anda. Seperti yang tertulis dalam dokumen (di atas), aplikasi target Mnesia adalah aplikasi switching telekomunikasi, di mana persyaratan waktu respons untuk mis. Pengaturan panggilan sekitar 20 ms. Ini pada dasarnya berarti bahwa Anda bisa membaca dari database hanya jika data berada dalam memori bersama, tetapi akan menghindari penulisan ke penyimpanan persisten berdasarkan per-panggilan-pengaturan. OTOH, aplikasi ini praktis tidak memerlukan dukungan permintaan ad-hoc, dan tidak menggunakan set data yang sangat besar. Beberapa pekerjaan telah dilakukan untuk memperluas kesesuaian Mnesia untuk domain lain, tetapi itu bukan prioritas untuk tim pengembangan Erlang / OTP. Mnesia adalah apa adanya, dan cenderung tetap seperti itu.

Dalam tautan di atas di mana Mnesia dan MySQL dibandingkan untuk kecepatan, orang harus ingat bahwa itu ada di eJabberd, yang berjalan melawan satu server jika itu MySQL dan menjalankan database yang sepenuhnya direplikasi jika itu Mnesia - dan kelompok eJabberd besar dapat memiliki sebanyak 10 atau lebih erlang node (dan karenanya, 10 atau lebih replika Mnesia). Dari sudut pandang redundansi, ini cukup konyol dan mahal, dan Mnesia sama sekali tidak memaksa Anda untuk melakukannya. Ini jelas memberikan membaca cepat jahat pada setiap node, tetapi menulis akan sangat mahal. Beberapa perbandingan yang saya baca akhirnya membandingkan Mnesia terdistribusi dengan MySQL node tunggal; jika redundansi tidak diperlukan untuk MySQL, seharusnya tidak diperlukan juga untuk Mnesia. Mnesia cukup fleksibel dalam memungkinkan Anda memilih pola replikasi, dan lokasi data transparan untuk aplikasi.

Mnesia juga tidak terbatas pada 2 GB per tabel (meskipun opsi penyimpanan tertentu ). Basis data Mnesia terbesar yang saya tahu memiliki ca 600 GB data dalam (64-bit) RAM + disk - meskipun saya tidak merekomendasikan ini. Apa pun hingga 10-20 GB harus sepenuhnya baik-baik saja dengan perangkat keras modern, tetapi abaikan disc_only_copies sepenuhnya dan gunakan disc_copies - beli lebih banyak RAM jika perlu. Saya akan berpikir dua kali sebelum menggunakan dukungan sharding (mnesia_frag) - itu berfungsi, tetapi jarang sepadan dengan masalahnya.

Mungkin perbedaan terbesar antara Mnesia dan MySQL adalah SQL itu sendiri: Mnesia tidak benar-benar memiliki fungsi yang sebanding; QLC menawarkan beberapa dukungan untuk permintaan ad-hoc, tetapi tidak dalam tingkat yang sama dengan SQL, dan tingkat optimisasi kueri juga tidak. Dalam tooling dan provisi, MySQL juga lebih unggul, dan jika Anda memerlukan analitik, tidak ada pertanyaan yang harus Anda pilih (yaitu BUKAN Mnesia).

Cara terbaik untuk melihat Mnesia adalah sebagai perluasan ke bahasa Erlang. Ini menempatkan data tepat di ujung jari Anda, dan sangat baik untuk set data kecil di mana struktur data dan pola akses dikenal. Untuk tujuan ini, menggunakan MySQL sama tidak nyamannya dengan menggunakan Mnesia untuk hal-hal di mana MySQL bekerja paling baik.

Sebagian besar aplikasi berada di antara keduanya, dan di sinilah ia menjadi panggilan penilaian. Anda mungkin akhirnya menggunakan keduanya ...

pengguna30792
sumber
3
Terima kasih atas jawabannya. Ini adalah penjelasan terbaik yang pernah saya baca tentang mnesia.
Akshat Jiwan Sharma
1
Terima kasih telah berbagi pengalaman Anda dengan kami, ini jauh lebih berharga daripada membaca blog apa pun.
Rahul Gautam
Jawaban yang bagus, tetapi saya bahkan lebih bingung sekarang.
HIRA THAKUR
Jawaban yang sangat teliti. Jadi, jika saya memahami ini dengan benar, Mnesia - akan sempurna untuk beberapa di Memory key / Value store daripada Memcached atau Redis atau solusi serupa, di mana Anda hanya ingin kecepatan, dan tidak perlu untuk analisis atau penyimpanan "SQL query-mampu" persisten? Untuk yang lainnya saya lebih baik menggunakan sesuatu seperti MariaDB / Postgres atau Mongo / Cassandra / RIAK? Untuk memperjelas - Saya sedang belajar Elixir, tidak benar-benar Erlang (berasal dari latar belakang Ruby / Perl), dan mencoba untuk mencari tahu tumpukan terbaik bagi saya untuk menggantikan Rails / Sinatra dengan MariaDB & Redis
konung
13

Dari dokumentasi :

Mnesia adalah Sistem Manajemen Basis Data terdistribusi, sesuai untuk aplikasi telekomunikasi dan aplikasi Erlang lainnya yang membutuhkan pengoperasian terus-menerus dan properti real-time lunak. Ini adalah salah satu bagian dari Open Telecom Platform (OTP), yang merupakan platform sistem kontrol untuk membangun aplikasi telekomunikasi.

Khususnya tingkat toleransi kesalahan yang sangat tinggi yang diperlukan dalam banyak sistem nonstop, dikombinasikan dengan persyaratan pada DBMS untuk berjalan di ruang alamat yang sama dengan aplikasi, telah mengarahkan kami untuk mengimplementasikan DBMS baru. disebut Mnesia. Mnesia diimplementasikan dalam, dan terhubung sangat erat dengan, bahasa pemrograman Erlang dan menyediakan fungsionalitas yang diperlukan untuk implementasi sistem telekomunikasi yang toleran terhadap kesalahan. Mnesia adalah DBMS Terdistribusi multi-pengguna yang khusus dibuat untuk aplikasi telekomunikasi industri yang ditulis dalam bahasa pemrograman simbolis Erlang, yang juga merupakan bahasa target yang dituju. Mnesia mencoba untuk mengatasi semua masalah manajemen data yang diperlukan untuk sistem telekomunikasi biasa dan memiliki sejumlah fitur yang biasanya tidak ditemukan dalam database tradisional.

Dalam aplikasi telekomunikasi ada kebutuhan yang berbeda dari fitur yang disediakan oleh DBMS tradisional. Aplikasi yang sekarang diimplementasikan dalam bahasa Erlang membutuhkan campuran berbagai fitur, yang umumnya tidak dipenuhi oleh DBMS tradisional. Mnesia dirancang dengan persyaratan sebagai berikut:

Pencarian nilai / kunci waktu-nyata cepat

Permintaan non-waktu rumit terutama untuk operasi dan pemeliharaan

Data terdistribusi karena aplikasi terdistribusi

Toleransi kesalahan tinggi

Konfigurasi ulang dinamis

Benda kompleks

Apa yang membedakan Mnesia dari kebanyakan DBMS lainnya adalah bahwa ia dirancang dengan masalah manajemen data yang khas pada aplikasi telekomunikasi. Oleh karena itu Mnesia menggabungkan banyak konsep yang ditemukan dalam database tradisional, seperti transaksi dan pertanyaan dengan konsep yang ditemukan dalam sistem manajemen data untuk aplikasi telekomunikasi, seperti operasi real-time yang sangat cepat, tingkat toleransi kesalahan yang dapat dikonfigurasi (dengan cara replikasi) dan kemampuan untuk mengkonfigurasi ulang sistem tanpa menghentikan atau menangguhkannya. Mnesia juga menarik karena hubungannya yang erat dengan bahasa pemrograman Erlang, sehingga hampir mengubah Erlang menjadi bahasa pemrograman basis data. Ini memiliki banyak manfaat, yang terpenting adalah ketidakcocokan impedansi antara format data yang digunakan oleh DBMS dan format data yang digunakan oleh bahasa pemrograman,

Mnesia versus MySQL, kinerja :

ejabberd mengkonsumsi lebih sedikit sumber daya komputasi ketika menggunakan beberapa * database SQL daripada ketika menggunakan Mnesia internal. Anda mungkin tertarik dengan topik itu ketika Anda memiliki banyak pengguna secara bersamaan (lebih dari 1000, misalnya). Dengan beberapa pengguna secara bersamaan, konsumsi CPU ejabberd dapat diabaikan sehingga admin dari server kecil tidak peduli untuk men-setup server SQL dan database eksternal.

CouchDB v. Mnesia, V. MySQL, dan topik Mnesia lainnya :

Satu wawasan yang langsung muncul di benak saya adalah bahwa walaupun jelas bagi saya cara menyusun data untuk MySQL, itu kurang begitu untuk Mnesia, dan untuk CouchDB saya masih belum sepenuhnya yakin dengan pendekatan terbaik. Untuk saat ini, berikut adalah beberapa poin yang lebih jelas:

'Catatan' memiliki bidang 'numplays' yang jelas menunjukkan berapa kali itu diputar. Ini bagus di MySQL, tetapi jika saya hanya memasukkan bidang ini ke dalam dokumen untuk CouchDB saya akan mendapatkan revisi duplikat lengkap dari dokumen dalam database setiap kali perubahan nomor satu ini, yang tampaknya sangat tidak efisien.

Tata letak tiga tabel di MySQL dari catatan, tag, dan tabel tautan di antara mereka (lihat skrip jika tidak jelas) adalah (setidaknya bagi saya) jelas solusi yang tepat, tetapi ada banyak cara yang mungkin untuk melakukan ini baik di Mnesia dan CouchDB dan saya menemukan saya tidak punya jawaban secara intuitif.

Singkatnya, ini dirancang untuk tujuan yang sangat spesifik dan tampaknya dirancang dengan baik untuk memenuhi tujuan tersebut. Tidak ada satu database yang dapat dibandingkan secara abstrak dengan yang lain. Hanya melalui penggunaan persyaratan, elemen-elemen yang sepadan dapat diinduksi.

Brian Ballsun-Stanton
sumber
4

Tidak, saya tidak akan mengatakan bahwa Mnesia baik untuk data dalam jumlah besar. Anda dapat memilih untuk menggunakan Ets atau Dets sebagai backend. Jika Anda memilih Ets, basis data Anda hanya akan berada di memori dan sangat cepat tetapi datanya tidak persisten. Dan jika Anda ingin data Anda terus-menerus (disimpan di disk) Anda harus menggunakan Dets, yang memiliki batas 2GB , sehingga basis data Anda tidak dapat menyimpan lebih dari 2GB data.

Anda dapat menggunakan backend khusus mis. Innostore yang digunakan dalam database Riak NoSQL.

Keuntungan dengan Mnesia adalah bahwa ia adalah database terdistribusi sehingga sangat mudah untuk melakukan sistem toleran kesalahan jika Anda memiliki lebih dari satu komputer. Dan sangat mudah digunakan di Erlang karena merupakan basis data dalam bahasa dan bertindak "seperti fungsi". Dan itu juga sangat cepat jika Anda hanya membutuhkan basis data di dalam memori, misalnya, seperti cache.

Jonas
sumber