После нескольких экспериментов я обнаружил следующее:
- Mnesia считается сеть быть разделена, если между двумя узлами существует разрыв узла и повторное подключение без перезапуска Mnesia.
- Это верно, даже если в момент разъединения не было никаких операций чтения/записи Mnesia.
- Mnesia сам должен быть перезапущен, чтобы очистить событие многораздельной сети - вы не можете
force_load_table
после разделения сети.
- Только Mnesia необходимо перезапустить, чтобы очистить сетевое разделенное событие. Вам не нужно перезапускать весь узел.
- Mnesia разрешает сетевое разбиение, запустив вновь перезапущенный узел Mnesia, перезаписывает свои данные таблицы данными из другого узла Mnesia (алгоритм загрузки таблицы запуска).
- Обычно узлы будут копировать таблицы из узла, который был самым длинным (это было поведение, которое я видел, я не проверял, что это явно закодировано, а не побочный эффект чего-то другого). Если вы отсоедините узел от кластера, сделайте запись в обоих разделах (отключенный узел и его старые сверстники), выключите все узлы и запустите их снова, снова запустив сначала отсоединенный узел, отсоединенный узел будет считаться мастером и его данные будут перезаписывать все остальные узлы. Не существует поведения сравнения таблиц/контрольных сумм/кворума.
Так, чтобы ответить на мой вопрос, можно выполнить полу онлайн восстановления путем выполнения mnesia:stop(), mnesia:start()
на узлах в разделе, данные которого вы решили отказаться (я буду называть раздел убыточной). Выполнение вызова mnesia:start()
приведет к тому, что узел свяжется с узлами на другой стороне раздела. Если в проигрывающем разделе имеется несколько узлов, вы можете захотеть установить главные узлы для загрузки таблицы в узлы в выигрышном разделе - в противном случае я думаю, что есть вероятность, что он загрузит таблицы из другого узла в проигрывающем разделе и, следовательно, вернуться в состояние секционированной сети.
К сожалению, mnesia не обеспечивает поддержку слияния/согласования содержимого таблицы во время фазы загрузки загрузочной таблицы и не предусматривает возврата к фазе загрузки таблицы после запуска.
Фаза слияния была бы подходящей для ejabberd, поскольку узел все равно имел бы пользовательские соединения и, следовательно, знал бы, какие записи пользователя он сам должен/должен быть самым современным (при условии, что один пользователь подключается к кластеру). Если существует фаза слияния, узел может фильтровать таблицы пользовательских данных, сохранять все записи для подключенных пользователей, загружать таблицы в соответствии с обычным, а затем записывать сохраненные записи обратно в кластер mnesia.
@ Gortok: http://www.infoq.com/news/2007/08/mnesia – Flinkman