# 服务端状态

服务器状态查询会返回一个以制表符分隔的列表,以下命令都可以接受一个可选的 vhost 参数显示结果,默认值为 /

  • list_queues
  • list_exchanges
  • list_bindings
  • list_consumers

# 队列信息:list_queues

rabbitmqctl list_queues [p vhost] [queueinfoitem ...]
1

返回队列的详细信息。queueinfoitem 用于 设置哪些队列的信息会包含在结果集中,结果集的列顺序将匹配参数的顺序。可以是下面的人任何值:

  • name:队列名称
  • durable:队列是否持久化
  • auto_delete:队列是否自动删除
  • arguments:队列的参数
  • policy:应用到队列上的策略名称
  • pid:队列关联的 Erlang 进程的 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。
  • messages_bytes:队列中所有消息的大小总和。这里不包括消息属性或则任何其他开销。
  • message_bytes_ready:准备发送给客户端的消息的大小总和
  • message_bytes_unacknowledged:发送给客户端但尚未应答的消息的大小总和
  • message_bytes_ram:驻留在内存中的 message_bytes
  • messages_bytes_persistent:队列中持久化的 message_bytes
  • disk_reads:从队列启动开始,已从磁盘中读取该队列的消息总次数
  • disk_writes:从队列启动开始,已向磁盘队列写消息的总次数
  • consumer:消费者数目
  • consumer_utilisation:队列中的消息能够立刻投递给消费者的比率。介于 0 和 1 之间。受网络拥塞或则 Basic.Qos 的影响而小于 1.
  • memory:与队列相关的 Erlang 进程所消耗的内存字节数,包括栈、堆及内部结构
  • slave_pids:如果队列是镜像的,列出所有 slave 镜像的 pid
  • synchronised_slave_pids:如果队列是镜像的,列出所有已经同步的 slave 镜像的 pid
  • state:队列状态
    • running:运行中
    • syncing、MsgCount:队列正常同步数据库可能的状态
    • down:如果队列所在的节点掉线了,则显示 down。此时大多数的 queueinfoitems 也将不可用

如果没有指定 queueinfoitems ,则显示队列的名称和消息的个数。例如:

# 默认显示队列名称和消息个数
[root@study rabbitmq]# rabbitmqctl list_queues
Listing queues
queue_demo      205

[root@study rabbitmq]# rabbitmqctl list_queues name durable auto_delete arguments -q
queue_demo      true    false   []

1
2
3
4
5
6
7
8

# 交换器信息 list_exchanges

rabbitmqctl list_exchanges [-p vhost] {exchangeinfoitem...}
1

exchangeinfoitem 可以指定以下值:

  • name:交换器名称
  • type:交换器类型
  • durable:是否持久化
  • auto_delete:是否自动删除
  • internal:是否是内置的
  • arguments:其他一些结构化参数,比如 alternate-exchange
  • policy:应用到交换器上的策略名称

exchangeinfoitem 的内容和客户端中的 channel.exchangeDeclare 方法的参数基本一致。如果没有指定 exchangeinfoitem 则默认显示交换器的名称和类型,例如:

[root@study rabbitmq]# rabbitmqctl list_exchanges
Listing exchanges
amq.topic       topic
amq.direct      direct
amq.headers     headers
amq.match       headers
amq.rabbitmq.log        topic
amq.rabbitmq.trace      topic
exchange_demo   direct
amq.fanout      fanout
       		    direct
       		    

[root@study rabbitmq]# rabbitmqctl list_exchanges name type durable auto_delete internal arguments policy -q
amq.topic       	topic   true    false   false   []
amq.direct      	direct  true    false   false   []
amq.headers     	headers true    false   false   []
amq.match       	headers true    false   false   []
amq.rabbitmq.log    topic   true    false   true    []
amq.rabbitmq.trace  topic   true    false   true    []
exchange_demo   	direct  true    false   false   []
amq.fanout      	fanout  true    false   false   []
        			direct  true    false   false   []

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

# 绑定关系信息:list_bindings

rabbitmqctl list_bindings [-p vhost] [bindinginfoitem...]
1

bindinginfoitem 可以包含如下的值:

  • source_name:绑定中消息来源的名称
  • source_kind:绑定中消息来源的类别
  • destination_name:绑定中消息目的地名称
  • destination_kind:绑定中消息目的地的种类
  • routing_key:绑定的路由键
  • arguments:绑定的参数

如果没有指定 bindinginfoitem ,则显示所有信息

[root@study rabbitmq]# rabbitmqctl list_bindings
Listing bindings
				exchange        queue_demo      queue   		queue_demo  []
exchange_demo   exchange        queue_demo      queue   	routingky_demo  []
1
2
3
4

第一行:默认的交换器与队列 queue_demo 通过 queue_demo 绑定

第二行:交换器 exchange_demo 和队列 queue_demo 通过 routingky_demo 进行绑定。

# TCP/IP 连接统计信息:list_connections

rabbitmqctl list_connections [connectioninfoitem ...]
1

返回 TCP/IP 连接统计信息。connectioninfoitem 可以包含如下值:

  • pid:与连接相关的 Erlang 进程 ID

  • name:连接的名称

  • port:服务器端口

  • host:返回反向 DNS 获取的服务器主机名称,或则 IP 地址,或则未启用

  • peer_port:服务器对端端口。当一个客户端与服务器连接时,这个客户端的端口就是 peer_port

  • peer_host:返回反向 DNS 获取的对端主机名称,或则 IP 地址,或则未启用

  • ssl:是否启用 SSL

  • ssl_protocol:SSL 协议,如 tlsvl

  • 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-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:链接建立的时间戳

