用不同的用户重启 Rabbitmq 集群

Restart Rabbitmq cluster with different user

在提出问题之前,让我解释一下我目前的情况:

当前情况

我有一个 rabbitmq 集群,其中有 2 个节点是用 root 创建的,我还安装了运行良好的 Web 管理插件。

前几天有一个节点挂掉了,因为一些队列的消费者失败了,累积了数百万条消息,所以rabbit崩溃了,把所有东西都写到磁盘(/var/lib/rabbitmq/mnesia/name_of_the_node/queues/),文件系统被填满了,整个节点宕机。

Problem/Questions

  1. 删除磁盘中的所有消息后(我不再需要它们并且 必须释放磁盘 space),并重新启动节点 rabbitmq-server -detached,集群一直在工作,但是 管理插件不再响应,那么,有没有办法 无需重新启动即可使其再次运行?
  2. 我打算停止整个集群,然后使用 rabbitmq 用户而不是 root(只是出于安全原因),我 想知道我应该记住哪些事情才能 避免问题。我主要担心的是集群是否会 keep/remember 所有当前配置(用户、策略、 exchanges, queues and bindings) 在使用 rabbitmq 启动之后 用户。
  3. 我不太确定如何重新启动以最小化 问题,我也想保证web管理插件在重启后能正常工作。

    选项 1:
    用 root 停止所有节点 --> 用 rabbitmq

    启动所有节点

    选项 2:
    用 root 停止 node1 --> 用 rabbitmq
    启动 node1 用 root 停止 node2 --> 用 rabbitmq

  4. 启动 node2

我也乐于听取您对我的任何其他意见或建议。

  1. 没有更多信息很难回答您的问题。您至少应该看看日志文件 and/or post 它们在某处。

  2. 以 root 身份停止节点 运行 后,将整个 /var/lib/rabbitmq 所有权更改为 rabbitmq:rabbitmq。对 /var/log/rabbitmq 做同样的事情。这是RabbitMQ唯一使用官方包和默认配置写入数据的地方。

    因为它之前 运行 作为 root,Erlang 在 /root/.erlang.cookie 中存储了它的 cookie,用于允许节点间通信的共享秘密 "key"。您需要将其复制到 /var/lib/rabbitmq/.erlang.cookie 并修复所有权和权限:它必须只能由所有者读取,因此需要 04000600 的权限;如果组或任何人都可以阅读,Erlang 会抱怨。

  3. 您可以而且应该一次在一个节点上执行此操作(除非您同时更新了 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,说明有问题。