Mnesia: vantaggi e differenze


22

Quali sono i vantaggi di Mnesia rispetto alle principali implementazioni di database SQL e in che modo differisce da essi?

Posso utilizzare il database per contenere enormi quantità di dati senza che si verifichi un notevole degrado delle prestazioni?


4
Penso che questa domanda abbia bisogno di un po 'più di attenzione. Potete elencare i criteri che usereste per giudicare vantaggi o differenze rispetto alle altre implementazioni del database? Questo sembra davvero un candidato per un articolo / elenco di Wikipedia, non proprio qualcosa a cui si può rispondere qui. Inoltre, considerando come Mnesia è molto più simile a CouchDB, non è corretto chiedere come si confronta con le implementazioni SQL "principali" senza nominare quelle con cui si desidera confrontare. Rispetto a SQL Server o Oracle non è nemmeno vicino da nodo a nodo per le prestazioni.
jcolebrand

Risposte:


31

Ci scusiamo per il ritardo alla festa. :) Ecco la mia risposta, basata sull'utilizzo di Mnesia dal 1996 e varie altre tecnologie di database dal 1988.

Mnesia e MySQL sono davvero bestie diverse, e quale è la migliore dipende molto da come intendi usarlo.

Se l'applicazione è scritta in Erlang, Mnesia ti consente di memorizzare i dati nello stesso spazio di memoria dell'applicazione, il che significa che puoi recuperare un singolo oggetto dati in pochi microsecondi. Questo non è possibile in MySQL, poiché l'applicazione e il database saranno separati in memoria. Il motivo per cui la Mnesia può fare questo ed essere ancora robusto, è che Erlang implementa la "protezione" della memoria a livello linguistico.

Nel complesso, i database SQL tendono a favorire la velocità effettiva rispetto alla latenza e, quando si parla di latenza, Mnesia + Erlang sono generalmente eccezionali. Devi decidere quale è più importante per te. Come indicato nei documenti (sopra), le applicazioni target di Mnesia erano applicazioni di commutazione di telecomunicazione, in cui i requisiti di tempo di risposta, ad esempio un'impostazione della chiamata, erano di circa 20 ms. Ciò significa essenzialmente che è possibile leggere dal database solo se i dati erano nella memoria condivisa, ma evitare di scrivere nella memoria permanente in base all'impostazione per chiamata. OTOH, queste applicazioni non hanno praticamente bisogno del supporto di query ad hoc e non usano set di dati molto grandi. Alcuni lavori sono stati fatti per estendere l'idoneità di Mnesia per altri domini, ma non è una priorità per il team di sviluppo Erlang / OTP. La mnesia è quella che è ed è probabile che rimanga tale.

Nel link sopra dove Mnesia e MySQL vengono confrontati per velocità, bisogna ricordare che è in eJabberd, che funziona su un singolo server se è MySQL e esegue un database completamente replicato se è Mnesia - e i grandi cluster di eJabberd possono avere fino a 10 o più nodi erlang (e quindi, 10 o più repliche di Mnesia). Dal punto di vista della ridondanza, questo è abbastanza ridicolo e costoso, e la Mnesia non ti obbliga affatto a farlo. Ovviamente fornisce letture velocissime su ciascun nodo, ma le scritture saranno molto costose. Diversi confronti che ho letto hanno finito per confrontare Mnesia distribuita con un MySQL a nodo singolo; se la ridondanza non è necessaria per MySQL, non dovrebbe essere richiesta nemmeno per Mnesia. Mnesia è abbastanza flessibile nel consentire di scegliere i modelli di replica e la posizione dei dati è trasparente per l'applicazione.

