ErlangのMnesia-高伸縮性アプリケーションのためのデータベース管理システム


2007年を「データベースが正規化された謎のベールが暴かれた年」と呼ぶことができるようだ.大規模なWebサイトでは、1時間に数千万件のアクセス要求を処理するために、従来のリレーショナル・データベースのルートを放棄している興味深い議論が見られました.Joe Gregorioの最近の観察によると、このような一般的な案が現れた(ここでは私の観点を強調している):
バイト(Petabyte、2の50回、約千万億)のレベルに伸ばしたい場合、または毎日数十億ドルのリクエストが必要です.
分散配置.データは複数の機械に分散しなければならない.
テーブル接続(Joinless)はありません.少なくともデータストレージ階層では、テーブル接続(Join)は使用できません.また、関連整合性制約も定義しません.
正規化する.率直に言う人はいませんが、テーブル接続を避けるには、正規化された仕事がたくさんあると思います.
トランザクションがありません.トランザクションでは操作できません.
これらの制約は、リレーショナル・データベースとは根本的に異なります.
これらの特徴はMnesia,Erlangの分散型データベース管理システムを記述するために用いることができ,レプリケーション方式により高伸縮性とフォールトトレランス性をサポートし,従来のリレーショナル・データベースのテーブル接続を必要とせずにレコードを取得することができる.MnesiaはErlang/OTPプロジェクトに属し、Erlang仮想マシン上で実行されるErlang言語で開発されたアプリケーションのために設計された(C/C++とJava用のインタフェースがある).
1999年に発表された白書「Mnesia--電気通信応用に適した分散型丈夫なデータベース管理システム」では、著者(H以下に要約を示します.
Mnesiaデータベース管理システムは、データ所有者アプリケーションの同じアドレス空間で動作するが、アプリケーションがデータベースコンテンツを破壊することはできない.これにより、迅速なアクセスとエラーの有効な許容が保証され、両者は一般的に互いに衝突する需要である.MnesiaはErlangプログラミング言語に根ざしており,Erlangの多くの特性に基づいて実現されている.
論文の第1節では,このようなデータベース管理システムを構築した当初の動機は,電気通信応用における厳しい許容誤差と高信頼性の需要であると説明した.これらの要件は次のとおりです.
リアルタイムの高速キー/値取得;
非リアルタイムの複雑なクエリーは主に運営とメンテナンス時に行われる.
分布式の応用、それによってデータも分布しなければなりません;
高許容誤差;
動的再構成;
複雑なオブジェクト.
論文の第2節では,Mnesiaのコンポーネントを概説した.Mnesiaは、ロック、トランザクション管理、レプリケーションなどのデータベース管理システムのコアサービスを提供する複数のErlangアプリケーションから構成されています.著者らはErlangがこのシステムを実現するのに非常に適しており,約2万行のコードが含まれていると指摘した.クエリー構文はErlangの一部であり、データモデルはオブジェクトリレーショナル・データベース管理システムに似ています.
Mnesiaのもう一つの興味深い点は,Erlangプログラミング言語との厳密な結合であり,基本的にErlangをデータベースプログラミング言語に変えたことである.このような利点は多く、最大の利点は、データベースが使用するデータフォーマットとプログラミング言語がデータを操作するために使用するデータフォーマットの間にインピーダンス不整合が全く発生しないことです.
そのデータモデルはテーブルの概念をサポートし、1つのレコードは1行に等価であり、各列には「ツリー、関数、閉パッケージ、コードなどの複雑な組合せデータ構造」が格納されます.Erlangの複雑な記録の例は次のとおりです.
X = #person{
name = klacke,
data = {male, 36, 971191},
married_to = eva,
children = [marten, maja, klara]
}.

