让我在制定问题之前解释我目前的情况:
当前情景
我有一个带有2个使用root创建的节点的rabbitmq集群,我还安装了Web管理插件,效果很好。
几天前,其中一个节点出现故障,因为某些队列的消费者失败并且累积了数百万条消息,因此兔子崩溃,并将所有内容写入磁盘(/ var / lib / rabbitmq / mnesia / name_of_the_node / queues /) ,文件系统填满,整个节点都崩溃了。
问题/问题
rabbitmq-server -detached
,群集继续工作,但是
管理插件不再响应,所以,有没有办法
让它再次工作而不重新启动?我不确定如何重新启动以最小化 问题,我还想保证重启后网络管理员插件能够正常工作。
选项1:
使用root停止所有节点 - >使用rabbitmq启动所有节点
选项2:
使用root停止node1 - >用rabbitmq发起node1
使用root停止node2 - >使用rabbitmq
我也愿意听取您对我的任何其他建议或建议。
答案 0 :(得分:1)
如果没有更多信息,很难回答您的问题。您至少应该查看日志文件和/或将它们发布到某处。
停止以root身份运行的节点后,将整个/var/lib/rabbitmq
所有权更改为rabbitmq:rabbitmq
。对/var/log/rabbitmq
执行相同操作。这是RabbitMQ使用官方软件包和默认配置写入数据的唯一地方。
因为它以前是以root身份运行的,所以Erlang在/root/.erlang.cookie
中存储了它的cookie,这是用于允许节点间通信的共享密钥“key”。您需要将其复制到/var/lib/rabbitmq/.erlang.cookie
并修复所有权和权限:它必须仅由所有者读取,因此0400
或0600
的权限;如果小组或任何人都可以阅读,Erlang会抱怨。
您可以而且应该一次只执行一个节点(除非您在此期间更新了Erlang或RabbitMQ)。注意我上面提到的Erlang cookie。如果启动的cookie与其他正在运行的节点不同,则无法进行通信。
要在重新启动RabbitMQ之前确保cookie正确,您可以尝试ping其他正在运行的RabbitMQ节点:
# Open a shell as the `rabbitmq` user and run:
erl -A0 -noinput -noshell -sname foobar \
-eval "io:format(\"~p~n\", [net_adm:ping('rabbit@other-hostname')]), halt()."
在上面的命令行中,将other-hostname
替换为另一个RabbitMQ节点的主机名。如果一切正常,此命令应打印pong
。如果显示pang
,则表示出现问题。