significado erlang mnesia

erlang - significado - mnesia database



Recuperación de mnesia en línea desde la partición de red (3)

Después de algunos experimentos he descubierto lo siguiente:

  • Mnesia consideró que la red estaba particionada si entre dos nodos hay una desconexión de nodo y una reconexión sin un reinicio de mnesia.
  • Esto es cierto incluso si no se producen operaciones de lectura / escritura Mnesia durante el tiempo de la desconexión.
  • Mnesia debe reiniciarse para borrar el evento de la red particionada: no puede force_load_table la force_load_table una force_load_table después de particionar la red.
  • Solo se debe reiniciar Mnesia para borrar el evento particionado de la red. No es necesario reiniciar todo el nodo.
  • Mnesia resuelve la partición de la red al hacer que el nodo Mnesia recién reiniciado sobrescriba sus datos de tabla con datos de otro nodo Mnesia (el algoritmo de carga de la tabla de inicio).
  • En general, los nodos copiarán las tablas del nodo que haya estado más tiempo arriba (este fue el comportamiento que vi, no he verificado que 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), cierra todos los nodos y vuelve a iniciarlos nuevamente iniciando el nodo desconectado primero, el nodo desconectado se considerará el maestro y su Los datos sobrescribirán todos los demás nodos. No hay comportamiento de comparación de tablas / suma de comprobación / quórum.

Entonces, para responder a mi pregunta, uno puede realizar una recuperación semi en línea ejecutando mnesia:stop(), mnesia:start() en los nodos de la partición cuyos datos decida descartar (a los que llamaré partición perdedora). La ejecución de la mnesia:start() hará que el nodo se ponga en contacto con los nodos del otro lado de la partición. Si tiene más de un nodo en la partición perdedora, es posible que desee configurar los nodos maestros para cargar tablas 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, por lo tanto, volver al estado de la red particionada.

Lamentablemente, mnesia no proporciona soporte para fusionar / reconciliar el contenido de la tabla durante la fase de carga de la tabla de inicio, ni tampoco permite volver 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 aún tendría conexiones de usuario y, por lo tanto, sabría qué registros de usuario posee o deberían ser los más actualizados para (asumiendo una conexión de usuario por grupo). Si existiera una fase de fusión, el nodo podrí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.

¿Es posible recuperarse de una partición de red en un clúster de mnesia sin reiniciar ninguno de los nodos involucrados? Si es así, ¿cómo lo hace uno?

Estoy interesado específicamente en saber:

  • Cómo se puede hacer esto con la mnesia estándar de OTP (v4.4.7)
  • ¿Qué código personalizado, si alguien necesita escribir para que esto suceda? (P. Ej., Suscríbase a mnesia running_paritioned_network events, determine un nuevo master, combine registros de no master a master, fuerce la tabla de carga del nuevo master, borre el evento de red en funcionamiento con partición) código de ejemplo sería muy apreciado).
  • O bien, esa mnesia no admite categóricamente la recuperación en línea y requiere que los nodos que forman parte de la partición no maestra se reinicien.

Si bien aprecio los indicadores de la teoría general de sistemas distribuidos, en esta pregunta solo me interesa erlang / OTP mnesia.


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

Si tienes un nodo dividido. Vuelve a la última instantánea estable común. E intenta ** repetir lo que se añade después de eso. :)

Se describe mejor en "Instantáneas distribuidas: Determinación de estados globales de sistemas distribuidos" K. MANI CHANDY y LESPORT LESLIE

** Creo que hay un problema para decidir quién es el reloj al que se debe ir cuando se intenta reproducir lo que sucedió


La respuesta de Sara es genial, incluso mira el artículo sobre la CAP . Los desarrolladores de Mnesia sacrifican P por CA. Si necesita P, debe elegir qué CAP desea sacrificar y luego elegir otro almacenamiento. Por ejemplo, CouchDB (sacrificio C) o Scalaris (sacrificio A).