Mnesiaはまた、ルール(Rules)と呼ばれるビュー(View)と同様の概念をサポートする.
レプリケーションはMnesiaをフォールトトレランスデータベース管理システムにするメカニズムの一つである.データ・テーブルは、ハイブリッド・ネットワーク内の複数のノードにコピーできますが、アプリケーションには透過的です.レプリケーションされたデータテーブルはピアツーピアであり、すなわちプライマリ・セカンダリ構造がない.
論文の第3節では、Mnesiaのいくつかの独自の特性を詳細に説明した.
複雑な値.Mnesiaは複雑な値の操作を自然に有効にサポートする(換言すれば、1回の検索操作によって).「電気通信データを3番目(さらには1番目)のパターンで整理することは、通常は不可能です.」列に複雑な値を格納できることは、テーブル接続が不要であることを意味します.
データフォーマットとアドレス空間.このデータベース管理システムは、アプリケーションのアドレス空間で実行されます.これにより、異なるデータフォーマット間でオブジェクトを暗黙的に変換したり、オブジェクトを線で操作したりすることなく、戻りオブジェクトポインタを取得できます.論文では,Erlangの1つのアプリケーションがクラッシュしてもデータベースに影響を及ぼさないことに言及し,この方式でのアプリケーションのクラッシュがデータベースに影響を及ぼす可能性のある一般的な非難を克服した.「Erlangプロセスの機能には、同じアドレス空間で実行されているが、他のプロセスの記憶領域を直接読み取りまたは書き込むことはできないという利点がある」.
許容誤差データテーブルは、複数の計算ノードにコピーできます.トランザクションコンテキストの書き込み操作はすべてのコピーに適用され、リカバリ時に更新されることで、ダウンタイムのコピーも更新されます.「このメカニズムは、複数の地理的に分離されたシステムが、連続的に動作するダウンタイムのないシステム設計を提供することを可能にする」.
分布と位置が透明です.アプリケーション開発者は、リモートでもローカルでもデータテーブルのコピーでもデータテーブルに透過的にアクセスできます.しかし、パフォーマンスの重要な点では、データテーブルの位置を把握し、コードをできるだけ事故データに近い位置で実行する方法もあります.
トランザクションとACID.MnesiaはACID(A=原子性,C=コンシステンシ,I=分離性,D=耐久性)をサポートするが,メモリに限られたデータテーブル操作能力(耐久性を犠牲にする代わりに)も提供する.
トランザクションマネージャを迂回する能力.「汚れたインタフェース(dirty interface)」の概念は、トランザクションマネージャの追加コストを回避するために、軽量レベルのロックメカニズムとして導入されています.この能力は、レコードを取得するなど、パフォーマンスの重要な操作に役立ちます.「これらの汚い操作は、データベースが大きいか小さいかにかかわらず、予測可能な実行時間を消費する真のリアルタイムデータベース操作です.」クエリー.クエリは、「リストの理解(List Compreshension)構文」と呼ばれる方法で表現される.例えば、X人以上の子供を見つけるには、query [P.name || P < table(person), length(P.children) > X] end. と書くことができます.
Schemaの修正.Erlang言語自体は、プロセスを停止せずに実行中のプロセスコードを変更する能力をサポートしています.これによりMnesiaデータベースのSchemaの動的変更が可能になる.「Mnesiaは、ダウンタイムのないアプリケーションのために設計されている以上、バックアップ、Schemaの変更、テーブルデータの2次ストレージへのエクスポート、レプリカ・レプリケーションなど、すべてのシステム・アクティビティをバックグラウンドで行う必要があります.また、アプリケーションが通常と同じようにデータ・テーブルにアクセスおよび変更できるようにします.」論文の第4節では,著者らは,持続的,ロック管理,クエリー実装,および分散アプリケーションの各ノードが異なるバイト順のコンピュータで動作する可能性がある場合など,具体的な実装の各態様を探索し,このようなシステムを混在環境で動作させることができる.
第5節では、パフォーマンスの問題について説明します.「汚いインタフェース」は、トランザクション制御の対応部分よりもかなり速いことがわかります.予想されるように、同期レプリケーションのコストは、トランザクションの実行時間を大幅に延長します.トランザクションが完了した時間(ミリ秒)は、単一ノードでは通常のロック1877、明示的な書き込みロック1225、「汚れたインタフェース」を使用すると181です.3つのノードの場合、同じトランザクション・タイプで測定された時間は、13372、12185、1121の順です.
論文は以下の結論を出した.
Mnesiaシステムは現在、実際の製品を構築するためにエリクソンによって使用されています.つまり、それは単なるプロトタイプシステムではなく、製品のラベルを貼ることができるほど成熟しています.
Mnesiaの開発はこの論文から継続し,shardsのようなスライステーブル(fragmented tables,データベース階層で処理)などのより多くの特性を加え,YAWS(Erlang Webサーバ)やejabberd(XMPPサーバ)などのオープンソースプロジェクトにも用いられている.
横スライスデータの場合,Mnesiaは伸縮性と低遅延トランザクションで際立っており,次の課題は,超大規模データセットがどのように広がるかである可能性がある.6千万行を超える例がある.しかし、Bill de h
日常のプログラミング作業への影響で、増加したデータ容量はマルチコアをはるかに上回ると思います.私がここ数年やってきた仕事は、ますます大きなデータセットを処理することです.Joe Gregorioに「Megadata(メガデータ)」と呼ばれています(今はそう言わないでほしいです).ビッグデータセットは、いくつかの大手企業の奥深い議題ではなく、非常に一般的になっています.
そして結論を出します.
大容量は、データの行方を気にせずに書き込む必要があることを意味します.また、キーワード検索方式の読み取りには、リレーショナル・データベース管理システムではなくファイル・システムに基づいている必要があります(テーブル接続、制約、トリガがない場合、リレーショナル・データベース管理システムはインデックス化されたファイル・システムです).最終的にはHadoop、Mogilefs、またはS 3のようなものであるパラレルデータアーキテクチャである.
Erlang/OTPへの興味が高まるにつれて(最近のInfoQ記事を含む)、このプロジェクトは最終的にMnesiaのようなものになるはずだ.
Erlang's Mnesia-a distributed DBMS for highly scalable apps転載:http://blog.csdn.net/xpspace/archive/2007/11/10/1877452.aspx