Otra forma de recuperarse de este tipo de error es trabajar con Mnesia, que es la base de datos que usa RabbitMQ como mecanismo de persistencia y para la sincronización de las instancias RabbitMQ (y el estado maestro/esclavo). . Para todos los detalles, se refieren a la siguiente URL: http://www.erlang.org/doc/apps/mnesia/Mnesia_chap7.html
Hay varias ocasiones cuando Mnesia puede detectar que la red se ha dividido debido a un fallo de comunicación.
Una es cuando Mnesia ya está en funcionamiento y los nodos de Erlang obtienen contacto de nuevo. Entonces Mnesia intentará ponerse en contacto con Mnesia en el otro nodo para ver si también cree que la red ha sido particionada por un tiempo. Si Mnesia en ambos nodos ha registrado las entradas mnesia_down entre sí, Mnesia genera un evento del sistema, llamado {inconsistent_database, running_partitioned_network, Node} que es enviado al manejador de eventos de Mnesia y a otros posibles suscriptores. El controlador de evento predeterminado informa un error al registrador de errores.
En otra ocasión cuando Mnesia puede detectar que la red ha sido particionada debido a una falla de comunicación, está en la puesta en marcha. Si Mnesia detecta que tanto el nodo local como otro nodo recibieron mnesia_down uno del otro, genera un {sistema de base de datos inconsistente, starting_network, Node} y actúa como se describe anteriormente .
Si la aplicación detecta que ha habido un fallo de comunicación que puede haber causado una base de datos incompatibles, puede utilizar el función mnesia: set_master_nodes (Tab, nodos) para determinar a partir del cual nodos cada mesa puede ser cargado.
En algoritmo de carga de la mesa normal del Mnesia de puesta en marcha será anulada y la mesa serán cargados desde uno de los nodos principales definidos para la tabla , independientemente de las entradas potenciales mnesia_down en el registro. Los nodos solo pueden contener nodos donde la tabla tiene una réplica y si está vacío, el mecanismo de recuperación del nodo principal para la tabla particular se reiniciará y el mecanismo de carga normal se utilizará cuando se reinicie el siguiente .
La función mnesia: set_master_nodes (Nodos) establece nodos maestros para todas las tablas . Para cada tabla, determinará sus nodos de réplica e invocará mnesia: set_master_nodes (Tab, TabNodes) con los nodos de réplica que están incluidos en la lista Nodos (es decir, TabNodes es la intersección de los nodos y los nodos de réplica de la tabla). Si la intersección es vacía, el mecanismo de recuperación del nodo principal para la tabla particular será se reiniciará y el mecanismo de carga normal se usará en el siguiente reinicio.
El funciones mnesia: SYSTEM_INFO (master_node_tables) y mnesia: table_info (Tab, master_nodes) se pueden usar para obtener información sobre los posibles nodos maestros.
Determinar qué datos conservar después de una falla de comunicación está fuera del alcance de Mnesia. Un enfoque sería determinar qué "isla" contiene la mayoría de los nodos. El uso de la opción {mayoría, verdadero} para tablas críticas puede ser una forma de garantizar que los nodos que no son parte de una "isla mayoritaria" no puedan actualizar esas tablas. Tenga en cuenta que esto constituye una reducción en el servicio en los nodos minoritarios. Esta sería una compensación a favor de garantías de mayor consistencia.
La función mnesia: force_load_table (Tab) se puede usar para forzar la carga independientemente de qué mecanismo de carga de tabla esté activado.
¿Es posible configurar los nodos para que DO sincronicen automáticamente sus estados siempre que la red esté disponible nuevamente? –
Que yo sepa (a menos que esto esté disponible en una versión más nueva de RabbitMQ ... no he verificado por lo menos un año). –