RabbitMQ 管理

一、插件管理
  RabbitMQ 提供了很多的插件,默认存放在 $RABBITMQ_HOME/plugins 目录下。
1. rabbitmq-plugins 语法
rabbitmq-plugins [-n node] {command} [command options...]
2. 启动插件
rabbitmq-plugins enable [plugin-name]
3. 关闭插件
rabbitmq-plugins disable [plugin-name]
4. 查看当前插件的使用情况
rabbitmq-plugins list

  标记为 [E*] 的为显式启动,而 [e*] 为隐式启动,如显式启动 rabbitmq_management 插件会同时隐式启动 amqp_client、cowboy、cowlib、rabbitmq_management_agent、rabbitmq_web_dispatch 等另外 5 个插件。
5. web 端管理插件 - rabbitmq_management
  RabbitMQ management 插件同样是由 Erlang 语言编写的,并且和 RabbitMQ 服务运行在同一个 Erlang 虚拟机中。
  RabbitMQ management 插件可以提供 Web 管理界面用来管理虚拟主机、用户等,也可以用来管理队列、交换器、绑定关系、策略、参数等,还可以用来监控 RabbitMQ 服务的状态及一些数据统计类信息,可谓是功能强大,基本上能够涵盖所有 RabbitMQ 管理的功能。
  开启 rabbitmq_management 插件之后还需要重启 RabbitMQ 服务才能使其正式生效。之后就可以通过浏览器访问 web 管理后台:http://localhost:15672。
6. RabbitMQ 命令行管理工具 - rabbitmqctl
  rabbitmqctl 工具是用来管理 RabbitMQ 中间件的命令行工具,它通过连接各个 RabbitMQ 节点来执行所有操作。
  rabbitmqctl 工具的标准语法如下:
rabbitmqctl [-n node] [-t timeout] [-q] {command} [command options...]
命令选项解析:
-n:节点名称。
-q:启用 quiet 模式,这样可以屏蔽一些消息的输出。默认不开启 quiet 模式。
-t:操作超时时间(秒为单位),只适用于“list_xxx”类型的命令,默认是无穷大。
 
 
二、多租户
  每一个 RabbitMQ 服务器都能创建虚拟的消息服务器,我们称之为虚拟主机(virtual host),简称为 vhost。
  每一个 vhost 本质上是一个独立的小型 RabbitMQ 服务器,拥有自己独立的队列、交换器及绑定关系等,并且它拥有自己独立的权限。vhost 就像是虚拟机与物理服务器一样,它们在各个实例间提供逻辑上的分离,为不同程序安全保密地运行数据,它既能将同一个 RabbitMQ 中的众多客户区分开,又可以避免队列和交换器等命名冲突。
  vhost 是 AMQP 概念的基础,客户端在连接的时候必须制定一个 vhost。RabbitMQ 默认创建的vhost为“/”。
1. 创建 vhost
rabbitmqctl add_vhost {vhost}
2. 删除 vhost
rabbitmqctl delete_vhost {vhost}
  删除一个 vhost 同时也会删除其下所有的队列、交换器、绑定关系、用户权限、参数和策略等信息。
3. 查询当前 vhost 的相关信息
rabbitmqctl list_vhosts [vhostinfoitem...]
  vhostinfoitem 的取值有 2 个:
name:表示 vhost 的名称。
tracing:表示是否使用了 RabbitMQ 的 trace 功能。
注:
  若要删除所有的交换器、队列及绑定关系,删除对应的 vhost 就可以“一键搞定”,而不需要一个个遍历删除。
 
 
三、用户、角色与权限
1. 用户管理
  在 RabbitMQ 中,用户是访问控制(Access Control)的基本单元,且单个用户可以跨越多个 vhost 进行授权。针对一至多个 vhost,用户可以被赋予不同级别的访问权限,并使用标准的用户名和密码来认证用户。
(1)创建用户
rabbitmqctl add_user {username} {password}
(2)删除用户
rabbitmqctl delete_user {username}
(3)查看用户列表
rabbitmqctl list_users

(4)修改密码
rabbitmqctl change_password {username} {newpassword}
(5)清除密码
rabbitmqctl clear_password {username}
(6)通过密码验证用户
rabbitmqctl authenticate_user {username} {password}
2. 角色管理
  用户的角色分为 5 种类型:
(1)none:无任何角色。新创建的用户的角色默认为 none。
(2)management:可以访问 Web 管理页面。
(3)policymaker:包含 management 的所有权限,并且可以管理策略(Policy)和参数(Parameter)。
(4)monitoring:包含 management 的所有权限,并且可以看到所有连接、信道及节点相关的信息。
(5)administartor:包含 monitoring 的所有权限,并且可以管理用户、虚拟主机、权限、策略、参数等。administator 代表了最高的权限。
  设置用户角色:
