前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >RabbitMQ服务管理

RabbitMQ服务管理

作者头像
shysh95
发布2019-07-23 09:54:11
1.3K0
发布2019-07-23 09:54:11
举报
文章被收录于专栏:shysh95

本文主要讲解以下内容:

  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管理

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-04-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员修炼笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 多租户与权限
  • 用户管理
  • WEB管理
  • 应用管理
  • 服务端状态
  • HTTP API管理
相关产品与服务
SSL 证书
腾讯云 SSL 证书(SSL Certificates)为您提供 SSL 证书的申请、管理、部署等服务,为您提供一站式 HTTPS 解决方案。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档