2010-08-26 8 views
8

Estoy ejecutando dos nodos de erlang con una base de datos de mnesia replicada. Cada vez que intenté iniciar uno de ellos mientras mnesia NO se estaba ejecutando en el otro, mnesia: wait_for_tables (? TABS,? TIMEOUT), colgaría en el nodo desde el que se llamaba. Necesito tener una estructura donde (si ambos nodos no se están ejecutando), puedo empezar a trabajar con uno mientras que el otro está inactivo y luego decidir llevar el otro y seguir trabajando bien. Necesito estar seguro de que el primer nodo que se estaba ejecutando se actualizó más tarde cuando se levanta. ¿Esto necesariamente requiere que tenga uno como maestro?Cuál es la importancia de un Nodo maestro de Mnesia en un clúster

%%% Editado .......................................... .................................

Oh, lo tengo. La base de datos que estaba usando tenía un par de tablas fragmentadas. Algunos de los fragmentos se habían distribuido a través de la red para equilibrar la carga. Entonces, Mnesia en un host trataría de cargarlos a través de la red y fallaría ya que mnesia en el otro no funciona.

Supongo que esto no tiene nada que ver con un nodo maestro de mnesia. Pero todavía me gustaría entender el significado de lo mismo porque no lo he usado antes, sin embargo, siempre juego con esquemas distribuidos.

Gracias de nuevo ...

Respuesta

4

nodos Mnesia maestras se utilizan para resolver situaciones de cerebro dividido de una manera bastante brutal. Si mnesia descubre una situación de cerebro dividido, emitirá un evento, "ejecutar una red particionada". Una forma de responder a esto sería establecer nodos maestros en la "isla" que desea conservar, y luego reiniciar los otros nodos. Cuando regresen, cargarán incondicionalmente las tablas de los nodos maestros.

Hay otro mecanismo en mnesia, llamado force_load. Uno debe ser muy cuidadoso con esto, pero en el caso de que tenga dos nodos, A y B, termine B (A registra los B como abajo), luego termine A, luego reinicie B, B no tendrá información sobre cuándo bajó A , por lo que se negará a cargar tablas que tengan una copia en A. Si sabe que A no volverá pronto, puede elegir llamar a mnesia: force_load_tables (Ts) en B, lo que hará que se ejecute con sus propias copias. Una vez que A vuelve a subir, detectará que B está activo y cargará tablas desde allí. Como puede ver, hay varios otros escenarios donde puede terminar con una base de datos inconsistente. Mnesia no solucionará eso, pero trata de proporcionar herramientas para resolver la situación si surge. En el escenario anterior, desafortunadamente, mnesia no le dará pistas, pero es posible crear una aplicación que detecte el problema.

+0

Gracias user6834 –

+0

uwiger, gracias. ¿Cree que (en el futuro), mnesia tendrá una forma de fusionar dos réplicas basadas en un mecanismo de actualización reciente o algún tipo de firma de tiempo, especialmente cuando se detecta el error fatal "ejecución de red particionada"? –

+1

Esto es posible de hacer hoy, aunque no está muy bien documentado o probado en todas partes. http://github.com/esl/unsplit es una biblioteca para la fusión automática de tablas de mnesia después de netsplits. Las versiones recientes de mnesia se han mejorado cuidadosamente para respaldar esto, y R14B03 también agrega una forma de verificación de quórum ('mayoría') para reducir el riesgo de incoherencias difíciles de resolver. – uwiger

Cuestiones relacionadas