5 RabbitMQ 管理

felix.shao2025-02-18

5 RabbitMQ 管理

TIP

 本小节主要介绍以下知识:

  • rabbitmqctl 工具
  • rabbitmq_management 插件

概述

 有些工具类的资料就不详细一一写了,必要的部分直接简写或引用第三方资料描述了。

多租户和权限

  • RabbitMQ的虚拟主机open in new window
     每一个 RabbitMQ 服务器都能创建虚拟的消息服务器,我们称之为虚拟主机(virtual host),简称为 vhost。每一个 vhost 本质上是一个独立的小型 RabbitMQ 服务器,拥有自己独立的队列、交换器及绑定关系等,并且它拥有自己独立的权限。vhost 就像是虚拟机与物理服务器一样,它们在各个实例间提供逻辑上的分离,为不同程序安全保密地运行数据,它既能将同一个 RabbitMQ 中的众多客户区分开,又可以避免队列和交换器等命名冲突。vhost 之间是绝对隔离的,无法将 vhost1 中的交换器与 vhost2 中的队列进行绑定,这样既保证了安全性,又可以确保可移植性。如果在使用 RabbitMQ 达到一定规模的时候,建议用户对业务概念、场景进行归类区分,并为之分配独立的 vhost。
     vhost 是 AMQP 概念的基础,客户端在连接的时候必须指定一个 vhost。RabbitMQ 默认创建的 vhost 为“/”,使用默认的用户名 guest 和密码 guest 就可以访问它。但是为了安全和方便,建议重新建立一个新的用户来访问它。
     以下是一些常见的权限命令:
  1. 创建新的虚拟机语法:
    rabbitmqctl add_vhost {vhost}
     示例:$ rabbitmqctl add_vhost vhost1

  2. 罗列当前 vhost 的相关信息:
    rabbitmqctl list_vhosts,目前 vhostinfoitem 的取值有 2 个。

  • name:vhost的名称。
  • tracing:是否使用了 RabbitMQ 的 trace 功能。可使用 rabbitmactl trace_on开启 trace 功能,trace 详细功能后续小节会介绍。

 示例:$ rabbitmqctl list_vhosts name tracing

  1. 删除 vhost 的命令:
    rabbitmqctl delete_vhost {vhost}。删除一个 vhost 同时也会删除其下所有的队列、交换器、绑定关系、用户权限、参数和策略等信息。
     示例:$ rabbitmqctl delete_vhost vhost1

  2. 权限授予命令:
    rabbitmqctl set_permissions [-p vhost] {user} {conf} {write} {read}。其中各个参数的含义如下:

  • vhost:授予用户访问权限的 vhost 名称,可以设置为默认值,即 vhost 为 “/”。
  • user:可以访问指定 vhost 的用户名。
  • conf:一个用户匹配用户在哪些资源上拥有可配置权限的正则表达式。
  • write:一个用户匹配用户在哪些资源上拥有可写权限的正则表达式。
  • read:一个用户匹配用户在哪些资源上拥有可读权限的正则表达式。

 可配置指的是队列和交换器的创建及删除之类的操作;可写指的是发布消息;可读指与消息有关的操作,包括读取消息及清空整个队列等。
 示例:授予 root 用户可访问虚拟主机 vhost2,在以“queue”开头的资源上具备可配置权限,并在所有资源上拥有可写、可读的权限:
$ rabbitmqctl set_permissions -p vhost2 root "^queue.*" ".*" ".*"

  1. 清除权限命令:
    rabbitmqctl clear_permissions [-p vhost] {username}。其中各个参数的含义如下:
  • vhost:禁止用户访问的虚拟主机的名称。
  • user:禁止访问特定虚拟主机的用户名称

 示例:$ rabbitmqctl clear_permissions -p vhost1 root

  1. 显示虚拟主机上的权限:
    $ rabbitmqctl list_permissions [-p vhost],用来显示虚拟主机上的权限。

  2. 显示用户的权限:
    $ rabbitmqctl list_user_permissions {username}

 AMQP 协议中并没有指定权限在 vhost 级别还是在服务器级别实现,由具体的应用自定义。在 RabbitMQ 中,权限控制则是以 vhost 为单位的。当创建一个用户时,用户通常会被指派给至少一个 vhost,并且只能访问被指派的 vhost 内的队列、交换器和绑定关系等。因此,RabbitMQ 中的授予权限是指在 vhost 级别对用户而言的权限授予。
 rabbitmqctl 工具的标准语法如下([]表示可选参数,{}表示必选参数):
