Еще один способ восстановления после такого рода сбоев - это работа с Mnesia, которая является базой данных, которую RabbitMQ использует в качестве механизма сохранения, и для синхронизации экземпляров RabbitMQ (и статуса главного / подчиненного) это контролируется. Все подробности см. По следующему URL: http://www.erlang.org/doc/apps/mnesia/Mnesia_chap7.html
Есть несколько случаев, когда Mnesia может обнаружить, что сеть
был разбит на разделы из-за сбоя связи.
Во-первых, Mnesia уже запущена и работает, а узлы Erlang набирают
связаться снова Тогда Mnesia попытается связаться с Mnesia по другому
узел, чтобы увидеть, если он также думает, что сеть была разделена
какое-то время. Если Mnesia на обоих узлах зарегистрировала записи mnesia_down
Mnesia генерирует системное событие, называемое
{inconsistent_database, running_partitioned_network, Node}, который является
отправлено обработчику событий Mnesia и другим возможным подписчикам.
обработчик событий по умолчанию сообщает об ошибке в журнал ошибок.
Еще один случай, когда Mnesia может обнаружить, что сеть была
разделен из-за сбоя связи, находится при запуске. Если Мнезия
обнаруживает, что и локальный узел, и другой узел получили mnesia_down
друг от друга он генерирует {inconsistent_database,
начальное_частичное_сеть, системное событие Node} и действует как описано
выше.
Если приложение обнаруживает, что произошел сбой связи
который мог вызвать несовместимость базы данных, он может использовать
Функция Mnesia: set_master_nodes (Tab, Nodes), чтобы точно определить, из которого
узлы каждая таблица может быть загружена.
При запуске алгоритм нормальной загрузки таблицы Mnesia будет обойден и
таблица будет загружена с одного из главных узлов, определенных для
таблица, независимо от потенциальных записей mnesia_down в журнале.
Узлы могут содержать только узлы, где таблица имеет реплику, и если она
пуст, механизм восстановления главного узла для конкретной таблицы
будет сброшен, и следующий механизм будет использоваться, когда следующий
перезапуск.
Функция mnesia: set_master_nodes (Nodes) устанавливает главные узлы для всех
столы. Для каждой таблицы он определит свои узлы реплики и вызовет
mnesia: set_master_nodes (Tab, TabNodes) с теми узлами реплики, которые
включены в список узлов (то есть TabNodes является пересечением
Узлы и реплики узлов таблицы). Если пересечение
пустой механизм восстановления главного узла для конкретной таблицы
будет сброшен, и при следующем перезапуске будет использоваться механизм нормальной нагрузки.
Функции mnesia: system_info (master_node_tables) и
mnesia: table_info (Tab, master_nodes) может использоваться для получения информации
о потенциальных главных узлах.
Определение данных для хранения после сбоя связи
Сфера Мнезия. Один из подходов состоит в том, чтобы определить, какой "остров"
содержит большинство узлов. Используя опцию {большинство, правда} для
критические таблицы могут быть способом обеспечения того, что узлы, которые не являются частью
«острова большинства» не могут обновить эти таблицы. Обратите внимание, что
это составляет сокращение обслуживания на узлах меньшинства. это
было бы компромиссом в пользу более высоких гарантий согласованности.
Функция mnesia: force_load_table (Tab) может использоваться для принудительной загрузки
таблица независимо от того, какой механизм загрузки таблицы активирован.