2009-04-06 10 views
13

たとえば、ノードAとノードBにレプリケートされたmnesiaテーブルがあるとします。テーブルのコピーを含んでいないノードCでは、mnesia:change_config(extra_db_nodes, [NodeA, NodeB])を実行し、次にノードCIではmnesia:dirty_read(user, bob)を実行します。どのノードのコピーのクエリを実行するテーブルの?mnesiaクラスタでは、どのノードが照会されますか?

答えて

14

私自身の研究の答えによれば、質問は - 最後に接続されたノードを選択します。私は見つかった場合には誤りを指摘することに感謝します - 記憶は本当に複雑なシステムです!

Dan Gudmundsson pointed outは、照会するリモートノードの選択のメーリングリストアルゴリズムでmnesia_lib:set_remote_where_to_read/2に定義されています。そう、それは(つまり、候補者のリスト)active_replicasのリストを取得し、次の

set_remote_where_to_read(Tab, Ignore) -> 
    Active = val({Tab, active_replicas}), 
    Valid = 
     case mnesia_recover:get_master_nodes(Tab) of 
      [] -> Active; 
      Masters -> mnesia_lib:intersect(Masters, Active) 
     end, 
    Available = mnesia_lib:intersect(val({current, db_nodes}), Valid -- Ignore), 
    DiscOnlyC = val({Tab, disc_only_copies}), 
    Prefered = Available -- DiscOnlyC, 
    if 
     Prefered /= [] -> 
      set({Tab, where_to_read}, hd(Prefered)); 
     Available /= [] -> 
      set({Tab, where_to_read}, hd(Available)); 
     true -> 
      set({Tab, where_to_read}, nowhere) 
    end. 

で、必要に応じて、テーブルのノードをマスター(何らかの理由で)無視されたテーブルを削除するには、リストを縮小し、リストを縮小現在のノードを接続した後、次の順序で選択する:任意の利用可能なノードを

  1. まず非disc_only_copies

最も重要な部分は実際にはactive_replicasのリストです。候補リスト内のノードの順序を決定するためです。 active_replicas

リストは、リストの先頭として、アイテムを追加機能add/1に帰着古いノードに新たに接続されたノードからmnesia_controller:add_active_replica/*のリモート呼び出し(前クラスタにあった、すなわち1)によって形成されています。

したがって答えはです - 最後に接続されたノードを選択します。

注:私はこれがに適用されるかどうかはわかりません、

[ {T,X} || {{T,active_replicas}, X} <- ets:tab2list(mnesia_gvar) ]. 
-1

まあ、ノードCは、クエリを実行するためにノードAまたはノードBのいずれかに連絡する必要があります。したがって、ノードCは、どのテーブルコピーがクエリを実行するかを決定しなければならない。

これ以上のものが必要な場合は、どのノードを照会するかを決めるアルゴリズムを必要とするか、ノードCの表を複製する必要があります(これは通常、どのような種類の特性)。

ノードAとノードBがデータベースクラスタの一部を形成している場合や、データベースクラスタの一部である場合は、おそらくラウンドロビンアルゴリズム(またはランダムに指定してください)が適しています。

+0

は私の編集した記事をチェックしてください: は、あなたがこの(汚いハック)コードを使用することができ、特定のノード上でアクティブなレプリカのリストをチェックアウトするには私が尋ねたもの私は場所の指定なしでノードCでクエリを実行できます。したがって、使用するテーブルコピーをどのように選択するのですか? – ryeguy

+0

ノードが実際にそのスキーマにテーブルを持っていないことを知りませんでした。申し訳ありません、私の悪い! –

関連する問題