RabbitMQ04-管理RabbitMQ
- rabbitmqctl是一个命令行工具,使用这个工具可以执行大部分的RabbitMQ的管理操作。
- rabbitmq management是RabbitMQ提供的一个管理插件,可以让用户通过图形化的方式来管理RabbitMQ,但是它的功能却远不仅于此。
1、RabbitMQ服务管理
rabbitmq-server #启动RabbitMQ服务,并在前台运行
rabbitmq-server -detached #启动RabbitMQ服务,并在后台运行
rabbitmqctl stop #停止RabbitMQ服务和Erlang虚拟机。可以指定PID文件。
rabbitmqctl shutdown #停止RabbitMQ服务和Erlang虚拟机。不指定PID文件。
rabbitmqctl stop_app #停止RabbitMQ服务,但不停止Erlang虚拟机。
rabbitmqctl start_app #启动RabbitMQ服务,但不启动Erlang虚拟机。
rabbitmqctl reset #将RabbitMQ节点重置并还原到最初状态。包括从原来所在的集群中删除此节点,从管理数据库中删除所有的配置数据,如用户、vhost等,以及删除所有的持久化消息。
#执行rabbitmqctl reset命令前必须停止RabbitMQ应用(比如先执行rabbitmqctl stop_app)。
rabbitmqctl force_reset #强制将RabbitMQ节点重置并还原到最初状态。
#不同于rabbitmqctl reset命令,rabbitmqctl force_reset命令不论当前管理数据库的状态和集群配置是什么,都会无条件地重置节点。它只能在数据库或集群配置己损坏的情况下使用。
#执行rabbitmqctl force_reset命令前必须停止RabbitMQ应用。
rabbitmqctl [--node <node>] [--longnames] [--quiet] stop [--idempotent] [<pidfile>]
rabbitmqctl [--node <node>] [--longnames] [--quiet] shutdown [--wait] [--timeout <timeout>]
rabbitmqctl [--node <node>] [--longnames] [--quiet] stop_app
rabbitmqctl [--node <node>] [--longnames] [--quiet] start_app
rabbitmqctl [--node <node>] [--longnames] [--quiet] reset
rabbitmqctl [--node <node>] [--longnames] [--quiet] force_reset
2、用户管理
- 在RabbitMQ中,用户是访问控制(Access Control)的基本单元,可以对一个用户授予多个vhost的权限。且对于多个vhost,用户可以被赋予不同级别的访问权限,并使用标准的用户名和密码来认证用户。
2.1、用户管理的基本操作
rabbitmqctl list_users #列出用户名和角色(tags)
rabbitmqctl add_user <username> <password> #创建一个新用户。默认情况下,此用户没有任何vhost的权限
rabbitmqctl delete_user <username> #删除用户
rabbitmqctl change_password <username> <password> #修改用户密码
rabbitmqctl clear_password <username> #清除密码(禁用基于密码的身份验证)
rabbitmqctl authenticate_user <username> <password> #验证用户。如果身份验证失败,退出时使用非零代码
rabbitmqctl [--node <node>] [--longnames] [--quiet] list_users [--no-table-headers] [--timeout <timeout>]
rabbitmqctl [--node <node>] [--longnames] [--quiet] add_user <username> <password>
<username>:用户名
<password>:用户密码。使用空字符串禁用基于密码的身份验证。
rabbitmqctl [--node <node>] [--longnames] [--quiet] change_password <username> <password>
rabbitmqctl [--node <node>] [--longnames] [--quiet] clear_password <username>
rabbitmqctl [--node <node>] [--longnames] [--quiet] authenticate_user <username> <password>
rabbitmqctl [--node <node>] [--longnames] [--quiet] delete_user <username>
- 注意,删除用户时,任何引用该用户的访问控制条目都会从RabbitMQ权限数据库中自动删除。rabbitmqctl不会警告你与用户相关的访问控制条目也会删除,所以请谨慎删除用户,否则你会发现不得不重建一大堆访问控制条目。
2.2、设置用户的角色
- 角色可以赋予用户在web管理页面上有哪些操作权限。
- 用户角色有5种:none、普通管理者、策略制定者、监控者和超级管理员。
- none:无任何角色。新用户的角色默认为none。(通常就是普通的生产者和消费者)
- 普通管理者(management):可以登陆管理控制台(启用management plugin的情况下),无法看到节点信息,也无法对策略进行管理。
- 策略制定者(policymaker):包含management的所有权限,并且可以管理策略(Policy)和参数(Parameter)。
- 监控者(monitoring):包含management的所有权限,并且可以看到所有连接、信道及节点相关的信息。
- 超级管理员(administrator):包含monitoring的所有权限,并且可以管理用户、虚拟主机、权限、策略、参数等。
rabbitmqctl set_user_tags <username> <tag> [...] #设置用户的角色
rabbitmqctl [--node <node>] [--longnames] [--quiet] set_user_tags <username> <tag> [...]
<tag>:用于设置0 个、l 个或者多个的角色。(之前的身份角色都会被删除)
示例:
//查看用户列表 ]# rabbitmqctl list_users Listing users ... user tags guest [administrator] //创建一个新用户 ]# rabbitmqctl add_user root root Adding user "root" ... Done. Don't forget to grant the user permissions to some virtual hosts! See 'rabbitmqctl help set_permissions' to learn more. //设置用户的角色 ]# rabbitmqctl set_user_tags root administrator Setting tags for user "root" to [administrator] ... //查看用户列表 ]# rabbitmqctl list_users Listing users ... user tags guest [administrator] root [administrator]
3、管理虚拟主机
3.1、创建和删除虚拟主机
- 删除一个vhost同时也会删除其下所有的队列、交换器、绑定关系、用户权限、参数和策略等信息。
rabbitmqctl list_vhosts #查看虚拟主机列表 rabbitmqctl add_vhost <vhost> #创建虚拟主机 rabbitmqctl delete_vhost <vhost> #删除虚拟主机 rabbitmqctl [--node <node>] [--longnames] [--quiet] list_vhosts [--no-table-headers] [<column> ...] [--timeout <timeout>] rabbitmqctl [--node <node>] [--longnames] [--quiet] add_vhost <vhost> [--description <description> --tags "<tag1>,<tag2>,<...>"] rabbitmqctl [--node <node>] [--longnames] [--quiet] delete_vhost <vhost>
3.2、管理虚拟主机的权限
- 在RabbitMQ中,权限控制是以vhost为单位的。当创建一个用户时,用户通常会被指派给至少一个vhost,并且只能访问被指派的vhost内的队列、交换器和绑定关系等。
- RabbitMQ中的授予权限是指在vhost级别对用户进行权限授予。
3.2.1、列出权限
rabbitmqctl list_permissions [--vhost <vhost>] #列出vhost上的权限 rabbitmqctl list_user_permissions <username> #列出一个用户在所有vhost上的权限 rabbitmqctl [--node <node>] [--longnames] [--quiet] list_permissions [--vhost <vhost>] [--no-table-headers] [--timeout <timeout>] rabbitmqctl [--node <node>] [--longnames] [--quiet] list_user_permissions [--no-table-headers] <username> [--timeout <timeout>]
3.2.2、配置权限
rabbitmqctl set_permissions [--vhost <vhost>] <username> <conf> <write> <read> #在vhost中为用户设置权限
rabbitmqctl clear_permissions [--vhost <vhost>] <username> #清除用户在vhost上的所有权限
rabbitmqctl [--node <node>] [--longnames] [--quiet] set_permissions [--vhost <vhost>] <username> <conf> <write> <read>
<vhost>:对用户授予哪个vhost的权限,默认值vhost是"/"。
<username>:用户的名称
<conf>:用于匹配用户在哪些资源上拥有可配置的权限(可以使用正则表达式)。可配置是指队列和交换器的创建及删除之类的操作。
<write>:用于匹配用户在哪些资源上拥有可写的权限(可以使用正则表达式)。可写是指发布消息。
<read>:用于匹配用户在哪些资源上拥有可读的权限(可以使用正则表达式)。可读是指与消息有关的操作,包括读取消息及清空整个队列等。
rabbitmqctl [--node <node>] [--longnames] [--quiet] clear_permissions [--vhost <vhost>] <username>
- AMQP命令与权限的映射关系

