Оперативное восстановление mnesia из сетевого раздела [закрыто]

StackOverflow https://stackoverflow.com/questions/624570

  •  05-07-2019
  •  | 
  •  

Вопрос

Возможно ли восстановление из сетевого раздела в кластере mnesia без перезапуска какого-либо из задействованных узлов?Если да, то как к этому подступиться?

Я конкретно заинтересован в том, чтобы знать:

  • Как это можно сделать с помощью стандартной OTP mnesia (v4.4.7)
  • Какой пользовательский код, если кому-либо нужно написать, чтобы это произошло (напримерподпишитесь на события mnesia running_paritioned_network, определите новый мастер, объедините записи от не-мастера к мастеру, принудительно загрузите таблицу с нового мастера, очистите запущенное разделенное сетевое событие - пример кода был бы весьма признателен).
  • Или, что mnesia категорически не поддерживает оперативное восстановление и требует перезапуска узла (ов), которые являются частью не главного раздела.

Хотя я ценю указания на общую теорию распределенных систем, в этом вопросе меня интересует только erlang / OTP mnesia.

Это было полезно?

Решение

После некоторых экспериментов я обнаружил следующее:

  • Mnesia считала сеть разделенной, если между двумя узлами происходит отключение узла и повторное подключение без перезапуска mnesia.
  • Это верно, даже если во время отключения никаких операций чтения / записи Mnesia не происходит.
  • Сама Mnesia должна быть перезапущена, чтобы очистить разделенное сетевое событие - вы не можете force_load_table после того, как сеть будет разделена на разделы.
  • Только Mnesia необходимо перезапустить, чтобы очистить событие с разделением сети.Вам не нужно перезапускать весь узел.
  • Mnesia разрешает разделение сети, заставляя недавно перезапущенный узел Mnesia перезаписывать данные своей таблицы данными с другого узла Mnesia (алгоритм загрузки начальной таблицы).
  • Как правило, узлы копируют таблицы с узла, который работает дольше всех (это было поведение, которое я видел, я не проверял, что это явно закодировано, а не побочный эффект чего-то другого).Если вы отключите узел от кластера, выполните записи в обоих разделах (отключенном узле и его старых одноранговых узлах), выключите все узлы и запустите их резервное копирование заново, запустив отключенный узел первым, отключенный узел будет считаться главным, и его данные перезапишут все остальные узлы.Отсутствует сравнение таблиц / контрольная сумма / поведение кворума.

Итак, чтобы ответить на мой вопрос, можно выполнить полуинтернет-восстановление, выполнив mnesia:stop(), mnesia:start() на узлах раздела, данные которого вы решили удалить (который я буду называть потерянным разделом).Выполняя mnesia:start() вызов приведет к тому, что узел свяжется с узлами на другой стороне раздела.Если у вас более одного узла в проигравшем разделе, вы можете захотеть установить главные узлы для загрузки таблиц на узлы в выигравшем разделе - в противном случае, я думаю, есть шанс, что он загрузит таблицы с другого узла в проигравшем разделе и, таким образом, вернется в состояние разделенной сети.

К сожалению, mnesia не предоставляет поддержки для объединения / согласования содержимого таблицы на этапе загрузки начальной таблицы и не предусматривает возврата к этапу загрузки таблицы после запуска.

Фаза слияния была бы подходящей, в частности, для ejabberd, поскольку узел все еще имел бы пользовательские подключения и, таким образом, знал, какие пользовательские записи, которыми он владеет / для которых они должны быть наиболее актуальными (при условии, что одно пользовательское соединение на кластер).Если бы существовала фаза слияния, узел мог бы фильтровать таблицы пользовательских данных, сохранять все записи для подключенных пользователей, загружать таблицы как обычно, а затем записывать сохраненные записи обратно в кластер mnesia.

Другие советы

Ответ Сары великолепен, даже посмотрите на статью о КОЛПАЧОК.Разработчики Mnesia жертвуют P ради CA.Если вам нужен P, то вам следует выбрать, какой из CAP вы хотите пожертвовать, а затем выбрать другое хранилище.Например CouchDB (жертва C) или Скалярис (жертва А).

Это работает следующим образом.Представьте себе небо, полное птиц.Фотографируйте до тех пор, пока не получите всех птиц.Разложите фотографии на столе.Нанесите изображения друг на друга.Таким образом, вы видите каждую птицу по одному разу.Вы видите каждую птицу?ОК.Тогда вы знаете, в то время.Система была стабильной.Запишите, на что похожи звуки всех птиц (сообщения), и сделайте еще несколько снимков.Затем повторите.

Если у вас есть разделенный узел.Вернитесь к последнему общему стабильному снимку.И попробуйте ** воспроизвести то, что добавляется после этого.:)

Это лучше описано в разделе "Распределенные моментальные снимки:Определение глобальных состояний распределенных систем" К.МАНИ ЧЕНДИ и ЛЕСЛИ ЛЭМПОРТ

** Я думаю, что есть проблема с выбором того, за чьими часами идти, когда пытаешься воспроизвести то, что произошло

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top