Domanda

Diciamo che avete un tavolo mnesia replicata sui nodi A e B. Se sul nodo C, che non contiene una copia della tabella, che faccio mnesia:change_config(extra_db_nodes, [NodeA, NodeB]), e poi sul nodo CI non mnesia:dirty_read(user, bob) come fa il nodo C scegliere quale nodo di copia della tabella per eseguire una query su?

È stato utile?

Soluzione

Secondo la mia risposta personale di ricerca per la domanda è - si sceglierà il nodo più recente collegato . Sarò grato per aver evidenziato errori se trovato -! Mnesia è un sistema molto complesso

Dan Gudmundsson ha sottolineato out sull'algoritmo lista di selezione del nodo remoto di interrogazione è definita mnesia_lib:set_remote_where_to_read/2. E 'il seguente

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.

Così si ottiene l'elenco dei active_replicas (vale a dire l'elenco dei candidati), si restringe opzionalmente la lista di padroneggiare i nodi per la tavola, rimuovere le tabelle devono essere ignorati (per qualsiasi motivo), riduce la lista ai nodi attualmente collegati e poi seleziona in il seguente ordine:

  1. In primo luogo non disc_only_copies
  2. Ogni nodo disponibile

La parte più importante è infatti l'elenco dei active_replicas, in quanto determina l'ordine dei nodi nella lista dei candidati.

Elenco active_replicas è formato da chiamate remote di mnesia_controller:add_active_replica/* dai nodi appena collegati a vecchi nodi (cioè uno che erano nel cluster prima), che si riduce alla funzione add/1 che aggiunge l'articolo come la testa della lista.

Quindi risposta per la domanda è -. Sceglierà il nodo più recente collegato

Note: Per controllare l'elenco delle repliche attivi sul nodo data è possibile utilizzare questo (dirty hack) codice:

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

Altri suggerimenti

Bene, il nodo C avrebbe bisogno di contattare sia il nodo A e il nodo B al fine di fare una query. Così il nodo C dovrà decidere per sé, che copia tavolo per eseguire la query.

Se avete bisogno di qualcosa di più di questo si sarebbe neanche bisogno di avere qualche algoritmo che deciderà quale nodo di interrogare su, o addirittura replicare la tabella sul nodo C (questo sarebbe in genere dipenderà da che tipo di caratteristiche che si desidera / bisogno) .

Se il nodo A e la forma del nodo B o fanno parte di un cluster di database, un buon inizio è probabilmente l'algoritmo round robin (o casuale, come lei suggerisce).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top