如果么有指定 connectioninfoitem ,那么默认显示 user、peer_host、peer_port 和 state 信息

[root@study rabbitmq]# rabbitmqctl list_connections
Listing connections
admin   192.168.4.170   52397   running

# 自定义显示
[root@study rabbitmq]# rabbitmqctl list_connections pid name host -q
<rabbit@study.3.1744.0>   192.168.4.170:52434 -> 192.168.4.250:5672       192.168.4.250

1
2
3
4
5
6
7
8

# 信道信息:list_channels

rabbitmqctl list_channels [channelinfoitem ...]
1

返回当前所有信息信息。 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 标识无上限
  • global_perfetch_count:整个信道的 Qos 个数限制。0 表示无上限

如果没有指定 channelinfoitem ,则显示:pid、user、consumer_count 、messages_unacknowledged

# 默认信息
[root@study rabbitmq]# rabbitmqctl list_channels
Listing channels
<rabbit@study.3.1833.0> admin   1       3

# 自定义信息
[root@study rabbitmq]# rabbitmqctl list_channels pid connection -q
<rabbit@study.3.1854.0> <rabbit@study.3.1846.0>

1
2
3
4
5
6
7
8
9

# 消费者信息:list_consumers

rabbitmqctl list_consumers [ -p vhost]
1

显示消费者信息。每行将显示队列名称、相关信道的进程标识、consumerTag、是否需要消费端确认、prefetch_count 以及参数列表信息。

[root@study rabbitmq]# rabbitmqctl list_consumers
Listing consumers
queue_demo      <rabbit@study.3.1876.0> amq.ctag-1XZgy5ShO6X6e1qi7NQnTQ true    3       []

1
2
3
4

# Broker 状态:status

rabbitmqctl status
1

显示 Broker 状态,信息很多,例如有:Erlang 节点上运行的应用程序、RabbitMQ/Erlang 的版本信息、OS 名称、内存文件描述符等统计信息

# 健康检查:node_health_check

rabbitmqctl node_health_check
1

对 RabbitMQ 节点进行健康检查,确认应用是否在很长运行、list_queues 和 list_channels 是否能够正常返回等。

例如:

[root@study rabbitmq]# rabbitmqctl node_health_check
Timeout: 70.0 seconds
Checking health of node rabbit@study
Health check passed
1
2
3
4

# 环境变量:environment

显示每个运行程序环境中的变量和值

rabbitmqctl environment
1

返回信息很多,例如:

[root@study rabbitmq]# rabbitmqctl environment
Application environment of node rabbit@study
[{amqp_client,[{prefer_ipv6,false},{ssl_options,[]}]},
 {asn1,[]},
 {compiler,[]},
 {cowboy,[]},
 {cowlib,[]},
 {crypto,[]},
 {inets,[]},
....
1
2
3
4
5
6
7
8
9
10

# 服务器状态报告:report

为所有服务器状态生成一个服务器状态报告,并将输出从定向到一个文件。

rabbitmqctl report > report.txt
1

这个信息也是有很多的。例如:

[root@study ~]# cat report.txt
Reporting server status on {{2020,6,29},{0,21,37}}


Status of node rabbit@study
[{pid,20378},
 {running_applications,
...
1
2
3
4
5
6
7
8

# 执行 Erlang 表达式:eval

rabbitmqctl eval {expr}
1

执行任意 Erlang 表达式。

例如:返回 rabbitmqctl 连接的节点名称

[root@study ~]# rabbitmqctl eval 'node().'
rabbit@study
1
2

# eval 的扩展知识

用户、Parameter、vhost、权限等都可以通过 rabbitmqctl 工具来完成创建/删除操作。

交换器、队列及绑定关系的创建/删除操作没有相应的工具 来完成。到目前为止的介绍,只有通 过客户端Web 管理界面 来完成。

但是可以通过 rabbitmqctl eval {expr} 的方式来实现创建交换器、队列及绑定关系。

下面的命令:创建一个交换器 exchange2、一个队列 queue2 ,并通过绑定建 rk2 进行绑定

rabbitmqctl eval 'rabbit_exchange:declare({resource,<<"/">>,exchange,<<"exchange2">>},direct,true,false,false,[]).'
rabbitmqctl eval 'rabbit_amqqueue:declare({resource,<<"/">>,queue,<<"queue2">>},true,false,[],none).'
rabbitmqctl eval 'rabbit_binding:add({binding,{resource,<<"/">>,exchange,<<"exchange2">>},<<"rk2">>,{resource,<<"/">>,queue,<<"queue2">>},[]}).'
1
2
3

执行之后,查看绑定关系就看到如下信息

  [root@study ~]# rabbitmqctl list_bindings
Listing bindings
                exchange        queue2  		queue   queue2  		[]
                exchange        queue_demo      queue   queue_demo      []
exchange2       exchange        queue2  		queue   rk2     		[]
exchange_demo   exchange        queue_demo      queue   routingky_demo  []
[root@study ~]#

1
2
3
4
5
6
7
8

这里其实是调用了 Erlang 中对应模块的相应函数。语法类似 Module:Function(Arg).

# 删除交换器
rabbitmqctl eval 'rabbit_exchange:delete({resource,<<"/">>,exchange,<<"exchange2">>},false).'

# 删除队列
rabbitmqctl eval 'rabbit_amqqueue:internal_delete({resource,<<"/">>,queue,<<"queue2">>}).'

# 删除绑定关系
rabbitmqctl eval 'rabbit_binding:remove({binding,{resource,<<"/">>,exchange,<<"exchange2">>},<<"rk2">>,{resource,<<"/">>,queue,<<"queue2">>},[]}).'
1
2
3
4
5
6
7
8