Mnesia:利点と違い


22

主要なSQLデータベースの実装に対するMnesiaの利点は何ですか?

データベースを使用して、パフォーマンスを著しく低下させることなく、非常に大量のデータを保持できますか?


4
この質問にはもう少し焦点が必要だと思います。他のデータベース実装との利点や違いを判断するために使用する基準をリストできますか?これは本当にウィキペディアの記事/リストの候補のように思えますが、実際にここで答えられるものではありません。さらに、Mnesiaが実際にCouchDBに似ていることを考えると、比較したいものに名前を付けずに「主要な」SQL実装と比較する方法を尋ねるのは公平ではありません。SQLServerやOracleと比較すると、パフォーマンスのためにノード間を閉じることすらありません。
jcolebrand

回答:


31

パーティーに遅れてすみません。:) 1996年からMnesiaを、1988年から他のさまざまなデータベーステクノロジーを使用してきたことに基づいた私の答えです。

MnesiaとMySQLは確かに異なる獣であり、どちらが最適かは、どのように使用するかによって大きく異なります。

アプリケーションがErlangで記述されている場合、Mnesiaではアプリケーションと同じメモリスペースにデータを保存できます。つまり、単一のデータオブジェクトを数マイクロ秒でフェッチできます。アプリケーションとデータベースはメモリ内で分離されるため、これはMySQLでは不可能です。Mnesiaがこれを実行でき、なお堅牢である理由は、Erlangが言語レベルでメモリの「保護」を実装しているためです。

全体として、SQLデータベースはレイテンシよりもスループットを優先する傾向があり、レイテンシに関して言えば、Mnesia + Erlangは一般的に傑出しています。あなたにとって最も重要なものを決める必要があります。ドキュメント(上記)で述べているように、Mnesiaのターゲットアプリケーションはテレコムスイッチングアプリケーションであり、コールセットアップなどの応答時間要件は約20ミリ秒でした。これは基本的に、データが共有メモリにある場合にのみデータベースから読み取ることができることを意味しますが、コールセットアップごとに永続ストレージへの書き込みを回避します。OTOH、これらのアプリケーションは、アドホッククエリのサポートを実質的に必要とせず、非常に大きなデータセットを使用しません。他のドメインへのMnesiaの適合性を拡張するためにいくつかの作業が行われましたが、Erlang / OTP開発チームにとって優先事項ではありません。Mnesiaはそれが何であるかであり、そのようにとどまる可能性が高いです。

MnesiaとMySQLの速度を比較する上記のリンクでは、eJabberdにあることを覚えておく必要があります。eJabberdは、MySQLの場合は単一のサーバーに対して実行され、Mnesiaの場合は完全に複製されたデータベースを実行し、大きなeJabberdクラスターは10個以上のアーランノード(したがって、10個以上のMnesiaレプリカ)。冗長性の観点からは、これはかなりばかげて費用がかかります。Mnesiaがそうすることを強制することは決してありません。それは明らかに各ノードで非常に高速な読み取りを提供しますが、書き込みは非常に高価になります。私が読んだいくつかの比較では、分散型MnesiaとシングルノードMySQLを比較しています。MySQLに冗長性が必要ない場合、Mnesiaにも冗長性は必要ありません。Mnesiaはレプリケーションパターンを選択できる柔軟性が非常に高く、データの場所はアプリケーションに対して透過的です。

Mnesiaは、テーブルごとに2 GBに制限されていません(ただし、特定のストレージオプションがあります)。私が知っている最大のMnesiaデータベースには、(64ビット)RAM +ディスクに約600 GBのデータがあります-これはお勧めしません。ただし、最新のハードウェアでは10〜20 GBまでは問題ありませんが、disc_only_copiesを完全にスキップしてdisc_copiesを使用します。必要に応じてRAMを追加購入してください。シャーディングサポート(mnesia_frag)を使用する前によく考えます-動作しますが、トラブルの価値はほとんどありません。

おそらくMnesiaとMySQLの最大の違いはSQL自体です。Mnesiaには実際に同等の機能はありません。QLCは、アドホッククエリのサポートを提供しますが、SQLと同じレベルではなく、クエリ最適化のレベルでもありません。ツールとプロビジョニングでは、MySQLも優れています。分析が必要な場合は、どちらを選択するか(Mnesia以外)を選択する必要があります。

Mnesiaを表示する最良の方法は、Erlang言語の拡張機能です。データをすぐに使用でき、データ構造とアクセスパターンがよく知られている小さなデータセットに最適です。この目的のために、MySQLの使用は、Mnesiaを使用してMySQLが最適に機能することと同じくらい不快です。

ほとんどのアプリケーションはその中間に位置し、これが判断の電話となります。あなたは両方を使用することになります...


3
答えてくれてありがとう。これは、私がmnesiaで読んだ最高の説明です。
アクシャットジワンシャルマ14年

1
あなたの経験を私たちと共有してくれてありがとう。ブログを読むよりもはるかに価値がある。
ラーフルゴータム

素晴らしい答えですが、今はさらに混乱しています。
ヒラタクール14年