$ rabbitmqctl [-n node] [-t timeout] [-q] {command} [command options...]

  • [-n node] 默认节点是“rabbitmq@hostname”,此处的 hostname 是主机名称。
  • [-q] 使用 -q 标识来启用 quiet 模式,这样可以屏蔽一些消息的输出。默认不开启 quiet模式。
  • [-t timeout] 操作超时时间(秒为单位),只适用于“list_xxx”类型的命令,默认是无穷大。

用户管理

 在 RabbitMQ 中,用户是访问控制(Access Control)的基本单元,且单个用户可以跨越多个 vhost 进行授权,针对一至多个 vhost,用户可以被赋予不同级别的权限,并使用标准的用户名和密码来认证用户。
 以下是一些常见的用户管理命令:

  1. 创建新的用户语法:
    $ rabbitmqctl add_user {username} {password}。其中参数为用户名和密码。
     示例:$ rabbitmqctl add_user root root123

  2. 更改用户密码:
    $ rabbitmqctl change_password root {username} {password}。  示例:$ rabbitmqctl change_password root root123

  3. 清除密码,这样用户就不能使用密码登录了:
    $ rabbitmqctl clear_password {username},其中 username 表示要清除密码的用户名称。

  4. 验证用户:
    $ rabbitmqctl authenticate_user {username} {password}

  5. 删除用户:
    $ rabbitmqctl delete_user {username}

  6. 罗列当前的所有用户:
    $ rabbitmqctl list_users

  7. 设置用户的角色:
    $ rabbitmqctl set_user_tags {username} {tag ...},其中 username 参数表示需要设置角色的用户名称; tag 参数用于设置 0 个、1 个或者多个的角色,设置之后任何之前现有的身份都会被删除。
     用户的角色分为 5 种类型:

  • none: 无任何角色。新创建的用户的角色默认为 none。
  • management:可以访问 Web 管理页面。 Web 管理页面在 5.3 节中会有详细介绍。
  • policymaker:包含 management 的所有权限,并且可以管理策略(Policy)和参数(Parameter)。详细内容见后续小节。
  • monitoring:包含 management 的所有权限,并且可以看到所有连接、信道及节点相关的信息。
  • administrator:包含 monitoring 的所有权限,并且可以管理用户、虚拟主机、权限、策略、参数等。它代表最高的权限。

Web 端管理

  1. 启用 RabbitMQ management 插件:
     RabbitMQ 提供了很多的插件,默认存放在 $RABBITMQ_HOME/plugins 目录下:
    rabbitmq-plugins [-n node] {command} {command options...}
     启动插件是使用 $ rabbitmq-plugins enable [plugin-name],  关闭插件的命令是 $ rabbitmq-plugins disable [plugin-name]。  示例,启动 rabbitmq_management 插件:$ rabbitmq-plugins enable rabbitmq_management

  2. 查看当前插件的使用情况:
    $rabbitmq_plugins list
     注意下[E*]显示启动,和[e*]隐式启动概念。  Web 端管理相关支持功能列表:

  • 新增、删除、查看用户
  • 添加虚拟主机
  • 创建和删除队列、交换器、绑定关系、参数和策略。
  • ...

应用与集群管理

 主要介绍应用和集群相关的一些操作管理命令,包括关闭、重置、开启服务,还有建立集群的一些信息。

应用管理

  1. rabbitmqctl stop [pid_file]
     用于停止运行 RabbitMQ 的 Erlang 虚拟机和 RabbitMQ 服务应用。

  2. rabbitmqctl shutdown
     用于停止运行 RabbitMQ 的 Erlang 虚拟机和 RabbitMQ 服务应用。执行这个命令会阻塞直到 Erlang 虚拟机进程退出。

  3. rabbitmqctl stop_app
     停止 RabbitMQ 服务应用,但是 Erlang 虚拟机还是处于运行状态。

  4. rabbitmqctl start_app
     启动 RabbitMQ 服务应用,此命令典型的用户是在执行了其他管理操作之后,重新启动之前停止的 RabbitMQ 应用,比如 rabbitmqctl reset。

  5. rabbitmqctl wait [pid_file]
     等待 RabbitMQ 应用的启动。

  6. rabbitmqctl reset
     将 RabbitMQ 节点重置还原到最初状态。包括从原来所在的集群中删除此节点,从管理数据库中删除所有的配置数据,如已配置的用户、vhost,以及删除所有的持久化消息。

  7. rabbitmqctl force_reset
     强制将 RabbitMQ 节点重置还原到最初状态。

  8. rabbitmqctl rotate_logs {suffix}
     指示 RabbitMQ 节点轮换日志文件。

  9. rabbitmqctl hipe_compile {directory}
     将部分 RabbitMQ 代码用 HiPE(HiPE 是指 High Performance Erlang,是 Erlang 版的 JIT) 编译,并且将编译后的 .beam 文件保存到指定的文件目录中。