rabbitmqctl set_user_tags {username} {tag...}
设置之后任何之前所有的身份都会被删除。

3. 权限管理
  AMQP 协议中并没有指定权限在 vhost 级别还是在服务器级别实现,由具体的应用自定义。在RabbitMQ 中,权限控制则是以 vhost 为单位的。当创建一个用户时,用户通常会被指派给至少一个 vhost,并且只能访问被指派的 vhost 内的队列、交换器和绑定关系等。因此,RabbitMQ 中的授予权限是指在 vhost 级别对用户而言的权限授予。
(1)授予权限
rabbitmqctl set_permissions [-p vhost] {user} {conf} {write} {read}
其中各个参数的含义如下所述。
vhost:授予用户访问权限的 vhost 名称,可以设置为默认值,即 vhost 为“/”。
user:可以访问指定 vhost 的用户名。
conf:一个用于匹配用户在哪些资源上拥有可配置权限的正则表达式。
write:一个用于匹配用户在哪些资源上拥有可写权限的正则表达式。
read:一个用于匹配用户在哪些资源上拥有可读权限的正则表达式。
注:可配置指的是队列和交换器的创建及删除之类的操作;可写指的是发布消息;可读指与消息有关的操作,包括读取消息及清空整个队列等。
示例:
授予 root 用户可访问虚拟主机 /,并在所有资源上都具备可配置、可写及可读的权限:
rabbitmqctl set_permissions -p / root ".*" ".*" ".*"
授予 root 用户可访问虚拟主机 wjt-host,在以“queue”开头的资源上具备可配置权限,并在所有资源上拥有可写、可读的权限:
rabbitmqctl set_permissions -p wjt-host root "^queue.*" ".*" ".*"
(2)清除权限
rabbitmqctl clear_permissions [-p vhost] {username}
清除权限也是在 vhost 级别对用户而言的。
(3)查询权限信息
  显示虚拟主机上的权限:
rabbitmqctl list_permissions [-p vhost]

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

 

 

四、应用管理
1. pid_file
  RabbitMQ 的 pid_file 是通过调用 rabbitmq-server 命令启动 RabbitMQ 服务时创建的,默认情况下存放于 Mnesia(安装目录下的 var/lib/rabbitmq/mnesia/ 子目录) 目录中,可以通过 RABBITMQ_PID_FILE 这个环境变量来改变存放路径。注意,如果使用 rabbitmq-server-detach 这个带有 -detach 后缀的命令来启动 RabbitMQ 服务则不会生成 pid_file 文件。
2. 停止运行 RabbitMQ 的 Erlang 虚拟机和 RabbitMQ 服务应用
(1)
rabbitmqctl stop [pid_file]
  如果指定了 pid_file,还需要等待指定进程的结束。
(2)
rabbitmqctl shutdown
  执行这个命令会阻塞直到 Erlang 虚拟机进程退出。如果 RabbitMQ 没有成功关闭,则会返回一个非零值。这个命令和 rabbitmqctl stop 不同的是,它不需要指定 pid_file 就可以阻塞等待指定进程的关闭。
3. 停止 RabbitMQ 服务应用
rabbitmqctl stop_app
  停止 RabbitMQ 服务应用,但是 Erlang 虚拟机还是处于运行状态。此命令的执行优先于其他管理操作(这些管理操作需要先停止 RabbitMQ 应用),比如 rabbitmqctl reset。
4. 启动 RabbitMQ 应用
(1)
rabbitmqctl start_app
  启动 RabbitMQ 应用。此命令典型的用途是在执行了其他管理操作之后,重新启动之前停止的 RabbitMQ 应用,比如 rabbitmqctl reset。
(2)
rabbitmqctl wait [pid_file]
  等待 RabbitMQ 应用的启动。它会等到 pid_file 的创建,然后等待 pid_file 中所代表的进程启动。当指定的进程没有启动 RabbitMQ 应用而关闭时将会返回失败。
5. 将 RabbitMQ 节点重置还原到最初状态
(1)
rabbitmqctl reset
  将 RabbitMQ 节点重置还原到最初状态。包括从原来所在的集群中删除此节点,从管理数据库中删除所有的配置数据,如已配置的用户、vhost 等,以及删除所有的持久化消息。执行 rabbitmqctl reset 命令前必须停止 RabbitMQ 应用(比如先执行 rabbitmqctl stop_app)。
