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.
@Gortok: http://www.infoq.com/news/2007/08/mnesia – Flinkman