非常に大規模なシステムのプライマリ データベースとして 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 サーバーを保持) に複製され、管理ノードは異なるホスト上にあります。