10

Mnesia の「extra_db_nodes」を介してデータをレプリケートしている erlang ノードのグループがあります...ハードウェアとソフトウェアをアップグレードする必要があるため、ノードからノードへ移動するときにいくつかのノードを切り離す必要があります。

ノードを削除し、挿入されたデータを保持するにはどうすればよいですか?

[更新] ノードの削除は、ノードの追加と同じくらい重要です。時間の経過とともにクラスターが成長するにつれて、クラスターも縮小する必要があります。そうでない場合、Mnesia は存在しないノードにデータを送信しようとしてビジー状態になり、キューをいっぱいにしてネットワークをビジー状態に保ちます。

[最終更新] erlang/mnesia のソース コードを調べた結果、ノードの関連付けを完全に解除することはできないと判断できました。del_table_copy はテーブル間のリンクを削除しますが、不完全です。私はこの質問を閉じますが、適切な説明はどれもありません。

4

4 に答える 4

6

ずっと前にこれを見つけていたらよかったのに:http://weblambdazero.blogspot.com/2008/08/erlang-tips-and-tricks-mnesia.html

基本的に、適切に機能するクラスターを使用して....

  • 削除するクラスターにログインします

  • 記憶喪失を止める

    mnesia:stop().
    
  • クラスタ上の別のノードにログインする

  • スキーマを削除します

    mnesia:del_table_copy(schema, node@host.domain).
    
于 2012-10-05T03:06:06.443 に答える
3

私はパーティーに非常に遅れていますが、同じ問題の解決策を探しているときにドキュメントでこの情報に出くわしました:

"関数呼び出しmnesia:del_table_copy(schema、mynode @ host)は、ノード'mynode@host'をMnesiaシステムから削除します。mnesiaが'mynode@ host'で実行されている場合、呼び出しは失敗します。他のmnesiaノードは接続を試みません。ノード'mynode@ host'にディスク常駐スキーマがある場合は、mnesiaディレクトリ全体を削除する必要があることに注意してください。これはmnesia:delete_schema/1で実行できます。ノード'mynode@ host'であり、ディレクトリがクリアされていない場合、mnesiaの動作は未定義です。 " (http://www.erlang.org/doc/apps/mnesia/Mnesia_chap5.html#id74278

私は以下があなたが望むことをするかもしれないと思います:

AllTables = mnesia:system_info(tables),
DataTables = lists:filter(fun(Table) -> Table =/= schema end,
                          AllTables),

RemoveTableCopy = fun(Table,Node) ->
  Nodes = mnesia:table_info(Table,ram_copies) ++
          mnesia:table_info(Table,disc_copies) ++
          mnesia:table_info(Table,disc_only_copies),
  case lists:member(Node,Nodes) of
    true -> mnesia:del_table_copy(Table,Node);
    false -> ok
  end
end,

[RemoveTableCopy(Tbl,'gone@gone_host') || Tbl <- DataTables].

rpc:call('gone@gone_host',mnesia,stop,[]),
rpc:call('gone@gone_host',mnesia,delete_schema,[SchemaDir]),
RemoveTablecopy(schema,'gone@gone_host').

ただし、シナリオが少し異なるため、テストは行っていません。

于 2011-01-19T23:57:08.037 に答える
1

私は確かにこれを実行するためにこのメソッドを使用しました (mnesia:del_table_copy/2 の使用をサポートしています)。以下の removeNode/1 を参照してください。

-module(tool_bootstrap).

-export([bootstrapNewNode/1, closedownNode/0,
     finalBootstrap/0, removeNode/1]).

-include_lib("records.hrl").

-include_lib("stdlib/include/qlc.hrl").

bootstrapNewNode(Node) ->
    %% Make the given node part of the family and start the cloud on it
    mnesia:change_config(extra_db_nodes, [Node]),
    %% Now make the other node set things up
    rpc:call(Node, tool_bootstrap, finalBootstrap, []).

removeNode(Node) ->
    rpc:call(Node, tool_bootstrap, closedownNode, []),
    mnesia:del_table_copy(schema, Node).

finalBootstrap() ->
    %% Code removed to actually copy over my tables etc...
    application:start(cloud).

closedownNode() ->
    application:stop(cloud), mnesia:stop().
于 2009-06-08T23:11:06.880 に答える
0

削除するノード以外のノードでテーブルをレプリケートした (テーブルのコピーを追加した) 場合は、問題ありません。ノードを削除するだけです。

少し整理したい場合は、最初に削除しようとしているノードからテーブルのコピーを削除しますmnesia:del_table_copy/2

通常、mnesia はノードの損失を適切に処理し、ノードの再結合を検出します (再起動されたノードは、実行を続けていたノードから新しいテーブルのコピーを取得し、再起動しなかったノードはネットワーク パーティション イベントとして検出されます)。Mnesia は、ダウンしたノードの CPU またはネットワーク トラフィックを消費しません。ソースで確認していませんが、mnesia は自動的にダウンしたノードに再接続しないと思います - ダウンしたノードは再起動 (mnesia) して再接続することが期待されます。

mnesia:add_table_copy/3mnesia:move_table_copy/3およびmnesia:del_table_copy/2は、ライブ スキーマ管理のために注目すべき機能です。

このパラメーターは、新しい DB ノードを初期化する場合にのみ使用する必要があります。新しいノードにスキーマのコピーがあれば、パラメーターextra_db_nodesは必要ありません。extra_db_nodes

于 2009-06-03T22:06:10.993 に答える