Inoltre, Mnesia non si limita a 2 GB per tabella (sebbene sia una particolare opzione di archiviazione ). Il più grande database Mnesia che conosco ha circa 600 GB di dati nel disco RAM + (64-bit), anche se non lo consiglio. Qualsiasi cosa fino a 10-20 GB dovrebbe andare perfettamente bene con l'hardware moderno, ma salta del tutto disc_only_copies e usa disc_copies - acquista più RAM se devi. Ci penserei due volte prima di usare il supporto di sharding (mnesia_frag) - funziona, ma raramente vale la pena.

Forse la più grande differenza tra Mnesia e MySQL è lo stesso SQL: Mnesia non ha davvero funzionalità comparabili; QLC offre un certo supporto per le query ad hoc, ma non è nella stessa lega di SQL e nemmeno il livello di ottimizzazione delle query. In tooling e provisioning, MySQL è anche superiore e, se hai bisogno di analisi, non c'è dubbio su quale dovresti scegliere (cioè NON Mnesia).

Il modo migliore per vedere la Mnesia è come un'estensione della lingua Erlang. Mette i dati a portata di mano ed è eccellente per piccoli set di dati in cui la struttura dei dati e i modelli di accesso sono ben noti. A tal fine, l'utilizzo di MySQL è scomodo quanto l'utilizzo di Mnesia per le cose in cui MySQL funziona meglio.

La maggior parte delle applicazioni cadono da qualche parte nel mezzo, ed è qui che diventa una chiamata di giudizio. Potresti finire per usare entrambi ...


3
Grazie per la risposta. È la migliore spiegazione che ho letto sulla mnesia.
Akshat Jiwan Sharma,

1
Grazie per aver condiviso la tua esperienza con noi, è molto più prezioso che leggere qualsiasi blog.
Rahul Gautam,

Ottima risposta, ma ora sono ancora più confuso.
HIRA THAKUR,

Risposta molto approfondita. Quindi, se lo capisco correttamente, Mnesia - sarebbe perfetto per alcuni in memoria Key / Value store invece di Memcached o Redis o una soluzione simile, dove vuoi solo velocità e non hai bisogno di analisi o archiviazione persistente "SQL query-grado"? Per tutto il resto sto meglio usando qualcosa come MariaDB / Postgres o Mongo / Cassandra / RIAK? Per chiarire: sto imparando l'Elisir, non proprio Erlang (proveniente dallo sfondo di Ruby / Perl), e sto cercando di capire il miglior stack per me per sostituire Rails / Sinatra con MariaDB e Redis
Konung

13

Dalla documentazione :

Mnesia è un sistema di gestione di database distribuito, adatto per applicazioni di telecomunicazione e altre applicazioni Erlang che richiedono un funzionamento continuo e proprietà soft in tempo reale. È una sezione di Open Telecom Platform (OTP), che è una piattaforma di sistema di controllo per la costruzione di applicazioni di telecomunicazione.

In particolare, l'altissimo livello di tolleranza agli errori richiesto in molti sistemi non-stop, combinato con i requisiti del DBMS per funzionare nello stesso spazio di indirizzi dell'applicazione, ci ha portato a implementare un nuovissimo DBMS. chiamato Mnesia. Mnesia è implementato nel linguaggio di programmazione Erlang, e strettamente connesso, e fornisce le funzionalità necessarie per l'implementazione di sistemi di telecomunicazione a tolleranza d'errore. Mnesia è un DBMS distribuito multiutente appositamente realizzato per applicazioni di telecomunicazione industriale scritto nel linguaggio di programmazione simbolico Erlang, che è anche il linguaggio di destinazione previsto. Mnesia cerca di affrontare tutti i problemi di gestione dei dati richiesti per i sistemi di telecomunicazione tipici e ha una serie di funzionalità che normalmente non si trovano nei database tradizionali.

Nelle applicazioni di telecomunicazione ci sono esigenze diverse dalle funzionalità fornite dai DBMS tradizionali. Le applicazioni ora implementate nel linguaggio Erlang necessitano di una combinazione di una vasta gamma di funzionalità, che generalmente non sono soddisfatte dai DBMS tradizionali. Mnesia è progettata pensando a requisiti come i seguenti:

