Не работает создание ВМ: ошибка 500 (timed out)

rabbitmq

Описание проблемы

При попытке создания инстанса из ПУ horizon или командой API - процесс надолго затягивается, и через некоторое время возникает ошибка создания:

Failed to create instance, Nova api error timed out
error: Timed out waiting for a reply to message ID

Решение

Эта ошибка возникает вследствие рассинхронизации RabbitMQ кластера. В типовом варианте решения OVT ev3 кластер сервера очередей состоит из трех служебных ВМ: RBMQ-0001, RBMQ-0002, RBMQ-0003.

Запрос на выполнение поступает в очередь на одном узле, а при обращении к другому члену кластера - его не видно. По этой причине очередь запросов начинает нарастать, а выполнение запросов не выполняется.

Размер очереди можно посмотреть следующей командой:

rabbitmqctl list_queues | wc -l

Система настроена таким образом, что только узел RBMQ-0001 хранит все настройки кластера на диске, а RBMQ-0002 и RBMQ-0003 являются ведомыми и содержат настройки в оперативной памяти (RAM).

Это хорошо видно, если дать команду rabbitmqctl cluster_status

root@RBMQ-0002:/# rabbitmqctl cluster_status
Cluster status of node 'rabbit@RBMQ-0002' ...
[{nodes,[{disc,['rabbit@RBMQ-0001']},
{ram,['rabbit@RBMQ-0003','rabbit@RBMQ-0002']}]},
{running_nodes,['rabbit@RBMQ-0003','rabbit@RBMQ-0001','rabbit@RBMQ-0002']},
{cluster_name,<<"hci">>},
{partitions,[]},
{alarms,[{'rabbit@RBMQ-0003',[]},
         {'rabbit@RBMQ-0001',[]},
         {'rabbit@RBMQ-0002',[]}]}]

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

а затем запустить их, обязательно начиная с первого узла (RBMQ-0001).

После этих действий создание инстансов будет происходить в штатном режиме.

Скрипты восстановления

Стартовые скрипты восстановления кластера RabbitMQ

root@RBMQ-0001:~# cat restart_node1
systemctl stop rabbitmq-server
rm -rf /var/lib/rabbitmq/mnesia/*
rm -rf /var/lib/rabbitmq/erl_crash.dump
systemctl start rabbitmq-server
rabbitmqctl cluster_status
rabbitmqctl add_user openstack Aepie2i
# rabbitmqctl add_user openstack een3ZiK7
#rabbitmqctl change_password openstack new_password
rabbitmqctl set_permissions openstack ".*" ".*" ".*"
root@RBMQ-0002:~# cat restart_node2
systemctl stop rabbitmq-server
rm -rf /var/lib/rabbitmq/erl_crash.dump
rm -rf /var/lib/rabbitmq/mnesia/*
systemctl start rabbitmq-server
rabbitmqctl stop_app
rabbitmqctl join_cluster rabbit@RBMQ-0001
rabbitmqctl start_app
rabbitmqctl cluster_status
rabbitmqctl set_cluster_name openstack
./restart_node2
./restart_node1