示例:
//创建vhost
]# rabbitmqctl add_vhost vhost_hh
Adding vhost "vhost_hh" ...
//查看vhost列表(名称、标签、集群状态、追踪、描述)
]# rabbitmqctl list_vhosts name tags cluster_state tracing description
Listing vhosts ...
name tags cluster_state tracing description
vhost_hh [] [{rabbit@hh14, running}] false
/ [] [{rabbit@hh14, running}] false Default virtual host
//在vhost中为用户设置权限
]# rabbitmqctl set_permissions --vhost vhost_hh root "^queue.*" ".*" ".*"
Setting permissions for user "root" in vhost "vhost_hh" ...
//查看用户在所有vhost上的权限
]# rabbitmqctl list_user_permissions root
Listing permissions for user "root" ...
vhost configure write read
vhost_hh ^queue.* .* .*
//查看vhost上的权限
]# rabbitmqctl list_permissions --vhost vhost_hh
Listing permissions for vhost "vhost_hh" ...
user configure write read
root ^queue.* .* .*
4、集群管理
rabbitmqctl cluster_status #显示集群的状态
rabbitmqctl set_cluster_name <name> #设置集群名称
rabbitmqctl join_cluster [--disc|--ram] <existing_cluster_member> #将节点加入到指定集群中。执行这个命令前需要停止RabbitMQ应用并重置节点
rabbitmqctl change_cluster_node_type <disc | ram> #修改集群节点的类型。执行这个命令前需要停止RabbitMQ应用。
rabbitmqctl update_cluster_nodes <seed_node> #在集群中的节点启动前,向seed_node节点咨询集群的最新信息,并更新集群信息。
rabbitmqctl forget_cluster_node [--offline] <existing_cluster_member_node> #将节点从集群中删除,允许离线执行。
rabbitmqctl force_boot #强制节点启动,即使它不是最后一个关闭的节点
rabbitmqctl sync_queue [--vhost <vhost>] <queue> #进行镜像同步
rabbitmqctl cancel_sync_queue [--vhost <vhost>] <queue> #取消镜像同步。
rabbitmqctl [--node <node>] [--longnames] [--quiet] join_cluster [--disc|--ram] <existing_cluster_member>
<existing_cluster_member>:要加入的集群中的成员(节点)
--disc:将该节点设置为disk节点,将数据存储在磁盘中。推荐使用(默认使用)。
--ram:将该节点设置为RAM节点,将数据存储在内存中。不推荐。
rabbitmqctl [--node <node>] [--longnames] [--quiet] cluster_status [--timeout <timeout>]
rabbitmqctl [--node <node>] [--longnames] [--quiet] change_cluster_node_type <disc | ram>
rabbitmqctl [--node <node>] [--longnames] [--quiet] forget_cluster_node [--offline] <existing_cluster_member_node>
--offline:可以将非运行状态下的节点剔除集群。
rabbitmqctl [--node <node>] [--longnames] [--quiet] update_cluster_nodes <seed_node>
rabbitmqctl [--node <node>] [--longnames] [--quiet] force_boot
rabbitmqctl [--node <node>] [--longnames] [--quiet] sync_queue [--vhost <vhost>] <queue>
rabbitmqctl [--node <node>] [--longnames] [--quiet] cancel_sync_queue [--vhost <vhost>] <queue>
rabbitmqctl [--node <node>] [--longnames] [--quiet] set_cluster_name <name>
5、服务端状态
rabbitmqctl status #显示Broker的状态,比如当前Erlang节点上运行的应用程序、RabbitMQ的版本信息、os的名称、内存及文件描述符等统计信息。
rabbitmqctl environment #显示每个运行程序环境中每个变量的名称和值。
rabbitmqctl report #为生成服务器状态报告
rabbitmqctl list_queues [--vhost <vhost>] [<column>, ...] #查看队列的详细信息
rabbitmqctl list_exchanges [--vhost <vhost>] [<column> ...] #查看交换器的详细信息
rabbitmqctl list_bindings [--vhost <vhost>] [<column> ...] #查看绑定的详细信息
rabbitmqctl list_connections [<column> ...] #查看连接的详细信息
rabbitmqctl list_channels [<column> ...] #查看信道的详细信息
rabbitmqctl list_consumers [--vhost <vhost>] [<column> ...] #查看消费者的详细信息
rabbitmqctl [--node <node>] [--longnames] [--quiet] status [--unit <unit>] [--timeout <timeout>]
rabbitmqctl [--node <node>] [--longnames] [--quiet] environment
rabbitmqctl [--node <node>] [--longnames] [--quiet] report
rabbitmqctl [--node <node>] [--longnames] [--quiet] list_queues [--vhost <vhost>] [--online] [--offline] [--local] [--no-table-headers] [<column>, ...] [--timeout <timeout>]
name:队列名称。
durable:队列是否持久化。
auto_delete:队列是否自动删除。
arguments:队列的参数。
policy:应用到队列上的策略名称。
pid:队列关联的Er1ang进程的ID 。
owner_pid:处理排他队列连接的Erlang进程ID。如果此队列是非排他的,此值将为空。
exclusive:队列是否是排他的。
exclusive_consumer_pid:订阅到此排他队列的消费者相关的信道关联的Erlang进程ID 。如果此队列是非排他的,此值将为空。
exclusive_consumer_tag:订阅到此排他队列的消费者的consumerTag。如果此队列是非排他的,此值将为空。
messages_ready:准备发送给客户端的消息个数。
messages_unacknowledged:发送给客户端但尚未应答的消息个数。
messages:准备发送给客户端和未应答消息的总和。
messages_ready_ram:驻留在内存中messages_ready的消息个数。
messages_unacknowledged_ram:驻留在内存中messages_unacknowledged的消息个数。
messages_ram:驻留在内存中的消息总数。
messages_persistent:队列中持久化消息的个数。对于非持久化队列来说总是0 。
message_bytes:队列中所有消息的大小总和。这里不包括消息属性或者任何其他开销。
message_bytes_ready:准备发送给客户端的消息的大小总和。
message_bytes_unacknowledged:发送给客户端但尚未应答的消息的大小总和。
message_bytes_ram:驻留在内存中的messages_bytes 。
message_bytes_persistent:队列中持久化的messages_bytes 。
disk_reads:从队列启动开始,己从磁盘中读取该队列的消息总次数。
disk_writes:从队列启动开始,己向磁盘队列写消息的总次数。
consumers:消费者数目。
consumer_utilisation:队列中的消息能够立刻投递给消费者的比率,介于0 和l之间。这个受网络拥塞或者Basic.Qos 的影响而小于1 。
memory:与队列相关的Erlang 进程所消耗的内存字节数,包括械、堆及内部结构。
slave_pids:如果队列是镜像的,列出所有slave 镜像的pid 。
synchronised_slave_pids:如果队列是镜像的,列出所有己经同步的slave 镜像的pid 。
state:队列状态。正常情况下是running;如果队列正常同步数据可能会有"{syncing, MsgCount}"的状态;如果队列所在的节点掉线了,则队列显示状态为down(此时大多数的queueinfoitems也将不可用)。
rabbitmqctl [--node <node>] [--longnames] [--quiet] list_exchanges [--vhost <vhost>] [--no-table-headers] [<column> ...] [--timeout <timeout>]
name:交换器的名称。
type:交换器的类型。
durable:设置是否持久化。durable设置为true表示持久化,反之是非持久化。持久化可以将交换器信息存盘,而在服务器重启的时候不会丢失相关信息。
auto_delete:设直是否自动删除。
internal:是否是内置的。
arguments:其他一些结构化参数,比如alternate-exchange。
policy:应用到交换器上的策略名称。
rabbitmqctl [--node <node>] [--longnames] [--quiet] list_bindings [--vhost <vhost>] [--no-table-headers] [<column> ...] [--timeout <timeout>]
source_name:绑定中消息来源的名称。
source_kind:绑定中消息来源的类别。
destination_name:绑定中消息目的地的名称。
destination_kind:绑定中消息目的地的种类。
routing_key:绑定的路由键。
arguments:绑定的参数。
rabbitmqctl [--node <node>] [--longnames] [--quiet] list_connections [--no-table-headers] [<column> ...] [--timeout <timeout>]
pid:与连接相关的Er1ang进程ID 。
name:连接的名称。
port:服务器端口。
host:返回反向DNS获取的服务器主机名称,或者IP地址,或者未启用。
peer_port:服务器对端端口。当一个客户端与服务器连接时,这个客户端的端口就是peer_port 。
peer_host:返回反向DNS获取的对端主机名称,或者IP地址,或者未启用。
ssl:是否启用SSL 。
ssl_protocol:SSL协议,如tlsv1。
ssl_key_exchange:SSL密钥交换算法,如rsa。
ssl_cipher:SSL加密算法,如aes_256_cbc。
ssl_hash:SSL哈希算法,如sha。
peer_cert_subject:对端的SSL安全证书的主题,基于RFC4514的形式。
peer_cert_issuer:对端SSL安全证书的发行者,基于RFC4514的形式。
peer_cert_validity:对端SSL安全证书的有效期。
state:连接状态,包括starting、tuning、opening、running、flow、blocking、blocked、closing和closed这几种。
channels:该连接中的信道个数。
protocol:使用的AMQP协议的版本,当前是{0,9,1} 或者{0,8,0}。注意,如果客户端请求的是AMQP 0-9的连接, RabbitMQ也会将其视为0-9-l 。
auth_mechanism:使用的SASL认证机制,如PLAIN、AMQPLAIN、EXTERNAL、RABBIT-CR-DEMO等。
user:与连接相关的用户名。
vhost:与连接相关的vhost的名称。
timeout:连接超时/协商的心跳间隔,单位为秒。
frame_max:最大传输帧的大小,单位为B 。
channel_max:此连接上信道的最大数量。如果值0,则表示无上限,但客户端一般会将0转变为65535 。
client_properties:在建立连接期间由客户端发送的信息属性。
recv_oct:收到的字节数。
recv_cnt:收到的数据包个数。
send_oct:发送的字节数。
send_cnt:发送的数据包个数。
send_pend:发送队列大小。
connected_at:连接建立的时间戳。
rabbitmqctl [--node <node>] [--longnames] [--quiet] list_channels [--no-table-headers] [<column> ...]
pid:与连接相关的Erlang进程ID。
connection:信道所属连接的Erlang进程ID 。
name:信道的名称。
number:信道的序号。
user:与信道相关的用户名称。
vhost:与信道相关的vhost。
transactional:信道是否处于事务模式。
confirm:信道是否处于publisher confirm模式。
consumer_count:信道中的消费者的个数。
messages_unacknowledged:己投递但是还未被ack的消息个数。
messages_uncommitted:己接收但是还未提交事务的消息个数。
acks_uncommitted:己ack 收到但是还未提交事务的消息个数。
messages_unconfirmed:己发送但是还未确认的消息个数。如果信道不处于prefetch_count模式下,则此值为0。
prefetch_count:新消费者的Qos 个数限制。0 表示无上限。
global_prefetch_count:整个信道的Qos个数限制。0表示无上限。
rabbitmqctl [--node <node>] [--longnames] [--quiet] list_consumers [--vhost <vhost>] [--no-table-headers] [<column> ...] [--timeout <timeout>]
6、使用Web页面管理RabbitMQ
- RabbitMQ management插件提供Web管理界面用来管理虚拟主机、用户等,也可以用来管理队列、交换器、绑定关系、策略、参数等,还可以用来监控RabbitMQ服务的状态及一些数据统计类信息,可谓是功能强大,基本上能够涵盖所有RabbitMQ管理的功能。
- RabbitMQ management插件同样是由Erlang语言编写的,并且和RabbitMQ服务运行在同一个Erlang虚拟机中。
- 在使用Web管理界面之前需要先启用RabbitMQ management插件。
6.1、管理插件
//列出所有插件
rabbitmq-plugins list
//启用插件
rabbitmq-plugins enable <plugin1> [ <plugin2>]
//禁用插件
rabbitmq-plugins disable <plugin1> [ <plugin2>]
//显示插件目录和启用的插件文件路径
rabbitmq-plugins directories
rabbitmq-plugins [--node <node>] [--longnames] [--quiet] list [pattern] [--verbose] [--minimal] [--enabled] [--implicitly-enabled]
<pattern>:只列出与正则表达式匹配的插件
--verbose:输出详细信息
--minimal:只输出插件名称
--enabled:只列出启用的插件
--implicitly-enabled:包含启用的插件作为其他插件的依赖项
rabbitmq-plugins [--node <node>] [--longnames] [--quiet] enable <plugin1> [ <plugin2>] | --all [--offline] [--online]
rabbitmq-plugins [--node <node>] [--longnames] [--quiet] disable <plugin1> [ <plugin2>] | --all [--offline] [--online]
rabbitmq-plugins [--node <node>] [--longnames] [--quiet] directories [--offline] [--online]
6.2、示例
1、启用rabbitmq_management插件
- 标记为[E*]的是显式启动,而[e*]是隐式启动。例如显式启动rabbitmq_management插件,同时会隐式启动rabbitmq_management_agent和rabbitmq_web_dispatch插件。
//启用rabbitmq_management插件 ]# rabbitmq-plugins enable rabbitmq_management //查看插件 ]# rabbitmq-plugins list ...... [E*] rabbitmq_management 3.9.19 [e*] rabbitmq_management_agent 3.9.19 [e*] rabbitmq_web_dispatch 3.9.19
2、配置登录用户
//创建一个用户,用户账密root/root ]# rabbitmqctl add_user root root //为用户root配置角色administrator ]# rabbitmqctl set_user_tags root administrator
3、登录web管理页面
- 使用主机IP和端口登录,http://IP:15672
- 默认的用户guest/guest只能使用http://localhost:15672/访问。


浙公网安备 33010602011771号