本文主要讲解以下内容:
多租户与权限
用户管理
服务管理
应用管理
HTTP API管理
本文针对的主要是RabbitMQ服务管理,可以当做一个命令手册进行查阅。在本文章开始之间,我们先通过Docker来简单启动一个RabbitMQ服务实例。
# 拉取镜像
docker pull rabbitmq:management
# 启动RabbitMQ服务实例,指定应用程序的访问和对外暴露端口为5672,WEB管理界面的访问和对外暴露端口为15672
docker run -d -p 5672:5672 -p 15672:15672 --hostname rabbitmq001 --name rabbit001 rabbitmq:management
# 进入容器
docker exec -it rabbit001 /bin/bash
多租户与权限
RabbitMQ中还有一个vhost(虚拟的消息服务器)的概念,这就好比虚拟机和物理机的关系。RabbitMQ服务中可以有多个vhost,每个vhost之间互相独立,数据保密,互不影响,有自己的权限控制。两个vhost中的队列和交换器不能互相绑定,队列和交换器的名称可以重复。
RabbitMQ有一个默认的vhost就是"/"。
# 创建新的vhost,{vhost_name}为新vhost的名称
rabbitmqctl add_vhost {vhost_name}
# 列出vhost的信息
# [vhostinfoitem...]指的显示信息,有两个选项:name(默认值),tracing(表示是否使用RabbitMQ的Trace功能)
rabbitmqctl list_vhosts [vhostinfoitem...]
# 删除vhost,{vhost_name}为要删除的vhost的名称
rabbitmqctl delete_vhost {vhost_name}
RabbitMQ中的权限是以vhost为单位控制的。当新建一个用户时,通常会被至少指派给一个vhost,而且只能访问被分配的vhost中的交换器、队列和绑定关系等。
# 设置权限
rabbitmqctl set_permissions [-p vhost] {user} {conf} {write} {read}
## 举两个列子
## 为rabbitmq用户设置可以对名称为test_vhost的vhost下面的资源可配置,可写,可读
rabbitmqctl set_permissions -p test_vhost rabbitmq ".*" ".*" ".*"
## 为rabbitmq用户设置可以对名称为test_vhost的vhost下面的以order开头的资源可配置,所有资源可写,所有资源可读
rabbitmqctl set_permissions -p test_vhost rabbitmq "^order.*" ".*" ".*"
vhost:授予用户访问权限的vhost名称,可以设置为默认值,即“/”
user:要授权的用户
conf:此处的值是一个正则表达式,用于匹配用户在哪些资源上拥有可配置权限。
write:此处的值是一个正则表达式,用于匹配用户在哪些资源上拥有可写入权限。
read:此处的值是一个正则表达式,用于匹配用户在哪些资源上拥有可读取权限。
# 列举vhost的权限信息,默认是"/"
rabbitmqctl list_permissions [-p vhost]
# 列举用户权限信息,{username}是用户名
rabbitmqctl list_user_permissions {username}
# 清除用户在vhost下面的权限
rabbitmqctl clear_permissions [-p vhost] {username}
# rabbitmqctl工具标准语法
rabbitmqctl [-n node] [-t timeout] [-q] {command} [command options...]
node:默认节点是"rabbit@hostname“,此处的hostname是主机名称。可以受用hostname -s查看主机名称
timeout:操作超时时间,只适用于"list_xxx"类型的命令,默认是无穷大。
q:使用-q标志来启用quiet模式,这样可以屏蔽一些消息的输出。默认不开启quiet模式。
用户管理
RabbitMQ中,用户是访问控制的基本单元,每个用户可以跨vhost授权。
# 新增用户
rabbitmqctl add_user {username} {password}
# 修改用户密码
rabbitmqctl change_password {username} {newpassword}
# 验证用户密码
rabbitmqctl authenticate_user {username} {password}
# 删除用户
rabbitmqctl delete_user {username}
# 列出所有用户,结果为用户名和用户TAG
rabbitmqctl list_users
# 设置用户标签(tag)
rabbitmqctl set_user_tags {username} {tag...}
tag主要有以下几种选项:
none:无任何角色,新建的用户默认值
management:可以访问WEB管理界面
policymaker:包含management的所有权限,并且可以管理策略(Policy)和参数(Parameter)
monitoring:包含management的所有权限,并且可以看到所有连接、信道和节点信息。
administrator:包含monitoring的所有权限,并且可管理虚拟主机、用户、权限、策略、参数等,这是最高权限。
WEB管理
WEB管理其实就是一个网页,通过这个网页可以管理RabbitMQ,本质和命令上没有什么区别,默认访问端口号是15672,这里就不说了。如果不用docker安装,需要手动开启这个插件,命令如下:
rabbitmq-plugins enable rabbitmq_management
由于我是使用Docker镜像部署的,且使用的镜像是支持该插件的,容器内部使用的端口是15672,我暴露出来的对外访问的端口也是15672。
应用管理
主要包括关闭、重置、开启服务等信息。
# 用于停止RabbitMQ服务和Erlang应用程序。
# 如果指定了pid_file,还需要等待指定进程的结束。
# pid_file是通过调用rabbitmq-server命令启动RabbitMQ服务时创建的,默认情况下存放于Mnesia目录中,可以通过RABBITMQ_PID_FILE 这个环境变量来改变存放路径。
rabbitmqctl stop [pid_file]
# 用于停止运行RabbitMQ的Erlang虚拟机和RabbitMQ服务应用。执行这个命令会阻塞直到Erlang虚拟机进程退出。
# 如果RabbitMQ没有成功关闭,则会返回一个非零值
rabbitmqctl shutdown
# 停止RabbitMQ服务,但不停止Erlang虚拟机。该命令的操作要优先于其他管理操作,比如rabbitmqctl reset
rabbitmqctl stop_app
# 启动RabbitMQ服务
rabbitmqctl start_app
# 等待RabbitMQ应用的启动。
# 它会等到pid_file的创建,然后等待pid_file中所代表的进程启动。
# 当指定的进程没有启动RabbitMQ应用而关闭时将会返回失败。
rabbitmqctl wait [pid_file]
# 将RabbitMQ节点重置还原到最初状态。
# 包括从原来所在的集群中删除此节点,从管理数据库中删除所有的配置数据,如己配置的用户、vhost等,以及删除所有的持久化消息。
# 执行rabbitmqctl reset命令前必须停止RabbitMQ应用(比如先执行rabbitmqctl stop_app)
rabbitmqctl reset
# 强制将RabbitMQ节点重置还原到最初状态。
# 不同于rabbitmqctl reset命令,rabbitmqctl force_reset命令不论当前管理数据库的状态和集群配置是什么,都会无条件地重置节点。
# 它只能在数据库或集群配置己损坏的情况下使用。
# 与rabbitmqctl reset命令一样,执行rabbitmqctl force_reset命令前必须先停止RabbitMQ应用。
rabbitmqctl force_reset
# 指示RabbitMQ节点轮换日志文件。
# RabbitMQ节点会将原来的日志文件中的内容追加到"原始名称+后缀"的日志文件中,然后再将新的日志内容记录到新创建的日志中(与原日志文件同名)。
# 当目标文件不存在时,会重新创建。如果不指定后缀suffix. 则日志文件只是重新打开而不会进行轮换。
rabbitmqctl rotate_logs {suffix}
服务端状态
服务器状态的查询会返回一个以制表符分隔的列表,listqueues、listexchanges、listbindings和listconsumers这种命令接受一个可选的vhost参数以显示其结果,默认值为 "/"。
# 此命令返回队列的详细信息,如果无[-p vhost]参数,将显示默认的vhost为 "/" 中的队列详情。
# 不指定queueinfoitem参数,则只显示name和message
rabbitmqctl list_queues [-p vhost] [queueinfoitem ...]
rabbitmqctl list_queues name durable auto_delete arguments policy pid owner_pid exclusive exclusive_consumer_pid exclusive_consumer_tag
queueinfoitem参数用于指示哪些队列的信息项会包含在结果集中,结果集的列顺序将匹配参数的顺序。queueinfoitem可以是下面列表中的任何值:
name:队列名称
durable:队列是否持久化
auto_delete:队列是否自动删除
arguments:队列的参数
policy:应用到队列上的策略名称
pid:队列关联的Erlang进程的ID
owner_pid:处理排他队列连接Erlang的进程的ID。如果是非排他队列,此值为空
exclusive:队列是否排他
exclusiveconsumerpid:订阅到此排他队列的消费者相关的信道关联的Erlang进程ID。如果此队列是非排他的,此值将为空。
exclusiveconsumertag:订阅到此排他队列的消费者的consumerTag。 如果此队列是非排他的,此值将为空。
messages_ready: 准备发送给客户端的消息个数。
messages_unacknowledged:发送给客户端但尚未应答的消息个数。
messages:准备发送给客户端和未应答消息的总和。
messagesreadyram:驻留在内存中messages_ready的消息个数。
messagesunacknowledgedram:驻留在内存中messages_unacknowledged的消息个数。
messages_ram:驻留在内存中的消息总数。
messages_persistent:队列中持久化消息的个数。对于非持久化队列来说总是0。
messages_bytes:队列中所有消息的大小总和。这里不包括消息属性或者任何其他开销
messagesbytesready:准备发送给客户端的消息的大小总和。
messagesbytesunacknowledged:发送给客户端但尚未应答的消息的大小总和。
messagesbytesram:驻留在内存中的messages_bytes。
messagesbytespersistent:队列中持久化的messages_bytes。
disk_reads:从队列启动开始,己从磁盘中读取该队列的消息总次数。
disk_writes: 从队列启动开始,己向磁盘队列写消息的总次数。
consumer:消费者数目。
consumer_utilisation:队列中的消息能够立刻投递给消费者的比率,介于0和1之间。这个受网络拥塞或者Basic.Qos的影响而小于1。
memory:与队列相关的Erlang进程所消耗的内存字节数,包括栈、堆及内部结构。
slave_pids:如果队列是镜像的,列出所有slave镜像的pid。
synchronisedslavepids: 如果队列是镜像的,列出所有己经同步的slave镜像的pid。
state: 队列状态。正常情况下是running;如果队列正常同步数据可能会有"{syncing, MsgCount}"的状态;如果队列所在的节点掉线了,则队列显示状态为down(此时大多数的queueinfoitems也将不可用)。
# 返回交换器的详细细节,如果无[-p vhost]参数,将显示默认的vhost为"/"中的交换器详情。
# 不指定exchangeinfoitem参数,只显示name和type
rabbitmqctl list_exchanges [-p vhost] [exchangeinfoitem ...]
exchangeinfoitem参数用于指示哪些交换器的信息项会包含在结果集中,结果集的列顺序将匹配参数的顺序。exchangeinfoitem可以是下面列表中的任何值:
name:交换器的名称。
type:交换器的类型。
durable:设置是否持久化。durable设置为true表示持久化,反之是非持久化。
auto_delete:设置是否自动删除。
internal:是否是内置的。
arguments:其他一些结构化参数,比如alternate-exchange。
policy:应用到交换器上的策略名称。
# 返回绑定关系的细节,如果无[-p vhost]参数,将显示默认的vhost为"/"中的绑定关系详情
# 不指定bindinginfoitem默认全显示
rabbitmqctl list_bindings [-p vhost] [bindinginfoitem ...]
bindinginfoitem参数用于指示哪些信息项会包含在结果集中,结果集的列顺序将匹配参数的顺序。bindinginfoitem可以是下面列表中的任何值:
source_name:绑定中消息来源的名称。
source_kind:绑定中消息来源的类别。
destination_name:绑定中消息目的地的名称。
destination_kind:绑定中消息目的地的种类。
routing_key:绑定的路由键。
arguments:绑定的参数。
# 返回TCP/IP连接的统计信息。
# 不指定connectionnfoitem,默认显示user、peer_host、peer_port、state
rabbitmqctl list_connections [connectionnfoitem ...]
connectionnfoitem可以是下面列表中的任何值:
pid:与连接相关的Erlang进程ID。
name:连接的名称。
port:服务器端口。
host:返回反向DNS获取的服务器主机名称,或者IP地址,或者未启用。
peerport:服务器对端端口。当一个客户端与服务器连接时,这个客户端的端口就是peerport。
peer_host:返回反向DNS获取的对端主机名称,或者IP地址,或者未启用。
ssl:是否启用SSL。
ssl_protocol:SSL协议,如tlsvl。
sslkeyexchange:SSL密钥交换算法,如rsa。
sslcipher:SSL加密算法,如aes256_cbc。
ssl_hash:SSL哈希算法,如sha
peercertsubject:对端的SSL安全证书的主题,基于RFC4514的形式。
peercertissuer:对端SSL安全证书的发行者,基于RFC4514的形式 。
peercertvalidity:对端SSL安全证书的有效期。
state:连接状态,包括starting、tuning、opening、running、flow、blocking、blocked、closing和closed这几种。
channels:该连接中的信道个数。
protocol:使用的AMQP协议的版本,当前是 {0,9,1}或者{0,8,0}。注意,如果客户端请求的是AMQP0-9的连接,RabbitMQ也会将其视为0-9-1。
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:连接建立的时间戳。
# 返回当前所有信道的信息。
# 不指定channelinfoitem,默认显示pid、user、consumer_count、messages_unacknowledged
rabbitmqctl list_channels [channelinfoitem ...]
channelinfoitem可以是下面列表中的任何值:
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:己发送但是还未确认的消息个数。如果信道不处于publisher confirm模式下,则此值为0。
perfetch_count:新消费者的Qos个数限制。0表示无上限。
globalprefetchcount:整个信道的Qos个数限制。0表示无上限。
# 列举消费者信息。
# 每行将显示由制表符分隔的己订阅队列的名称、相关信道的进程标识、consumerTag、是否需要消费端确认、prefetch_count及参数列表这些信息。
rabbitmqctl list_consumers [-p vhost]
# 显示Broker的状态
# 比如当前Erlang节点上运行的应用程序、RabbitMQ/Erlang的版本信息、os的名称、内存及文件描述符等统计信息。
rabbitmqctl status
# 对RabbitMQ节点进行健康检查,确认应用是否正常运行、list_queues、list_channels是否能够正常返回等。
rabbitmqctl node_health_check
# 显示每个运行程序环境中每个变量的名称和值。
rabbitmqctl environment
# 为所有服务器状态生成一个服务器状态报告,并将输出重定向到一个文件。
rabbitmqctl report > report.txt
# 执行任意Erlang表达式。
rabbitmqctl eval {expr}
HTTP API管理
这里就不说了,可以自行看官网。




