Назад | Перейти на главную страницу

Сломанный кластер RabbitMQ не перезапускается

Я запускаю RabbitMQ на 3 серверах, одна и та же версия Erlang и RabbitMQ: RabbitMQ 3.4.1, Erlang 17.3

На сервере 2 произошел сбой одного узла. Два других узла не подключились друг к другу:

сервер 1:

[CentOS-62-64-minimal ~]$ sudo rabbitmqctl cluster_status
Cluster status of node 'rabbit@CentOS-62-64-minimal' ...
[{nodes,[{disc,['rabbit@CentOS-62-64-minimal',rabbit@de3,rabbit@mysql]}]},
 {running_nodes,['rabbit@CentOS-62-64-minimal']},
 {cluster_name,<<"rabbit@CentOS-62-64-minimal">>},
 {partitions,[]}]

сервер 3:

[de3 ~]$ sudo rabbitmqctl cluster_status
Cluster status of node rabbit@de3 ...
[{nodes,[{disc,['rabbit@CentOS-62-64-minimal',rabbit@de3,rabbit@mysql]}]},
 {running_nodes,[rabbit@de3]},
 {cluster_name,<<"rabbit@CentOS-62-64-minimal">>},
 {partitions,[]}]

После перезапуска и сброса rabbitmq на сервере 3 он наконец подключился к server1:

[CentOS-62-64-minimal ~]$ sudo rabbitmqctl cluster_status
Cluster status of node 'rabbit@CentOS-62-64-minimal' ...
[{nodes,[{disc,['rabbit@CentOS-62-64-minimal',rabbit@de3,rabbit@mysql]}]},
 {running_nodes,['rabbit@CentOS-62-64-minimal']},
 {cluster_name,<<"rabbit@CentOS-62-64-minimal">>},
 {partitions,[]}]

Почему кластер "сломался", когда вышел из строя всего 1 узел? сервер 3 работал нормально, а сервер 1 - нет: «Очередь находится на неработающем сервере».

Что касается сервера 2, он не перезагружался. После ручного перезапуска я не могу заставить его повторно подключиться к кластеру даже после многократного сброса и удаления / var / lib / rabbitmq / mnesia /:

[root@mysql ~]# rabbitmqctl cluster_status
Cluster status of node rabbit@mysql ...
[{nodes,[{disc,[rabbit@mysql]}]},
 {running_nodes,[rabbit@mysql]},
 {cluster_name,<<"rabbit@mysql.domain.com">>},
 {partitions,[]}]

[mysql ~]# rabbitmqctl stop_app
Stopping node rabbit@mysql ...
[root@mysql ~]# rabbitmqctl force_reset
Forcefully resetting node rabbit@mysql ...
[ysql ~]# rabbitmqctl join_cluster rabbit@CentOS-62-64-minimal
Clustering node rabbit@mysql with 'rabbit@CentOS-62-64-minimal' ...
Error: {ok,already_member}
[mysql ~]# rabbitmqctl start_app
Starting node rabbit@mysql ...
[mysql ~]# rabbitmqctl cluster_status
Cluster status of node rabbit@mysql ...
[{nodes,[{disc,[rabbit@mysql]}]},
 {running_nodes,[rabbit@mysql]},
 {cluster_name,<<"rabbit@mysql.domain.com">>},
 {partitions,[]}]

Понятия не имею, что пошло не так. В последний раз, когда это произошло, я обновил RabbitMQ qnd Erlang до последней версии.

На основе Документация по кластеру RabbitMQ ваш rabbitmqctl cluster_status вывод выглядит неправильно; running_nodes должен содержать не только локальный узел, на котором вы выполняете команду. Это наводит на мысль, что они не могут нормально разговаривать друг с другом, есть ли между узлами брандмауэры?

У меня возникла эта проблема сегодня при разработке документа о намеренном прерывании для события breakfix, чтобы научить нашу операционную группу, как что-то исправить. Я намеренно исключил узел из кластера и не смог запустить rabbitmqctl join_cluster успешно, потому что кластер полагал, что узел уже является членом.

Узел кластеризации 'rabbit @ node-1' с 'rabbit @ node-0' ... ... done (already_member).

В конечном итоге для меня сработало rabbitmqctl forget_cluster_node rabbit@node-1 от рабочего кластерного узла. Как только я это сделал, я смог успешно запустить rabbtmqctl join_cluster rabbit@node-0

Боджит прав, я могу сказать вам, имея работающий кластер кроликов, что ваша конфигурация неверна. Похоже, что каждый узел - это собственный кластер, и только он сам является текущим работающим узлом.

Вернитесь к документации RabbitMQ по настройке кластера.

На каждом узле вы должны увидеть нечто похожее на следующее:

    root@rabbit0:~# rabbitmqctl cluster_status
    Cluster status of node 'rabbit@rabbit0' ...
    [{nodes,[{disc,['rabbit@rabbit0','rabbit@rabbit1']}]},
     {running_nodes,['rabbit@rabbit1','rabbit@rabbit0']},
     {cluster_name,<<"rabbit@rabbit0.domain.com">>},
     {partitions,[]}]
    ...done.

    root@rabbit1:~# rabbitmqctl cluster_status
    Cluster status of node 'rabbit@rabbit1' ...
    [{nodes,[{disc,['rabbit@rabbit0','rabbit@rabbit1']}]},
     {running_nodes,['rabbit@rabbit0','rabbit@rabbit1']},
     {cluster_name,<<"rabbit@rabbit0.domain.com">>},
     {partitions,[]}]
    ...done.

Это дезинфицировано, но приказы и намерения сохранены.

Вам также необходимо настроить высокую доступность, если вы хотите, чтобы ваши очереди работали при отказе:

https://www.rabbitmq.com/ha.html