2010-08-26 10 views
8

Sono in esecuzione due nodi di erlang con un database mnesia replicato. Ogni volta che provavo ad avviarne uno mentre MNESIA NON CORRE sull'altro, mnesia: wait_for_tables (? TABS,? TIMEOUT), si bloccava sul nodo da cui era chiamato. Ho bisogno di una struttura in cui (se entrambi i nodi non sono in esecuzione), posso iniziare a lavorare con uno mentre l'altro è giù e in seguito decidere di portare l'altro in su e continuare a funzionare bene. Devo essere sicuro che il primo nodo in esecuzione sia stato aggiornato più tardi quando si alza. Questo richiede necessariamente che ne abbia uno come maestro?Qual è il significato di un nodo master Mnesia in un cluster

%%% Modificato .......................................... .................................

Oh, ce l'ho. Il database che stavo usando aveva un paio di tabelle frammentate. Alcuni dei frammenti erano stati distribuiti attraverso la rete per il bilanciamento del carico. Quindi, Mnesia su un host proverebbe a caricarli attraverso la rete e fallirebbero dal momento che mnesia sull'altro è giù!

Immagino che questo non abbia niente a che fare con un nodo mnesia. Ma mi piacerebbe ancora capire il significato dello stesso perché non l'ho mai usato prima, tuttavia, gioco sempre con schemi distribuiti.

Grazie ancora ...

risposta

4

nodi master mnesia vengono utilizzati per risolvere le situazioni split-cervello in modo abbastanza brutale. Se la mnesia scopre una situazione split-brain, emetterà un evento, "running network partizionato". Un modo per rispondere a questo sarebbe impostare i nodi master sull '"isola" che si desidera mantenere e quindi riavviare gli altri nodi. Quando tornano su, caricano incondizionatamente le tabelle dai nodi principali.

C'è un altro meccanismo in mnesia, chiamato force_load. Si dovrebbe essere molto cauti con esso, ma nel caso in cui si hanno due nodi, A e B, terminare B (A registra B come giù), quindi terminare A, quindi riavviare B, B non avrà informazioni su quando A è andato giù , quindi rifiuterà di caricare tabelle che hanno una copia su A. Se sai che A non tornerà presto, puoi scegliere di chiamare mnesia: force_load_tables (Ts) su B, che farà sì che venga eseguito con le proprie copie. Una volta che A viene ripristinato, rileverà che B è attivo e caricherà le tabelle da esso. Come puoi vedere, ci sono molti altri scenari in cui puoi ritrovarti con un database incoerente. Mnesia non lo risolverà, ma cercherà di fornire strumenti per risolvere la situazione se si presentasse. Nello scenario sopra, sfortunatamente, mnesia non ti darà suggerimenti, ma è possibile creare un'applicazione che rilevi il problema.

+0

Grazie utente6834 –

+0

uwiger, grazie. Pensa (in futuro), mnesia avrà un modo di unire due repliche basandosi su un meccanismo di aggiornamento recente o un qualche tipo di segnature temporali, specialmente quando viene rilevato l'errore fatale "rete partizionata in esecuzione"? –

+1

Questo è possibile fare oggi, anche se non molto ben documentato o testato in tutte le parti. http://github.com/esl/unsplit è una libreria per l'unione automatica di tabelle mnesia dopo netsplits. Le versioni recenti di mnesia sono state accuratamente migliorate per supportare questo, e R14B03 aggiunge anche una forma di controllo del quorum ('maggioranza') per ridurre il rischio di incongruenze difficili da risolvere. – uwiger

Problemi correlati