Кластеризация ejabberd, Slave не работает, когда master выходит из строя

Я настроил кластеризацию ejabberd, один главный, а другой подчиненный, как описано здесь.

Я скопировал файлы .erlang.cookie и базы данных с главного сервера на подчиненный. Все работает нормально.
Проблема в том, что я останавливаю главный узел:

  1. Тогда запрос не направляется на ведомое устройство.
  2. При попытке перезапустить подчиненный узел он не запускается после его отключения.

Я застрял здесь, пожалуйста, помогите мне. Спасибо


person Dharmraj    schedule 11.01.2016    source источник


Ответы (2)


Это стандартное поведение Mnesia. Если узел, который вы запускаете, не был последним, который был остановлен в кластере, то у него нет никакого способа узнать, есть ли у него самые последние и актуальные данные.

Процесс запуска кластера Mnesia заключается в запуске узла в обратном порядке, в котором они были закрыты.

В случае, если узел, который в последний раз был замечен в кластере Mnesia, не может запуститься или присоединиться к кластеру, вам нужно использовать команду Mnesia, чтобы сделать кластер «мастером», то есть сказать ему, что вы считаете, что этот узел имеет самое последнее содержимое. . Это делается с помощью команды Erlang mnesia:set_master_nodes/1.

Например, из командной строки ejabberd Erlang:

mnesia:set_master_nodes([node1@myhost]).

В большинстве случаев кластеризация Mnesia обрабатывает все автоматически. Когда узел выходит из строя, другие узлы знают об этом и автоматически продолжают работать прозрачно. Единственный случай, когда вам нужно указать, какой узел использовать в качестве эталонных данных (с помощью set_master_nodes/1), — это когда это неоднозначно для Mnesia, то есть либо при запуске только узлов, которые были отключены, когда все еще работали узлы, либо при наличии сетевого разделения.

person Mickaël Rémond    schedule 11.01.2016
comment
Спасибо, Майкл, но что произошло, когда главный и подчиненный серверы работают одновременно, а ведущий выходит из строя? В этом случае слейв должен работать правильно? - person Dharmraj; 11.01.2016
comment
Да, это цель кластеризации. Mnesia является мультимастером. Настоящего мастера нет, но он должен защищать согласованность данных и следить за тем, чтобы он не уничтожил данные. Когда один узел выходит из строя, для оставшегося узла не возникает проблем с согласованностью. - person Mickaël Rémond; 11.01.2016
comment
Спасибо, Микаэль, понял. Когда один узел выходит из строя, оставшийся узел необходимо установить в качестве главного, поскольку для оставшегося узла нет проблем с согласованностью. Он будет работать независимо. - person Dharmraj; 12.01.2016
comment
Нет, оставшийся узел не нужно вручную устанавливать в качестве главного. Это автоматически обрабатывается Erlang/Mnesia. Единственный случай, когда вам нужно установить мастер вручную, — это когда есть неясность относительно того, какой узел использовать в качестве эталонных данных. - person Mickaël Rémond; 12.01.2016
comment
У вас есть балансировщик нагрузки впереди? Конечно, вам нужно правильно направить трафик. И еще раз: в ejabberd нет понятия «хозяин/раб». Mnesia и этот ejabberd являются мультимастерами. - person Mickaël Rémond; 13.01.2016
comment
Да, впереди у нас есть балансировщик нагрузки. проверка вещей с командой. Спасибо - person Dharmraj; 13.01.2016
comment
Если у вас нет трафика, поступающего на второй узел, это должна быть проблема с балансировщиком нагрузки. - person Mickaël Rémond; 13.01.2016

Следуйте шагу по ссылке ниже: http://chadillac.tumblr.com/post/35967173942/easy-ejabberd-clustering-guide-mnesia-mysql и вызовите метод join_as_master(NodeName) модуля easy_cluster.

person sanket Thakare    schedule 13.01.2016
comment
Будь осторожен. Вы должны быть уверены в том, что вы делаете при форсировании набора основных данных, иначе это может привести к потере данных. - person Mickaël Rémond; 29.01.2016
comment
Хорошо, я использовал эту команду. Мнения: set_master_nodes([node1@myhost]). большое спасибо - person sanket Thakare; 30.01.2016