Каково значение Mnesia Master Node в кластере - PullRequest
8 голосов
/ 26 августа 2010

Я использую два узла erlang с реплицированной базой данных mnesia.Всякий раз, когда я пытался запустить один из них, в то время как mnesia не работает на другом, mnesia: wait_for_tables (? TABS,? TIMEOUT) зависал на узле, из которого он вызван.Мне нужно иметь структуру, в которой (если оба узла не работают), я могу начать работать с одним, когда другой не работает, и позже решу включить другой, но продолжать работать хорошо.Я должен быть уверен, что первый запущенный узел обновился позже, когда он встал.Обязательно ли для этого мне нужно иметь его в качестве мастера?

%%% Отредактировано ...........................................................................

О, я понял.База данных, которую я использовал, содержала несколько фрагментированных таблиц.Некоторые фрагменты были распределены по сети для балансировки нагрузки.Таким образом, Mnesia на одном хосте будет пытаться загрузить их через сеть и потерпит неудачу, так как mnesia на другом не работает!

Я думаю, это не имеет ничего общего с главным узлом mnesia.Но я все еще хотел бы понять значение того же самого, потому что я не использовал его прежде, но я всегда играю с распределенными схемами.

Еще раз спасибо ...

1 Ответ

4 голосов
/ 10 октября 2010

Мастер-узлы Mnesia используются для довольно жестокого разрешения сплит-мозговых ситуаций.Если mnesia обнаружит ситуацию с раздвоенным мозгом, она выдаст событие «работа с разделенной сетью».Один из способов ответить на это - установить главные узлы на «остров», который вы хотите сохранить, а затем перезапустить другие узлы.Когда они возвращаются, они безоговорочно загружают таблицы из главных узлов.

В mnesia есть еще один механизм, называемый force_load.Нужно быть очень осторожным с этим, но в случае, когда у вас есть два узла, A и B, завершите B (A записывает B как вниз), затем завершите A, затем перезапустите B, B не будет иметь информации о том, когда A вышел, поэтому откажется загружать таблицы с копией на A. Если вы знаете, что A не скоро вернется, вы можете вызвать mnesia: force_load_tables (Ts) для B, что заставит его работать с собственными копиями.Как только A возвращается, он обнаруживает, что B включен, и загружает из него таблицы.Как видите, есть несколько других сценариев, в которых вы можете получить несовместимую базу данных.Mnesia не исправит это, но попытается предоставить инструменты для разрешения ситуации, если она возникнет.В приведенном выше сценарии, к сожалению, mnesia не даст вам подсказок, но возможно создать приложение, которое обнаружит проблему.

...