Ricerca rapida di chiave / valore in tempo reale

Query complicate non in tempo reale principalmente per il funzionamento e la manutenzione

Dati distribuiti a causa di applicazioni distribuite

Alta tolleranza ai guasti

Riconfigurazione dinamica

Oggetti complessi

Ciò che distingue Mnesia dalla maggior parte degli altri DBMS è che è progettato pensando ai tipici problemi di gestione dei dati delle applicazioni di telecomunicazione. Quindi Mnesia combina molti concetti trovati nei database tradizionali, come transazioni e query con concetti trovati nei sistemi di gestione dei dati per applicazioni di telecomunicazione, come operazioni in tempo reale molto veloci, grado configurabile di tolleranza ai guasti (mediante replica) e la capacità di riconfigurare il sistema senza arrestarlo o sospenderlo. Mnesia è anche interessante per il suo stretto legame con il linguaggio di programmazione Erlang, che ha quasi trasformato Erlang in un linguaggio di programmazione di database. Ciò ha molti vantaggi, il principale è che l'impedenza non corrisponde tra il formato dei dati utilizzato dal DBMS e il formato dei dati utilizzato dal linguaggio di programmazione,

Mnesia contro MySQL, prestazioni :

ejabberd consuma meno risorse di calcolo quando si utilizza un database * SQL rispetto a quando si utilizza Mnesia interna. Probabilmente sei interessato a quell'argomento quando hai molti utenti simultanei (più di 1000, per esempio). Con pochi utenti simultanei il consumo di CPU di ejabberd è trascurabile, quindi gli amministratori di piccoli server non si preoccupano di configurare un server SQL esterno e un database.

CouchDB v. Mnesia, V. MySQL e altri argomenti di Mnesia :

Un'intuizione che mi è venuta subito in mente è che mentre per me era palesemente ovvio come strutturare i dati per MySQL, lo è meno per Mnesia, e per CouchDB non sono ancora del tutto sicuro del miglior approccio. Per ora, ecco un paio di punti più ovvi:

Un 'record' ha un campo 'numplays' che indica ovviamente quante volte è stato riprodotto. Questo va bene in MySQL, ma se incorporo questo campo in un documento per CouchDB otterrò una revisione duplicata completa del documento nel database ogni volta che questo numero cambia, il che sembra terribilmente inefficiente.

Il layout a tre tabelle in MySQL di record, tag e una tabella di collegamenti tra di loro (vedere lo script se ciò non è chiaro) è (almeno per me) ovviamente la soluzione giusta, ma ci sono molti modi possibili per farlo sia in Mnesia che in CouchDB e trovo che non ho intuitivamente le risposte.

In breve, è progettato per uno scopo molto specifico e sembra ben progettato per adattarsi allo scopo. Nessun database può essere confrontato in modo astratto con un altro. Solo attraverso l'uso dei requisiti possono essere indotti elementi di commensurabilità.


4

No, non direi che Mnesia è buona per una grande quantità di dati. Puoi scegliere di usare Ets o Dets come backend. Se scegli Ets, il tuo database sarà solo in memoria e molto veloce ma i dati non sono persistenti. E se vuoi che i tuoi dati siano persistenti (salvati su disco) devi usare Dets, che ha un limite di 2GB , quindi il tuo database non può contenere più di 2GB di dati.

È possibile utilizzare un back-end personalizzato, ad esempio innostore, utilizzato nel database NoSQL Riak .

Il vantaggio di Mnesia è che si tratta di un database distribuito, quindi è molto semplice realizzare sistemi a tolleranza d'errore se si dispone di più di un computer. Ed è molto facile da usare in Erlang poiché è un database in lingua e agisce "come una funzione". Ed è anche super veloce se hai solo bisogno di un database in memoria, ad esempio una cache.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.