Pregunta

¿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 se hace?

Estoy interesado específicamente en saber:

  • Cómo se puede hacer esto con la OTP mnesia estándar (v4.4.7)
  • ¿Qué código personalizado si alguien necesita escribir para que esto suceda? (por ejemplo, suscríbase a eventos de mnesia running_paritioned_network, determine un nuevo maestro, combine registros de no maestro a maestro, fuerce la tabla de carga del nuevo maestro, borre la red parituada en funcionamiento evento: el 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 punteros a la teoría general de sistemas distribuidos, en esta pregunta solo estoy interesado en erlang / OTP mnesia.

¿Fue útil?

Solución

Después de algunos experimentos, descubrí 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 de Mnesia durante el tiempo de la desconexión.
  • Mnesia debe reiniciarse para borrar el evento de la red particionada, no puede force_load_table después de que la red esté particionada.
  • 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 haciendo que el nodo Mnesia recién reiniciado sobrescriba los datos de su 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 ha estado activo más tiempo (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), cierra todos los nodos y vuelve a iniciarlos de nuevo iniciando primero el nodo desconectado, el nodo desconectado se considerará el maestro y su Los datos sobrescribirán todos los demás nodos. No hay comparación de tabla / comportamiento de 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 en la partición cuyos datos decide descartar (que yo llamaré a la partición perdedora). La ejecución de la llamada 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 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, por lo tanto, volver al estado de la red particionada.

Lamentablemente, mnesia no ofrece soporte para fusionar / conciliar los contenidos 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 todavía tendría conexiones de usuario y, por lo tanto, sabría qué registros de usuario posee / debería ser el más actualizado (suponiendo una conexión de usuario por clúster). Si existiera una fase de combinació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 escribir los registros guardados en el clúster mnesia.

Otros consejos

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

Funciona así. Imagina el cielo lleno de pájaros. Toma fotos hasta que tengas todos los pájaros. Coloca los cuadros sobre 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 tiene un nodo dividido. Vuelve a la última instantánea estable común. E intenta ** repetir lo que se añade después de eso. :)

Está mejor descrito en "Instantáneas distribuidas: determinación de estados globales de sistemas distribuidos" K. MANI CHANDY y LESLIE LAMPORT

** Creo que hay un problema para decidir a quién ir después cuando intentas reproducir lo que pasó

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top