20

非常に大規模なシステムのプライマリ データベースとして Mnesia を使用しています。Mnesia Fragmented Tables は、テスト期間中、非常にうまく動作しました。システムには約 15 のテーブルがあり、それぞれが 2 つのサイト (ノード) に複製されており、各テーブルは高度に断片化されています。テスト フェーズ (可用性、効率性、負荷テストに焦点を当てた) では、サービス上で実行されるすべてのアプリケーションが Erlang/OTP アプリであることを考えると、複雑な構造の多くの利点を持つ Mnesia を受け入れました。メイン Web サーバーとして Yaws 1.91 を実行しています。断片化されたテーブルを効率的に構成するために、大規模なシステムで mnesia

使用した多くの参考文献を使用し まし
ハッシングについて。これらのブログ投稿は、パフォーマンスを向上させるためにあちこちで微調整するのに役立ちました.

さて、問題です。Mnesia にはテーブル サイズの制限があります。はい、同意します。ただし、フラグメント数の制限についてはどこにも言及されていません。パフォーマンス上の理由から、また大規模なデータに対応するために、mnesia を「正常」に保つフラグメントの数について。

一部のテーブルには、64 個のフラグメントがあります。n_disc_only_copies各ノードがフラグメントごとにコピーを持つように、クラスタ内のノード数に設定します。これにより、特定のノードがすぐに届かなくなった場合に mnesia の書き込みが失敗する問題を解決することができました。また、上記のブログで、彼はthe number of fragments should be a power of 2、この声明 (彼によると) は、mnesia がレコードのハッシュを行う方法から調査されたことを示唆しています。ただし、これについてはさらに説明が必要です。ここで話されている 2 のべき乗はどれですか: 2,4,16,32,64,128,...?

このシステムは、Intel プロセッサ (2 つのプロセッサ、各 4 コア、各コアの速度 2.4 GHz、8 MB キャッシュ サイズ)、20 GB RAM サイズ、1.5 テラバイトのディスク容量を含む HP Proliant G6 で実行することを目的としています。現在、これらの高出力マシンのうち 2 台を自由に使用できます。システム データベースは、2 つの間でレプリケートする必要があります。各サーバーは、Solaris 10、64 ビットを実行します。

mnesia のパフォーマンスが低下し始めるフラグメントの数はいくつですか? 特定のテーブルのフラグメント数を 64 から 128 に増やしてもよろしいですか? 65536 フラグメント (2 ^ 16) はどうですか? フラグメンテーションを使用してテラバイト空間を利用するために記憶喪失をスケールアウトするにはどうすればよいでしょうか?

質問への回答を提供してください。また、システムを強化する可能性のあるその他のパラメーターについてアドバイスを提供することもできます。

注: 数百万のレコードを保持するすべてのテーブルはdisc_only_copiesタイプで作成されるため、RAM の問題はありません。RAM は、実行するいくつかの RAM テーブルに対して十分です。MySQL Cluster や CouchDB などの他の DBMS にもデータが含まれ、Mnesia DBMS と同じハードウェアを使用しています。MySQL Cluster は 2 つのサーバー (それぞれが 2 つの NDB ノード、MySQL サーバーを保持) に複製され、管理ノードは異なるホスト上にあります。

4

1 に答える 1

15

フラグメントの数が 2 のべき乗であるというヒントは、デフォルトのフラグメント化モジュールmnesia_fragが線形ハッシュを使用するという事実に単純に関連しているため、2^n フラグメントを使用すると、レコードがフラグメント間で (多かれ少なかれ明らかに) 均等に分散されることが保証されます。

自由に使用できるハードウェアに関しては、パフォーマンス テストの問題です。パフォーマンスを低下させる要因は数多くあり、Mnesia のようなデータベースを構成することは、一般的な問題の 1 つの部分にすぎません。1 つのサーバーでストレス テストを行ってから、両方のサーバーでアルゴリズムをテストして、アルゴリズムが正しくスケーリングされるかどうかを確認することをお勧めします。

Mnesia フラグメント数のスケーリングについて話すと、disc_only_copies を使用すると、ほとんどの時間が 2 つの操作に費やされることを思い出してください。

  • どのフラグメントがどのレコードを保持しているかを判断する

  • 対応する dets テーブルからレコードを取得します (Mnesia バックエンド)

最初のものは、デフォルトで Mnesia が線形ハッシュを使用すると見なされるフラグメントの数に実際には依存していません。2 つ目は、他の要因よりもハード ディスクの遅延に関連しています。

最終的には、フラグメントを増やしてフラグメントあたりのレコード数を減らすことが適切な解決策になる可能性がありますが、同時に中間点を見つけて、バッファーやキャッシュなどのハード ディスク パフォーマンス向上の利点を失わないようにします。

于 2011-08-17T20:35:58.703 に答える