9

複製されたmnesiaデータベースで2つのerlangノードを実行しています。mnesiaがもう一方で実行されていないときに一方を起動しようとすると、mnesia:wait_for_tables(?TABS、?TIMEOUT)は、呼び出し元のノードでハングします。(両方のノードが実行されていない場合)もう一方がダウンしているときに一方を操作し始め、後でもう一方を起動しても正常に動作し続けることができる構造が必要です。実行していた最初のノードが、後で起動したときに更新されていることを確認する必要があります。これは必然的に私がマスターとして1つ持っている必要がありますか?

%%%編集.............................................。 ............................。

ああ、私はそれを持っています。私が使用していたデータベースには、断片化されたテーブルがいくつかありました。一部のフラグメントは、負荷分散のためにネットワーク全体に分散されていました。したがって、一方のホストのMnesiaはネットワークを介してそれらをロードしようとし、もう一方のホストのMnesiaがダウンしているため、失敗します。

これは、mnesiaマスターノードとは何の関係もないと思います。しかし、これまで使用したことがないので、同じことの重要性を理解したいと思います。それでも、私は常に分散スキーマで遊んでいます。

再度、感謝します...

4

1 に答える 1

5

Mnesiaマスターノードは、かなり残忍な方法でスプリットブレインの状況を解決するために使用されます。mnesiaがスプリットブレインの状況を発見すると、「パーティション化されたネットワークの実行」というイベントを発行します。これに対応する1つの方法は、マスターノードを保持する「アイランド」に設定してから、他のノードを再起動することです。それらが戻ってくると、マスターノードから無条件にテーブルをロードします。

mnesiaには、force_loadと呼ばれる別のメカニズムがあります。非常に注意する必要がありますが、AとBの2つのノードがある場合、Bを終了し(AはBをダウンとしてログに記録します)、次にAを終了し、次にBを再起動します。BはAがダウンしたときの情報を持ちません。 、したがって、Aにコピーがあるテーブルのロードを拒否します。Aがすぐに戻ってこないことがわかっている場合は、Bでmnesia:force_load_tables(Ts)を呼び出すことを選択できます。これにより、Aは独自のコピーで実行されます。Aが復旧すると、Bが稼働していることを検出し、そこからテーブルをロードします。ご覧のとおり、データベースに一貫性がなくなる可能性のあるシナリオは他にもいくつかあります。Mnesiaはそれを修正しませんが、状況が発生した場合にそれを解決するためのツールを提供しようとします。上記のシナリオでは、残念ながら、mnesiaはあなたにヒントを与えません、

于 2010-10-10T16:22:38.953 に答える