集群管理

  1. rabbitmqctl join_cluster {cluster_node} [--ram]
     将节点加入指定集群中。在这个命令执行前需要停止 RabbitMQ 应用并重置节点。

  2. rabbitmqctl cluster_status
     显示集群的状态。

  3. rabbitmqctl change_cluster_node_type {disc|ram}
     修改集群节点的类型。

  4. rabbitmqctl forget_cluster_node [--offline]
     修改集群节点的类型。在这个命令执行前需要停止 RabbitMQ 应用。

  5. rabbitmqctl update_cluster_node {clusternode}
     在集群中的节点应用启动前咨询 clusternode 节点的最新信息,并更新相应的集群信息。这个和 join_cluster 不同,它不加入集群。

  6. rabbitmqctl force_boot
     确保节点可以启动,即使它不是最后一个关闭的节点。

  7. rabbitmqctl sync_queue [-p vhost] {queue}
     指示未同步队列 queue 的 slave 镜像可以同步 master 镜像行的内容。同步期间此队列会被阻塞(所有此队列的生产消费者都会被阻塞),直到同步完成。

  8. rabbitmqctl cancel_sync_queue [-p vhost] {queue}
     取消队列 queue 同步镜像的操作。

  9. rabbitmqctl set_cluster_name {name}
     设置集群名称。

服务端状态

 服务器状态的查询会返回一个以制表符分隔的列表,list_queues、list_exchanges、list_bindings 和 list_consumers 这种命令接收一个可选的 vhost 参数以显示其结果,默认值为“/”。

  1. 返回队列的详细信息
    $ rabbitmqctl list_queues [-p vhost] [queueinfoitem],queueinfoitem 参数比较多,不一一列举描述。

  2. 返回交换器的详细信息
    $ rabbitmqctl list_exchanges [-p vhost] [exchangeinfoitem],exchangeinfoitem 参数的内容和客户端中的 channel.exchangeDeclare 方法的参数基本一致,不一一列举描述。

  3. 返回绑定关系的详细信息
    $ rabbitmqctl list_bindings [-p vhost] [bindinginfoitem]

  4. 返回 TCP/IP 连接的统计信息
    $ rabbitmqctl list_connections [connectioninfoitem],connectioninfoitem 参数比较多,不一一列举描述。

  5. 返回当前所有信道的信息
    $ rabbitmqctl list_channels [channelinfoitem],channelinfoitem 参数比较多,不一一列举描述。

  6. 列举消费者的详细信息
    $ rabbitmqctl list_consumers [-p vhost]

  7. 显示 Broker 状态
    $ rabbitmqctl status

  8. 对 RabbitMQ 节点进行健康检查
     确认应用是否正常运行、list_queues 和 list_channels 是否能够正常返回等。
    $ rabbitmqctl node_health_check

  9. 显示每个运行程序环境中每个变量的名称和值
    $ rabbitmqctl environment

  10. 为所有服务器状态生成一个服务器状态报告,并将输出重定向到一个文件
    $ rabbitmqctl report。  示例:$ rabbitmqctl report > report.txt

  11. 执行任意Rrlang表达式
    $ rabbitmqctl eval {expr}

  12. eval的扩展  略。相当于写 eval 表达式 调用 Erlang 中对应模块的相应函数。

TIP

 小窍门:
若要删除所有的交换器、队列和绑定关系,删除对应的 vhost 就可以“一键搞定”,而不需要一个个遍历删除。

HTTP API 接口管理

 RabbitMQ Management 插件不仅提供了 Web 管理页面,还提供了 HTTP API 接口来方便调用,比如创建一个队列,就可以通过 PUT 方法调用 /api/queues/vhost/name 接口来实现。  可以参考 客户端调用方式来理解有哪些 HTTP API接口。  可以安装 rabbitmqadmin 调用包装后的 HTTP API 接口,会简单很多,如 ./rabbitmqadmin list queues

参考文献

  • [RabbitMQ实战指南]
Last Updated 2/18/2025, 5:05:12 PM