(2)
rabbitmqctl force_reset
  强制将 RabbitMQ 节点重置还原到最初状态。不同于 rabbitmqctl reset 命令,rabbitmqctl force_reset 命令不论当前管理数据库的状态和集群配置是什么,都会无条件地重置节点。它只能在数据库或集群配置已损坏的情况下使用。与 rabbitmqctl reset 命令一样,执行 rabbitmqctl force_reset 命令前必须先停止 RabbitMQ 应用。
6. 指示 RabbitMQ 节点轮换日志文件
rabbitmqctl rotate_logs {suffix}
  指示 RabbitMQ 节点轮换日志文件。RabbitMQ 节点会将原来的日志文件中的内容追加到“原始名称+后缀”的日志文件中,然后再将新的日志内容记录到新创建的日志中(与原日志文件同名)。当目标文件不存在时,会重新创建。如果不指定后缀 suffix,则日志文件只是重新打开而不会进行轮换。
 
 
五、集群管理
1. 将节点加入指定集群中
rabbitmqctl join_cluster {cluster_node} [--ram]
  在这个命令执行前需要停止 RabbitMQ 应用并重置节点。
2. 显示集群的状态
rabbitmqctl cluster_status
3. 修改集群节点的类型
rabbitmqctl change_cluster_node_type {disc|ram}

  在这个命令执行前需要停止 RabbitMQ 应用。

4. 将节点从集群中删除

rabbitmqctl forget_cluster_node [--offline]
  允许离线执行。
5. 更新集群信息
rabbitmqctl update_cluster_nodes {clusternode}
  在集群中的节点应用启动前咨询 clusternode 节点的最新信息,并更新相应的集群信息。这个和 join_cluster 不同,它不加入集群。
6. 强制启动节点
rabbitmqctl force_boot
  确保节点可以启动,即使它不是最后一个关闭的节点。通常情况下,当关闭整个 RabbitMQ 集群时,重启的第一个节点应该是最后关闭的节点,因为它可以看到其他节点所看不到的事情。但是有时会有一些异常情况出现,比如整个集群都掉电而所有节点都认为它不是最后一个关闭的。在这种情况下,可以调用 rabbitmqctl force_boot 命令,这就告诉节点可以无条件地启动节点。在此节点关闭后,集群的任何变化,它都会丢失。如果最后一个关闭的节点永久丢失了,那么需要优先使用 rabbitmqctl forget_cluster_node --offline 命令,因为它可以确保镜像队列的正常运转。
7. 镜像队列同步操作
(1)同步镜像
rabbitmqctl sync_queue [-p vhost] {queue}
指示未同步队列 queue 的 slave 镜像可以同步 master 镜像的内容。同步期间此队列会被阻塞(所有此队列的生产消费者都会被阻塞),直到同步完成。此条命令执行成功的前提是队列 queue 配置了镜像。注意,未同步队列中的消息被耗尽后,最终也会变成同步,此命令主要用于未耗尽的队列。
(2)取消同步
rabbitmqctl cancel_sync_queue [-p vhost] {queue}
取消队列 queue 同步镜像的操作。
8. 设置集群名称
rabbitmqctl set_cluster_name {name}
集群名称在客户端连接时会通报给客户端。Federation 和 Shovel 插件也会有用到集群名称的地方。集群名称默认是集群中第一个节点的名称,通过这个命令可以重新设置。
 
 
六、服务端状态
1. 查询队列详细信息
rabbitmqctl list_queues [-p vhost] [queueinfoitem...]
  如果无 [-p vhost] 参数,将显示默认的 vhost 为“/”中的队列详情。queueinfoitem 参数用于指示哪些队列的信息项会包含在结果集中,结果集的列顺序将匹配参数的顺序。如果没有指定 queueinfoitems,那么此命令将显示队列的名称和消息的个数。
示例:
参数解析:
name:队列名称。
durable:队列是否持久化。
messages_ready:准备发送给客户端的消息个数。
messages_unacknowledged:发送给客户端但尚未应答的消息个数。
messages_ram:驻留在内存中的消息总数。
messages_persistent:队列中持久化消息的个数。
memory:与队列相关的 Erlang 进程所消耗的内存字节数,包括栈、堆及内部结构。
state:队列状态。
此外,还有更多参数支持。
2. 查询交换器详细信息
rabbitmqctl list_exchanges [-p vhost] [exchangeinfoitem...]
  如果无 [-p vhost] 参数,将显示默认的 vhost 为“/”中的交换器详情。exchangeinfoitem 参数用于指示哪些信息项会包含在结果集中,结果集的列顺序将匹配参数的顺序。如果没有指定 exchangeinfoitem,那么此命令将显示交换器的名称和类型。
