2009-03-08 2 views
19

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

Я заинтересован конкретно знать:

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

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

+1

@ Gortok: http://www.infoq.com/news/2007/08/mnesia – Flinkman

ответ

15

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

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

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

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

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

+0

Не позволяйте мне принимать мой собственный ответ, чтобы отложить вас - я хотел бы получить лучшее решение или исправления. – archaelus

+0

Вы видели, как Ульф нерасчленен? https://github.com/esl/unsplit – Bwooce

0

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

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

Это лучше описано в «Распределенные Фотоснимки: Определение глобальных состояний распределенных систем» К. МАНИ Чанди и Лэмпорт

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

+0

Теория может исключить автоматическое разрешение в общем случае, но я не прошу об этом. Я вполне согласен с тем, что человек принимает решения, чтобы разорвать связи, выбрать мастеров, потерять данные и т. Д. Я хочу знать, может ли гуру mnesia восстановить (хотя и вручную) из раздела без перезапуска узла. – archaelus

0

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

+0

Это вздор; вы не можете «жертвовать P». Единственными параметрами в сети с разделами являются CP или AP. Mnesia не является ни одним из них (в контексте фрагментированных таблиц - это может быть CP для нефрагментированных таблиц.) –

Смежные вопросы