たとえば、ノードAとノードBにレプリケートされたmnesiaテーブルがあるとします。テーブルのコピーを含んでいないノードCでは、mnesia:change_config(extra_db_nodes, [NodeA, NodeB])
を実行し、次にノードCIではmnesia:dirty_read(user, bob)
を実行します。どのノードのコピーのクエリを実行するテーブルの?mnesiaクラスタでは、どのノードが照会されますか?
答えて
私自身の研究の答えによれば、質問は - 最後に接続されたノードを選択します。私は見つかった場合には誤りを指摘することに感謝します - 記憶は本当に複雑なシステムです!
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.
で、必要に応じて、テーブルのノードをマスター(何らかの理由で)無視されたテーブルを削除するには、リストを縮小し、リストを縮小現在のノードを接続した後、次の順序で選択する:任意の利用可能なノードを
- まず非
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) ].
まあ、ノードCは、クエリを実行するためにノードAまたはノードBのいずれかに連絡する必要があります。したがって、ノードCは、どのテーブルコピーがクエリを実行するかを決定しなければならない。
これ以上のものが必要な場合は、どのノードを照会するかを決めるアルゴリズムを必要とするか、ノードCの表を複製する必要があります(これは通常、どのような種類の特性)。
ノードAとノードBがデータベースクラスタの一部を形成している場合や、データベースクラスタの一部である場合は、おそらくラウンドロビンアルゴリズム(またはランダムに指定してください)が適しています。
- 1. mnesiaクラスタにノードを追加するにはどうすればよいですか?
- 2. クラッシュしたerlang mnesiaノードを再びクラスタに再接続するにはどうすればいいですか?
- 3. JSONノードの値を別のノードの値で照会してください
- 4. データベースはSQLAlchemyでいつ実際に照会されますか?
- 5. SolrJ 5.5.0 qf値(クエリフィールド)が正しく照会されない、または全く照会されない
- 6. Cassandraクラスタの1ノードあたりのデータ量はどれくらいですか?
- 7. ノードの子を照会する簡単な方法はありますか?
- 8. XElementを使用してネームスペース内のノードを照会します
- 9. OpsCenter Communityは単一ノードのCassandraクラスタで動作しますか?
- 10. servicestackプロパティの照会名で照会
- 11. スケジュールされたタスクの状態(アクティブまたは非アクティブ)はどのように照会できますか?
- 12. numpy:マスクされたレコードからデータを照会しますか?
- 13. スーパークラスが照会されるCriteriaQueryのサブクラス固有のフィールドを参照する方法はありますか?
- 14. elasticserchのさまざまなフィールドを照会するにはどうすればよいですか?
- 15. ElasticSearchのネストされたドキュメントの照会
- 16. ノードjsクラスタのレプリケートされたアレイを更新する
- 17. シリアライズされたオブジェクトファイルを照会する
- 18. Regexオブジェクト照合で指定された文字列パターンで照会します
- 19. ノードのすべての子のオブジェクトをDjango mpttでどのように照会するのですか?
- 20. libmemcachedクラスタのノードのフェールオーバー
- 21. はどうすればオーチャードのコメントを照会していますか?
- 22. データベースの照会で、$データではなく、ビューに表示されます
- 23. カスタム属性は、それが接続されているプロパティの値を照会できますか?
- 24. ドライバー側で複数の照会がどのように実行されるのですか?
- 25. nullコレクションがLINQクエリ構文で照会されるとどうなりますか?
- 26. mongodbのadmin.system.namespacesでの照会が許可されていません
- 27. は、それが可能に照会することです
- 28. トレーニングで照会
- 29. LINQ to SQLをグリッドビューにバインドするときに、どのフィールドが照会されますか?
- 30. JayDataでの照会
は私の編集した記事をチェックしてください: は、あなたがこの(汚いハック)コードを使用することができ、特定のノード上でアクティブなレプリカのリストをチェックアウトするには私が尋ねたもの私は場所の指定なしでノードCでクエリを実行できます。したがって、使用するテーブルコピーをどのように選択するのですか? – ryeguy
ノードが実際にそのスキーマにテーブルを持っていないことを知りませんでした。申し訳ありません、私の悪い! –