用不同的用户重启 Rabbitmq 集群
Restart Rabbitmq cluster with different user
在提出问题之前,让我解释一下我目前的情况:
当前情况
我有一个 rabbitmq 集群,其中有 2 个节点是用 root 创建的,我还安装了运行良好的 Web 管理插件。
前几天有一个节点挂掉了,因为一些队列的消费者失败了,累积了数百万条消息,所以rabbit崩溃了,把所有东西都写到磁盘(/var/lib/rabbitmq/mnesia/name_of_the_node/queues/),文件系统被填满了,整个节点宕机。
Problem/Questions
- 删除磁盘中的所有消息后(我不再需要它们并且
必须释放磁盘 space),并重新启动节点
rabbitmq-server -detached
,集群一直在工作,但是
管理插件不再响应,那么,有没有办法
无需重新启动即可使其再次运行?
- 我打算停止整个集群,然后使用
rabbitmq 用户而不是 root(只是出于安全原因),我
想知道我应该记住哪些事情才能
避免问题。我主要担心的是集群是否会
keep/remember 所有当前配置(用户、策略、
exchanges, queues and bindings) 在使用 rabbitmq 启动之后
用户。
我不太确定如何重新启动以最小化
问题,我也想保证web管理插件在重启后能正常工作。
选项 1:
用 root 停止所有节点 --> 用 rabbitmq
启动所有节点
选项 2:
用 root 停止 node1 --> 用 rabbitmq
启动 node1
用 root 停止 node2 --> 用 rabbitmq
启动 node2
我也乐于听取您对我的任何其他意见或建议。
没有更多信息很难回答您的问题。您至少应该看看日志文件 and/or post 它们在某处。
以 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
,说明有问题。
在提出问题之前,让我解释一下我目前的情况:
当前情况
我有一个 rabbitmq 集群,其中有 2 个节点是用 root 创建的,我还安装了运行良好的 Web 管理插件。
前几天有一个节点挂掉了,因为一些队列的消费者失败了,累积了数百万条消息,所以rabbit崩溃了,把所有东西都写到磁盘(/var/lib/rabbitmq/mnesia/name_of_the_node/queues/),文件系统被填满了,整个节点宕机。
Problem/Questions
- 删除磁盘中的所有消息后(我不再需要它们并且
必须释放磁盘 space),并重新启动节点
rabbitmq-server -detached
,集群一直在工作,但是 管理插件不再响应,那么,有没有办法 无需重新启动即可使其再次运行? - 我打算停止整个集群,然后使用 rabbitmq 用户而不是 root(只是出于安全原因),我 想知道我应该记住哪些事情才能 避免问题。我主要担心的是集群是否会 keep/remember 所有当前配置(用户、策略、 exchanges, queues and bindings) 在使用 rabbitmq 启动之后 用户。
我不太确定如何重新启动以最小化 问题,我也想保证web管理插件在重启后能正常工作。
选项 1:
启动所有节点
用 root 停止所有节点 --> 用 rabbitmq选项 2:
用 root 停止 node1 --> 用 rabbitmq
启动 node1 用 root 停止 node2 --> 用 rabbitmq 启动 node2
我也乐于听取您对我的任何其他意见或建议。
没有更多信息很难回答您的问题。您至少应该看看日志文件 and/or post 它们在某处。
以 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
,说明有问题。