19

関連するノードを再起動せずに、mnesia クラスター内のネットワーク パーティションから回復することは可能ですか? もしそうなら、どのようにそれについて行くのですか?

私は特に知りたいと思っています:

  • 標準の OTP mnesia (v4.4.7) でこれを行う方法
  • これを実現するためにカスタム コードを作成する必要がある場合 (例: mnesia running_paritioned_network イベントにサブスクライブする、新しいマスターを決定する、非マスターからマスターにレコードをマージする、新しいマスターからテーブルを強制的にロードする、実行中のパーティション化されたネットワーク イベントをクリアする -サンプルコードは大歓迎です)。
  • または、その mnesia は断固としてオンライン回復をサポートしておらず、非マスター パーティションの一部であるノードを再起動する必要があります。

一般的な分散システム理論へのポインタには感謝していますが、この質問では、erlang/OTP 記憶喪失症のみに関心があります。

4

3 に答える 3

16

いくつかの実験の後、私は次のことを発見しました:

  • Mnesia は、2 つのノード間でノードが切断され、mnesia の再起動なしで再接続された場合、ネットワークが分割されていると見なしました。
  • これは、切断時に Mnesia の読み取り/書き込み操作が発生しない場合でも当てはまります。
  • 分断されたネットワーク イベントをクリアするには、Mnesia 自体を再起動する必要がありますforce_load_table。ネットワークが分断された後はできません。
  • ネットワーク分割イベントをクリアするには、Mnesia のみを再起動する必要があります。ノード全体を再起動する必要はありません。
  • Mnesia は、新たに再起動された Mnesia ノードがそのテーブル データを別の Mnesia ノードからのデータで上書きすることによって、ネットワークの分割を解決します (スタートアップ テーブル ロード アルゴリズム)。
  • 通常、ノードは最も長く稼働しているノードからテーブルをコピーします (これは私が見た動作であり、これが明示的にコード化されていることを確認しておらず、他の何かの副作用ではないことを確認していません)。クラスタからノードを切断し、両方のパーティション (切断されたノードとその古いピア) に書き込みを行い、すべてのノードをシャットダウンしてから、切断されたノードを最初に開始してすべてのバックアップを再開すると、切断されたノードがマスターと見なされ、そのノードがそのノードのデータは他のすべてのノードを上書きします。テーブル比較/チェックサム/クォーラム動作はありません。

mnesia:stop(), mnesia:start()したがって、私の質問に答えるために、データを破棄することを決定したパーティション (失われたパーティションと呼びます) 内のノードで実行することにより、セミ オンライン リカバリを実行できます。呼び出しを実行するmnesia:start()と、ノードはパーティションの反対側のノードに接続します。負けたパーティションに複数のノードがある場合は、勝ったパーティションのノードにテーブルをロードするためのマスター ノードを設定することをお勧めします。そうしないと、負けたパーティションの別のノードからテーブルをロードする可能性があると思います。分断されたネットワーク状態に戻ります。

残念ながら、mnesia は、開始時のテーブル ロード フェーズ中のテーブル コンテンツのマージ/調整をサポートしていません。また、開始されたテーブル ロード フェーズに戻ることもできません。

マージ フェーズは特に ejabberd に適しています。これは、ノードがまだユーザー接続を持っているため、ノードが所有している/最新である必要があるユーザー レコードを認識しているからです (クラスターごとに 1 つのユーザー接続を想定)。マージ フェーズが存在する場合、ノードはユーザーデータ テーブルをフィルタリングし、接続されているユーザーのすべてのレコードを保存し、通常どおりテーブルをロードしてから、保存されたレコードを mnesia クラスターに書き戻すことができます。

于 2009-05-06T04:46:37.760 に答える
0

サラの答えは素晴らしいです。 CAPに関する記事を見てください。Mnesia 開発者は CA のために P を犠牲にします。P が必要な場合は、犠牲にする CAP を選択し、別のストレージを選択する必要があります。たとえば、CouchDB (犠牲 C) またはScalaris (犠牲 A) です。

于 2009-03-09T08:35:16.807 に答える
0

それはこのように動作します。鳥でいっぱいの空を想像してみてください。すべての鳥が揃うまで写真を撮ります。写真をテーブルの上に置きます。画像を相互にマップします。だから、あなたはすべての鳥を一度見ます。あなたはすべての鳥を見ますか?Ok。その時、あなたは知っています。システムは安定していました。すべての鳥の鳴き声(メッセージ)を記録し、さらに写真を撮ります。その後、繰り返します。

ノード分割がある場合。最新の共通安定スナップショットに戻ります。そして**その後に追加したものを再生してみてください。:)

K. MANI CHANDY と LESLIE LAMPORT の「Distributed Snapshots: Determining Global States of Distributed Systems」で詳しく説明されています。

** 何が起こったのかを再生しようとするときに、誰の時計を追跡するかを決めるのに問題があると思います

于 2009-03-09T06:56:45.297 に答える