RabbitMQ服务管理

2019-07-23 09:54:11 浏览数 (1)

本文主要讲解以下内容:

  1. 多租户与权限
  2. 用户管理
  3. 服务管理
  4. 应用管理
  5. HTTP API管理

本文针对的主要是RabbitMQ服务管理,可以当做一个命令手册进行查阅。在本文章开始之间,我们先通过Docker来简单启动一个RabbitMQ服务实例。

代码语言:javascript复制
# 拉取镜像docker pull rabbitmq:management# 启动RabbitMQ服务实例,指定应用程序的访问和对外暴露端口为5672,WEB管理界面的访问和对外暴露端口为15672docker 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就是"/"。

代码语言:javascript复制
# 创建新的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中的交换器、队列和绑定关系等。

代码语言:javascript复制
# 设置权限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:此处的值是一个正则表达式,用于匹配用户在哪些资源上拥有可读取权限。
代码语言:javascript复制
# 列举vhost的权限信息,默认是"/"rabbitmqctl list_permissions [-p vhost]# 列举用户权限信息,{username}是用户名rabbitmqctl list_user_permissions {username}# 清除用户在vhost下面的权限rabbitmqctl clear_permissions [-p vhost] {username}
代码语言:javascript复制
# 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授权。

代码语言:javascript复制
# 新增用户rabbitmqctl add_user {username} {password}# 修改用户密码rabbitmqctl change_password {username} {newpassword}# 验证用户密码rabbitmqctl authenticate_user {username} {password}# 删除用户 rabbitmqctl delete_user {username}# 列出所有用户,结果为用户名和用户TAGrabbitmqctl list_users 
代码语言:javascript复制
# 设置用户标签(tag)rabbitmqctl set_user_tags {username} {tag...}

tag主要有以下几种选项:

  • none:无任何角色,新建的用户默认值
  • management:可以访问WEB管理界面
  • policymaker:包含management的所有权限,并且可以管理策略(Policy)和参数(Parameter)
  • monitoring:包含management的所有权限,并且可以看到所有连接、信道和节点信息。
  • administrator:包含monitoring的所有权限,并且可管理虚拟主机、用户、权限、策略、参数等,这是最高权限。

WEB管理

WEB管理其实就是一个网页,通过这个网页可以管理RabbitMQ,本质和命令上没有什么区别,默认访问端口号是15672,这里就不说了。如果不用docker安装,需要手动开启这个插件,命令如下:

代码语言:javascript复制
rabbitmq-plugins enable rabbitmq_management

由于我是使用Docker镜像部署的,且使用的镜像是支持该插件的,容器内部使用的端口是15672,我暴露出来的对外访问的端口也是15672。

应用管理

主要包括关闭、重置、开启服务等信息。

代码语言:javascript复制
# 用于停止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 resetrabbitmqctl 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参数以显示其结果,默认值为 "/"。

代码语言:javascript复制
# 此命令返回队列的详细信息,如果无[-p vhost]参数,将显示默认的vhost为 "/" 中的队列详情。# 不指定queueinfoitem参数,则只显示name和messagerabbitmqctl 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也将不可用)。
代码语言:javascript复制
# 返回交换器的详细细节,如果无[-p vhost]参数,将显示默认的vhost为"/"中的交换器详情。# 不指定exchangeinfoitem参数,只显示name和typerabbitmqctl list_exchanges [-p vhost] [exchangeinfoitem ...]

exchangeinfoitem参数用于指示哪些交换器的信息项会包含在结果集中,结果集的列顺序将匹配参数的顺序。exchangeinfoitem可以是下面列表中的任何值:

  • name:交换器的名称。
  • type:交换器的类型。
  • durable:设置是否持久化。durable设置为true表示持久化,反之是非持久化。
  • auto_delete:设置是否自动删除。
  • internal:是否是内置的。
  • arguments:其他一些结构化参数,比如alternate-exchange。
  • policy:应用到交换器上的策略名称。
代码语言:javascript复制
# 返回绑定关系的细节,如果无[-p vhost]参数,将显示默认的vhost为"/"中的绑定关系详情# 不指定bindinginfoitem默认全显示rabbitmqctl list_bindings [-p vhost] [bindinginfoitem ...]

bindinginfoitem参数用于指示哪些信息项会包含在结果集中,结果集的列顺序将匹配参数的顺序。bindinginfoitem可以是下面列表中的任何值:

  • source_name:绑定中消息来源的名称。
  • source_kind:绑定中消息来源的类别。
  • destination_name:绑定中消息目的地的名称。
  • destination_kind:绑定中消息目的地的种类。
  • routing_key:绑定的路由键。
  • arguments:绑定的参数。
代码语言:javascript复制
# 返回TCP/IP连接的统计信息。# 不指定connectionnfoitem,默认显示user、peer_host、peer_port、staterabbitmqctl 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:连接建立的时间戳。
代码语言:javascript复制
# 返回当前所有信道的信息。# 不指定channelinfoitem,默认显示pid、user、consumer_count、messages_unacknowledgedrabbitmqctl 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表示无上限。
代码语言:javascript复制
# 列举消费者信息。# 每行将显示由制表符分隔的己订阅队列的名称、相关信道的进程标识、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管理

这里就不说了,可以自行看官网。

0 人点赞