非常に徹底的な答え。それで、私がこれを正しく理解している場合、Mnesia-MemcachedまたはRedisまたは同様のソリューションの代わりにメモリ内のキー/値ストアに最適であり、速度だけが必要で、分析や永続的な「SQLクエリ可能な」ストレージは必要ありませんか?他のすべてのために、私はMariaDB / PostgresまたはMongo / Cassandra / RIAKのようなものを使用する方が良いですか?明確にするために-私はErlangではなくElixirを学んでいます(Ruby / Perlのバックグラウンドから来ています)、Rails / SinatraをMariaDBとRedisに置き換えるための最良のスタックを
見つけよ

13

ドキュメントから:

Mnesiaは分散データベース管理システムであり、継続的な運用とソフトリアルタイムプロパティを必要とする通信アプリケーションやその他のErlangアプリケーションに適しています。これは、通信アプリケーションを構築するための制御システムプラットフォームであるOpen Telecom Platform(OTP)の1つのセクションです。

特に、多くのノンストップシステムで必要とされる非常に高いレベルのフォールトトレランスと、アプリケーションと同じアドレス空間で実行するためのDBMSの要件により、新しいDBMSを実装することになりました。ムネシアと呼ばれます。Mnesiaは、プログラミング言語Erlangに実装されており、プログラミング言語Erlangに密接に接続されており、フォールトトレラントな通信システムの実装に必要な機能を提供します。Mnesiaは、シンボリックプログラミング言語Erlangで記述された産業用通信アプリケーション用に特別に作成されたマルチユーザー分散DBMSであり、これも目的のターゲット言語です。Mnesiaは、一般的な通信システムに必要なすべてのデータ管理の問題に対処しようとし、従来のデータベースには通常見られない多くの機能を備えています。

通信アプリケーションでは、従来のDBMSが提供する機能とは異なるニーズがあります。現在Erlang言語で実装されているアプリケーションには、幅広い機能が混在している必要がありますが、これらは通常、従来のDBMSでは満たされていません。Mnesiaは、次のような要件を念頭に置いて設計されています。

高速なリアルタイムキー/値検索

主に運用と保守のための複雑な非リアルタイムクエリ

分散アプリケーションによる分散データ

高い耐障害性

動的再構成

複雑なオブジェクト

Mnesiaを他のほとんどのDBMSと区別するのは、通信アプリケーションの典型的なデータ管理の問題を念頭に置いて設計されていることです。したがって、Mnesiaは、トランザクションやクエリなどの従来のデータベースに見られる多くの概念と、非常に高速なリアルタイム操作、構成可能なフォールトトレランス(レプリケーションによる)、およびシステムを停止または中断せずに再構成します。Mnesiaは、プログラミング言語Erlangと密接に結合しているため、Erlangをデータベースプログラミング言語にほぼ変えているため、興味深いものでもあります。これには多くの利点がありますが、何よりもまず、DBMSで使用されるデータ形式とプログラミング言語で使用されるデータ形式の間のインピーダンスの不一致、

Mnesia対MySQL、パフォーマンス

ejabberdは、内部Mnesiaを使用する場合よりも、* SQLデータベースを使用する場合の計算リソースを消費しません。多くの同時ユーザー(たとえば、1000人以上)がある場合は、おそらくこのトピックに興味があります。ejabberdの同時ユーザーがほとんどいないため、小さなサーバーの管理者は外部SQLサーバーとデータベースのセットアップを気にしません。

CouchDB v。Mnesia、V。MySQL、およびその他のMnesiaのトピック

すぐに頭に浮かんだ洞察の1つは、MySQLのデータをどのように構造化するかは明らかに明白でしたが、Mnesiaの場合はそれほど明確ではないことです。今のところ、ここにいくつかのより明白なポイントがあります:

「レコード」には「numplays」フィールドがあり、これは再生回数を明らかに示します。これはMySQLでは問題ありませんが、このフィールドをCouchDBのドキュメントに組み込むだけで、この1つの数字が変更されるたびにデータベース内のドキュメントの完全な複製リビジョンを取得することになります。

レコード、タグ、およびそれらの間のリンクテーブルのMySQLの3つのテーブルレイアウト(明確でない場合はスクリプトを参照)は(少なくとも私には)明らかに正しいソリューションですが、これを行うには多くの方法がありますMnesiaとCouchDBの両方で、直感的に答えがわからないことがわかりました。

要するに、それは非常に特定の目的のために設計されており、目的に合うようにうまく設計されているようです。あるデータベースを別のデータベースと抽象的に比較することはできません。要件を使用することによってのみ、整合性の要素を誘導できます。


4

いいえ、Mnesiaが大量のデータに適しているとは言いません。EtsまたはDetsをバックエンドとして使用することを選択できます。Etsを選択した場合、データベースはインメモリで非常に高速になりますが、データは永続的ではありません。データを永続的に(ディスクに保存)したい場合は、2GBの制限があるDetsを使用する必要があります。そのため、データベースは2GBを超えるデータを保持できません。

Riak NoSQLデータベースで使用されるinnostoreなどのカスタムバックエンドを使用できます。

Mnesiaの利点は、分散データベースであるため、複数のコンピューターがある場合にフォールトトレラントシステムを非常に簡単に実行できることです。また、言語データベースであり、「関数のように」動作するため、Erlangでの使用は非常に簡単です。また、キャッシュなどのメモリ内データベースのみが必要な場合にも超高速です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.