3

Erlang ノードのマスター/スレーブ セットアップが必要で、読み取りおよび書き込み操作はマスター ノードでのみ行われます。スレーブ ノードは、ホット スタンバイとしてのみ保持されます。

私が理解しているように、Mnesia のデフォルトの動作は、書き込み操作を実行する前にすべてのノードで同期的にロックを取得することです。これにより、特に地理的に分散したノードの場合、待ち時間が長くなります。

私の質問は次のとおりです: Mnesia は、ロックがマスター ノードでのみ取得され、書き込み操作が後でスレーブ ノードに伝達される非同期トランザクションをサポートしますか?

4

3 に答える 3

2

メッセージキューシステム(おそらくrabbitmq)を使用してこのオフサイトレプリケーションを構築し、メッセージキューフィードからレプリケートされたデータベースを自分で更新すると、より幸せになると思います。WANリンクは混雑したりダウンしたりする可能性が高く、メッセージキュープロトコルにはそれを処理する方法があります。アーラン分布はあきらめ、レプリカが起動してそれを消費できるようになるまで、更新をファイルにスピルする必要があります。

最適な対称性を得るには、メッセージへの投稿キューをデータベースを更新するための主要な方法にします。したがって、マスターでさえ、メッセージキューから消費することによって更新されます。応答が必要な場合、現在のマスターはメッセージの発行者にメッセージを送り返すことができます。

Mnesiaには、いくつかの異なる種類のmnesiaトランザクションコンテキストがありますが、実際に必要なものに正確に適合するものはありません。

于 2009-12-13T21:20:21.640 に答える
1

スティッキー ロックを使用すると、アプリケーションでメリットが得られる可能性があります。私はそれがあなたのニーズにかなり近いと思いますが...あなたが望んでいたものとは正確には異なりますhttp://www.erlang.org/documentation/doc-5.8.3/lib/mnesia-4.4.17/doc/html/ Mnesia_chap4.html#id70700

于 2011-04-10T12:40:49.023 に答える
0

興味深い Q と同様に興味深い A です。

基本的に、Christian さんが提案しているのは、たとえば、DB へのアクセスをシリアル化する gen_server を持つことです。初めてそれをしたとき、私は気づきました:ちょっと待ってください!Mnesia はトランザクショナルなので、最初にアクセスをシリアライズしてから、トランザクションを介して DB を更新することで再度行うのは少し奇妙に思えます。

ただし、mnesia がトランザクションのセマンティクスを強制することを考えると、私は、特に mnesia の実装者はおそらく私よりもシステムをよく知っているため、自分でアクセスをシリアル化する必要はないというヒントとしてそれを受け入れる傾向があります ;)

これがあなたの質問に対する直接的な答えではないことは理解していますが、mnesia + memorynodes + disknodes を使用することをお勧めします。クイック テイクオーバー用のメモリ ノードと、クラッシュ/バックアップ後のリカバリ用のディスク ノード。

HTH、ハービー

于 2009-12-14T12:48:21.500 に答える