示例:
参数解析:
name:交换器的名称。
type:交换器的类型。
durable:设置是否持久化。
arguments:其他一些结构化参数,比如 alternate-exchange。
policy:应用到交换器上的策略名称。
此外,还有更多参数支持。
3. 查询绑定关系细节
rabbitmqctl list_bindings [-p vhost] [bindinginfoitem...]
  如果无 [-p vhost ]参数,将显示默认的 vhost 为“/”中的绑定关系详情。bindinginfoitem 参数用于指示哪些信息项会包含在结果集中,结果集的列顺序将匹配参数的顺序。如果没有指定bindinginfoitem,那么将显示所有的条目。
参数解析:
source_name:绑定中消息来源的名称。
source_kind:绑定中消息来源的类别。
destination_name:绑定中消息目的地的名称。
destination_kind:绑定中消息目的地的种类。
routing_key:绑定的路由键。
arguments:绑定的参数。
4. 查询TCP/IP连接统计信息
rabbitmqctl list_connections [connectioninfoitem...]
  connectioninfoitem 参数用于指示哪些信息项会包含在结果集中,结果集的列顺序将匹配参数的顺序。如果没有指定 connectioninfoitem,那么会显示 user、peer_host、peer_port 和 state 这几项信息。
示例:
参数解析:
name:连接的名称。
vhost:与连接相关的 vhost 的名称。
user:与连接相关的用户名。
peer_host:返回反向 DNS 获取的对端主机名称。
peer_port:服务器对端端口。
ssl:是否启用 SSL。
protocol:使用的 AMQP 协议的版本。
channels:该连接中的信道个数。
state:连接状态。
此外,还有更多参数支持。
5. 查询当前所有信道的信息
rabbitmqctl list_channels [channelinfoitem...]
  channelinfoitem 参数用于指示哪些信息项会包含在结果集中,结果集的列顺序将匹配参数的顺序。如果没有指定 channelinfoitem,那么会显示 pid、user、consumer_count 和 messages_unacknowledged 这几项信息。
参数解析:
name:信道的名称。
vhost:与信道相关的 vhost。
user:与信道相关的用户名称。
consumer_count:信道中的消费者的个数。
transactional:信道是否处于事务模式。
confirm:信道是否处于 publisher confirm 模式。
此外,还有更多参数支持。
6. 查询消费者信息
rabbitmqctl list_consumers [-p vhost]
  每行将显示由制表符分隔的已订阅队列的名称、相关信道的进程标识、consumerTag、是否需要消费端确认、prefetch_count 及参数列表这些信息。
7. Broker 状态
rabbitmqctl status
  比如当前 Erlang 节点上运行的应用程序、RabbitMQ/Erlang 的版本信息、OS 的名称、内存及文件描述符等统计信息。
8. 健康检查
rabbitmqctl node_health_check
  对 RabbitMQ 节点进行健康检查,确认应用是否正常运行、list_queues 和 list_channels 是否能够正常返回等。
9. 显示每个运行程序环境中每个变量的名称和值
rabbitmqctl environment
10. 服务器状态报告
rabbitmqctl report
  为所有服务器状态生成一个服务器状态报告,并将输出重定向到一个文件。(其中包含了mnesia 目录与配置、日志文件目录、连接、信道、环境变量等各种参数值)
11. 执行任意 Erlang 表达式
rabbitmqctl eval {expr}

 

 

七、HTTP API 接口管理
  RabbitMQ Management 插件不仅提供了 Web 管理界面,还提供了 HTTP API 接口来方便调用。比如创建一个队列,就可以通过PUT方法调用 /api/queues/vhost/name 接口来实现。
所有的 HTTP API 接口都需要 HTTP 基础认证(使用标准的 RabbitMQ 用户数据库),默认的是 guest/guest(非 localhost 的不能使用这组认证,除非特殊设置)。
  HTTP API 接口通常用来方便客户端的调用。如果单纯地使用 curl 的方式来调用,rabbitmqadmin 会显得更加方便。rabbitmqadmin 也是RabbitMQ Management 插件提供的功能,它会包装 HTTP API 接口,使其调用显得更加简洁方便。
  rabbitmqadmin 是需要安装的,不过这个步骤非常简单,可以点击 Web 管理页面左下角的“Command Line”跳转到“rabbitmqadmin”页面进行下载。在使用 rabbitmqadmin 前还要确保已经成功安装 Python,Python 的版本需为 2.x。

posted @ 2022-10-08 23:05  疯一样的狼人  阅读(1874)  评论(0编辑  收藏  举报