5 RabbitMQ 管理
5 RabbitMQ 管理
TIP
本小节主要介绍以下知识:
- rabbitmqctl 工具
- rabbitmq_management 插件
概述
有些工具类的资料就不详细一一写了,必要的部分直接简写或引用第三方资料描述了。
多租户和权限
- RabbitMQ的虚拟主机
每一个 RabbitMQ 服务器都能创建虚拟的消息服务器,我们称之为虚拟主机(virtual host),简称为 vhost。每一个 vhost 本质上是一个独立的小型 RabbitMQ 服务器,拥有自己独立的队列、交换器及绑定关系等,并且它拥有自己独立的权限。vhost 就像是虚拟机与物理服务器一样,它们在各个实例间提供逻辑上的分离,为不同程序安全保密地运行数据,它既能将同一个 RabbitMQ 中的众多客户区分开,又可以避免队列和交换器等命名冲突。vhost 之间是绝对隔离的,无法将 vhost1 中的交换器与 vhost2 中的队列进行绑定,这样既保证了安全性,又可以确保可移植性。如果在使用 RabbitMQ 达到一定规模的时候,建议用户对业务概念、场景进行归类区分,并为之分配独立的 vhost。
vhost 是 AMQP 概念的基础,客户端在连接的时候必须指定一个 vhost。RabbitMQ 默认创建的 vhost 为“/”,使用默认的用户名 guest 和密码 guest 就可以访问它。但是为了安全和方便,建议重新建立一个新的用户来访问它。
以下是一些常见的权限命令:
创建新的虚拟机语法:
rabbitmqctl add_vhost {vhost}
示例:$ rabbitmqctl add_vhost vhost1
罗列当前 vhost 的相关信息:
rabbitmqctl list_vhosts
,目前 vhostinfoitem 的取值有 2 个。
- name:vhost的名称。
- tracing:是否使用了 RabbitMQ 的 trace 功能。可使用 rabbitmactl trace_on开启 trace 功能,trace 详细功能后续小节会介绍。
示例:$ rabbitmqctl list_vhosts name tracing
删除 vhost 的命令:
rabbitmqctl delete_vhost {vhost}
。删除一个 vhost 同时也会删除其下所有的队列、交换器、绑定关系、用户权限、参数和策略等信息。
示例:$ rabbitmqctl delete_vhost vhost1
权限授予命令:
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.*" ".*" ".*"
- 清除权限命令:
rabbitmqctl clear_permissions [-p vhost] {username}
。其中各个参数的含义如下:
- vhost:禁止用户访问的虚拟主机的名称。
- user:禁止访问特定虚拟主机的用户名称
示例:$ rabbitmqctl clear_permissions -p vhost1 root
显示虚拟主机上的权限:
$ rabbitmqctl list_permissions [-p vhost]
,用来显示虚拟主机上的权限。显示用户的权限:
$ 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,用户可以被赋予不同级别的权限,并使用标准的用户名和密码来认证用户。
以下是一些常见的用户管理命令:
创建新的用户语法:
$ rabbitmqctl add_user {username} {password}
。其中参数为用户名和密码。
示例:$ rabbitmqctl add_user root root123
更改用户密码:
$ rabbitmqctl change_password root {username} {password}
。 示例:$ rabbitmqctl change_password root root123
清除密码,这样用户就不能使用密码登录了:
$ rabbitmqctl clear_password {username}
,其中 username 表示要清除密码的用户名称。验证用户:
$ rabbitmqctl authenticate_user {username} {password}
。删除用户:
$ rabbitmqctl delete_user {username}
罗列当前的所有用户:
$ rabbitmqctl list_users
设置用户的角色:
$ 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 端管理
- RabbitMQ管理(3)——Web端管理 以下是一些要点命令:
启用 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
查看当前插件的使用情况:
$rabbitmq_plugins list
。
注意下[E*]显示启动,和[e*]隐式启动概念。 Web 端管理相关支持功能列表:
- 新增、删除、查看用户
- 添加虚拟主机
- 创建和删除队列、交换器、绑定关系、参数和策略。
- ...
应用与集群管理
主要介绍应用和集群相关的一些操作管理命令,包括关闭、重置、开启服务,还有建立集群的一些信息。
应用管理
rabbitmqctl stop [pid_file]
用于停止运行 RabbitMQ 的 Erlang 虚拟机和 RabbitMQ 服务应用。rabbitmqctl shutdown
用于停止运行 RabbitMQ 的 Erlang 虚拟机和 RabbitMQ 服务应用。执行这个命令会阻塞直到 Erlang 虚拟机进程退出。rabbitmqctl stop_app
停止 RabbitMQ 服务应用,但是 Erlang 虚拟机还是处于运行状态。rabbitmqctl start_app
启动 RabbitMQ 服务应用,此命令典型的用户是在执行了其他管理操作之后,重新启动之前停止的 RabbitMQ 应用,比如 rabbitmqctl reset。rabbitmqctl wait [pid_file]
等待 RabbitMQ 应用的启动。rabbitmqctl reset
将 RabbitMQ 节点重置还原到最初状态。包括从原来所在的集群中删除此节点,从管理数据库中删除所有的配置数据,如已配置的用户、vhost,以及删除所有的持久化消息。rabbitmqctl force_reset
强制将 RabbitMQ 节点重置还原到最初状态。rabbitmqctl rotate_logs {suffix}
指示 RabbitMQ 节点轮换日志文件。rabbitmqctl hipe_compile {directory}
将部分 RabbitMQ 代码用 HiPE(HiPE 是指 High Performance Erlang,是 Erlang 版的 JIT) 编译,并且将编译后的 .beam 文件保存到指定的文件目录中。
集群管理
rabbitmqctl join_cluster {cluster_node} [--ram]
将节点加入指定集群中。在这个命令执行前需要停止 RabbitMQ 应用并重置节点。rabbitmqctl cluster_status
显示集群的状态。rabbitmqctl change_cluster_node_type {disc|ram}
修改集群节点的类型。rabbitmqctl forget_cluster_node [--offline]
修改集群节点的类型。在这个命令执行前需要停止 RabbitMQ 应用。rabbitmqctl update_cluster_node {clusternode}
在集群中的节点应用启动前咨询 clusternode 节点的最新信息,并更新相应的集群信息。这个和 join_cluster 不同,它不加入集群。rabbitmqctl force_boot
确保节点可以启动,即使它不是最后一个关闭的节点。rabbitmqctl sync_queue [-p vhost] {queue}
指示未同步队列 queue 的 slave 镜像可以同步 master 镜像行的内容。同步期间此队列会被阻塞(所有此队列的生产消费者都会被阻塞),直到同步完成。rabbitmqctl cancel_sync_queue [-p vhost] {queue}
取消队列 queue 同步镜像的操作。rabbitmqctl set_cluster_name {name}
设置集群名称。
服务端状态
服务器状态的查询会返回一个以制表符分隔的列表,list_queues、list_exchanges、list_bindings 和 list_consumers 这种命令接收一个可选的 vhost 参数以显示其结果,默认值为“/”。
返回队列的详细信息
$ rabbitmqctl list_queues [-p vhost] [queueinfoitem]
,queueinfoitem 参数比较多,不一一列举描述。返回交换器的详细信息
$ rabbitmqctl list_exchanges [-p vhost] [exchangeinfoitem]
,exchangeinfoitem 参数的内容和客户端中的 channel.exchangeDeclare 方法的参数基本一致,不一一列举描述。返回绑定关系的详细信息
$ rabbitmqctl list_bindings [-p vhost] [bindinginfoitem]
。返回 TCP/IP 连接的统计信息
$ rabbitmqctl list_connections [connectioninfoitem]
,connectioninfoitem 参数比较多,不一一列举描述。返回当前所有信道的信息
$ rabbitmqctl list_channels [channelinfoitem]
,channelinfoitem 参数比较多,不一一列举描述。列举消费者的详细信息
$ rabbitmqctl list_consumers [-p vhost]
。显示 Broker 状态
$ rabbitmqctl status
。对 RabbitMQ 节点进行健康检查
确认应用是否正常运行、list_queues 和 list_channels 是否能够正常返回等。
$ rabbitmqctl node_health_check
。显示每个运行程序环境中每个变量的名称和值
$ rabbitmqctl environment
。为所有服务器状态生成一个服务器状态报告,并将输出重定向到一个文件
$ rabbitmqctl report
。 示例:$ rabbitmqctl report > report.txt
执行任意Rrlang表达式
$ rabbitmqctl eval {expr}
。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实战指南]