2009-03-08 13 views
19

¿Es posible recuperarse de una partición de red en un clúster mnesia sin reiniciar cualquiera de los nodos involucrados? Si es así, ¿cómo se hace?recuperación mnesia línea de partición de red

Estoy interesado específicamente en saber:

  • ¿Cómo se puede hacer esto con el mnesia OTP estándar (v4.4.7)
  • Qué código personalizado si alguien tiene que escribir para que esto suceda (por ejemplo, suscribirse a mnesia running_paritioned_network events, determinar un nuevo maestro, fusionar registros de no maestro a maestro, forzar tabla de carga desde el nuevo maestro, borrar el evento de red paritizado - el código de ejemplo sería muy apreciado).
  • O, que mnesia categóricamente no soporta recuperación en línea y no requiere que el nodo (s) que son parte de la partición no maestro ser reiniciado.

Aunque aprecio los consejos para la teoría general de sistemas distribuidos, en esta pregunta me interesa erlang/OTP mnesia solamente.

+1

@Gortok: http://www.infoq.com/news/2007/08/mnesia – Flinkman

Respuesta

15

Después de algunos experimentos que he descubierto lo siguiente:

  • Mnesia considera que la red se repartió si entre dos nodos hay una desconexión de nodo y una reconexión sin un reinicio mnesia.
  • Esto es válido incluso si no se realizan operaciones de lectura/escritura de Mnesia durante el tiempo de la desconexión.
  • Mnesia sí debe reiniciarse con el fin de despejar el evento de red con particiones - no se puede force_load_table después se somete a reparto la red.
  • Solo se debe reiniciar Mnesia para borrar el evento particionado de red. No necesita reiniciar todo el nodo.
  • Mnesia resuelve la partición de la red por tener el nodo Mnesia recién renovadas sobrescribir sus datos de la tabla con los datos de otro nodo Mnesia (la tabla algoritmo de carga de inicio).
  • Generalmente, los nodos copiarán las tablas del nodo que haya estado más tiempo activo (este fue el comportamiento que vi, no he verificado que esto esté codificado explícitamente y no sea un efecto secundario de otra cosa). Si desconecta un nodo de un clúster, realiza escrituras en ambas particiones (el nodo desconectado y sus pares anteriores), apaga todos los nodos y los inicia todos una copia de seguridad iniciando primero el nodo desconectado, el nodo desconectado se considerará el maestro y su los datos sobrescribirán todos los otros nodos. No hay comparación de tabla/comportamiento de suma de comprobación/quórum.

Así que para responder a mi pregunta, se puede realizar la recuperación semi línea mediante la ejecución de mnesia:stop(), mnesia:start() en los nodos de la partición cuyos datos decide descartar (que llamaré a la partición perdida). Al ejecutar la llamada mnesia:start(), el nodo se pondrá en contacto con los nodos del otro lado de la partición. Si tiene más de un nodo en la partición perdedora, puede establecer los nodos maestros para la carga de la tabla en los nodos de la partición ganadora; de lo contrario, creo que existe la posibilidad de que cargue tablas de otro nodo en la partición perdedora y así regresar al estado de red particionada.

Desafortunadamente, mnesia no brinda soporte para fusionar/conciliar el contenido de la tabla durante la fase de carga de la tabla de inicio, ni tampoco permite regresar a la fase de carga de la tabla una vez iniciada.

Una fase de fusión sería adecuada para ejabberd en particular, ya que el nodo todavía tendría conexiones de usuario y así sabría qué registros de usuario posee/debería ser el más actualizado (suponiendo una conexión de usuario por clúster). Si existía una fase de fusión, el nodo podía filtrar las tablas de datos de usuario, guardar todos los registros para los usuarios conectados, cargar las tablas como de costumbre y luego volver a escribir los registros guardados en el clúster de mnesia.

+0

No me dejes aceptar mi propia respuesta que te desanime. Me gustaría una mejor solución o correcciones. – archaelus

+0

¿Viste que Ulf no estaba dividido? https://github.com/esl/unsplit – Bwooce

0

Funciona así. Imagina el cielo lleno de pájaros. Toma fotos hasta que tengas todas las aves. Coloque las imágenes sobre la mesa. Mapa de imágenes una sobre la otra. Entonces ves a todos los pájaros una vez. ¿Ves a todos los pájaros? De acuerdo. Entonces sabes, en ese momento. El sistema era estable. Registre cómo suenan todas las aves (mensajes) y tome más fotos. Entonces repite.

Si usted tiene una fracción de nodo. Regrese a la última instantánea estable común. Y prueba ** a reproducir lo que se agrega después de eso. :)

es mejor descrito en "instantáneas distribuir: La determinación de los Estados Mundial de Sistemas Distribuidos" K. MANI Chandy y Leslie Lamport

** creo que hay un problema de decidir quién es el reloj para ir después al intentar para volver a reproducir lo que sucedió

+0

La teoría podría descartar una resolución automática en el caso general, pero no estoy pidiendo eso. Estoy bastante de acuerdo con que un ser humano tome decisiones para romper vínculos, elegir maestros, perder datos, etc. Quiero saber si los gurús de mnesia pueden recuperarse (aunque sea manualmente) de una partición sin reiniciar un nodo. – archaelus

0

respuesta de Sara es grande, incluso mirar artículo sobre CAP. Los desarrolladores de Mnesia sacrifican P por CA. Si necesita P, entonces debe elegir qué tipo de CAP desea sacrificar y qué opción tiene otro almacenamiento. Por ejemplo, CouchDB (sacrificio C) o Scalaris (sacrificio A).

+0

Esto no tiene sentido; no puedes "sacrificar a P". Las únicas opciones en una red con particiones son CP o AP. Mnesia no es ninguna de esas (en el contexto de tablas fragmentadas, puede ser CP para tablas no fragmentadas). –