Онлайн-восстановление mnesia из сетевого раздела [закрыто]
возможно ли восстановление из сетевого раздела в кластере mnesia без перезапуска любого из задействованных узлов? Если да, то как это сделать?
Мне интересно конкретно знать:
- как это можно сделать со стандартной мнезией OTP (v4.4.7)
- какой пользовательский код, если кто-то должен написать, чтобы это произошло (например, подписаться на события mnesia running_paritioned_network, определить новый мастер, объединить записи из не-master для master, force load table от нового master, clear running partitioned network event -- пример кода был бы весьма признателен).
- или, что mnesia категорически не поддерживает онлайн-восстановление и требует перезапуска узлов, которые являются частью раздела не-master.
хотя я ценю указатели на общую теорию распределенных систем, в этом вопросе меня интересует только Erlang/OTP mnesia.
3 ответов
после некоторых экспериментов я обнаружил следующее:
- Mnesia считала сеть секционированной, если между двумя узлами происходит разъединение узла и повторное подключение без перезапуска mnesia.
- это верно, даже если никакие операции чтения/записи Mnesia не происходят во время отключения.
- Mnesia сама должна быть перезапущена, чтобы очистить секционированное сетевое событие-вы не можете
force_load_table
после того как сеть разделенный. - только Mnesia необходимо перезапустить, чтобы очистить событие секционирования сети. Вам не нужно перезапускать весь узел.
- Mnesia разрешает разделение сети путем перезапуска узла Mnesia, перезаписывающего данные таблицы с помощью данных другого узла Mnesia (алгоритм загрузки таблицы запуска).
- обычно узлы будут копировать таблицы из узла, который был самым длинным (это поведение я видел, я не проверил, что это явно закодировано Для, а не побочный эффект чего-то другого). Если вы отключите узел от кластера, сделаете записи в обоих разделах (отключенный узел и его старые сверстники), выключите все узлы и запустите их все снова, сначала запустив отключенный узел, отключенный узел будет считаться ведущим, а его данные будут перезаписывать все другие узлы. Поведение сравнения таблиц / контрольной суммы / кворума отсутствует.
так ответь на мой вопрос, можно выполните восстановление semi online, выполнив mnesia:stop(), mnesia:start()
на узлах раздела, данные которого вы решили отбросить (который я буду называть потерянным разделом). Выполнение mnesia:start()
вызов приведет к тому, что узел свяжется с узлами на другой стороне раздела. Если у вас есть более одного узла в проигрышном разделе, вы можете установить главные узлы для загрузки таблицы в узлы в выигрышном разделе - в противном случае, я думаю, что есть шанс, что он загрузит таблицы из другого узла в проигрышном разделе разделите и, таким образом, вернитесь в состояние секционированной сети.
к сожалению, mnesia не поддерживает слияние / согласование содержимого таблицы во время фазы загрузки таблицы запуска, а также не обеспечивает возврат к фазе загрузки таблицы после запуска.
фаза слияния будет подходящей для ejabberd, в частности, поскольку узел все еще будет иметь пользовательские соединения и, следовательно, знать, какие пользовательские записи ему принадлежат/должны быть самыми современными для (предполагая, что одно пользовательское соединение в кластере.) Если существует фаза слияния, узел может фильтровать таблицы userdata, сохранять все записи для подключенных пользователей, загружать таблицы как обычно, а затем записывать сохраненные записи обратно в кластер mnesia.
Как это работает. Представьте себе небо, полное птиц. Фотографируй, пока не соберешь всех птиц. Положите фотографии на стол. Изображения карт друг над другом. Итак, вы видите каждую птицу один раз. Ты видишь каждую птицу? Ладно. Тогда вы знаете, в то время. Система была стабильной. Запишите, как звучат все птицы(сообщения) и сделайте еще несколько снимков. Затем повторять.
Если у вас есть узел раздельный. Вернитесь к последнему общему стабильному снимку. И попробуйте * * воспроизвести то, что добавляется после что. :)
Это лучше описано в "Распределенные моментальные снимки: определение глобальных состояний распределенных систем" К. Мани Чанди и Лесли ЛЭМПОРТ
** Я думаю, что есть проблема, решая, кто часы, чтобы пойти после при попытке воспроизвести то, что произошло