RabbitMQ管理
运行RabbitMQ
rabbitmq-server -detached #detached以守护进程方式在后台运行
rabbitmqctl status #查看服务状态
rabbitmqctl cluster_status #查看集群信息
用户和权限
默认用户用户名及密码均为guest 该帐户只能通过本地网络访问,远程网络访问受限
#添加新用户root:root123
rabbitmqctl add_user root root123
#为root用户配置所有权限
rabbitmqctl set_permissions -p / root ".*" ".*" ".*"
#提升root为管理员
rabbitmqctl set_user_tags root administrator
多租户与权限
虚拟主机virtual host,简称vhost
vhost间是绝对隔离的
rabbitmqctl add_vhost {vhost}
rabbitmqctl add_vhost dong显示vhost
rabbitmqctl list_vhosts [vhostinfoitem...] #可选值为name tracing
rabbitmqctl list_vhosts
rabbitmqctl list_vhosts name tracing
rabbitmqctl trace_on #开启/的trace删除vhost
#删除一个vhost同时会删除其下的所有队列、交换器、绑定关系、用户权限、参数和策略
rabbitmqctl delete_vhost vhost1
MQ中权限以vhost为单位
授权命令
rabbitmqctl set_permissions [-p vhost] {user} {conf} {write} {read}
#conf,write,read分别为匹配用户可配置,可写,可读权限的正则表达式
#可配置:队列和交换器的创建、删除
#可写:发布消息
#可读:与消息有关的操作,读取消息、清空队列等
rabbitmqctl list_users
rabbitmqctl set_permissions -p dong root "^queue.*" ".*" ".*"显示用户权限
rabbitmqctl list_permissions [-p vhost]
rabbitmqctl list_user_permissions {username}
rabbitmqctl -p dong list_permissions
rabbitmqctl list_permissions -p dong清除权限
rabbitmqctl clear_permissions [-p vhost] {username}
rabbitmqctl clear_permissions -p dong root
rabbitmqctl工具标准语法:[]表示可选参数 {}表示必选参数
rabbitmqctl [-n node] [-t timeout] [-q] {command} [command options...]
[-n node],默认节点是rabbit@hostname,hostname是主机名
[-q],启用quiet模式
[-t timeout],超时时间,秒,只适用list_xxx类型的命令
用户管理
单个用户可以跨多个vhost进行授权
创建用户
rabbitmqctl add_user root root123更新密码
rabbitmqctl change_password {username} {newpassword}清除密码
rabbitmqctl clear_password {username} #清除后用户不能使用密码登录通过密码验证用户
rabbitmqctl authenticate_user {username} {password}删除用户
rabbitmqctl delete_user {username}查询用户
rabbitmqctl list_users
#会显示用户角色tags
#none,无任何角色,新创建的用户默认为none
#management,可以访问web管理页面
#policymaker,包含management权限,并可以管理策略policy和参数parameter
#monitoring,包含management权限,并可看到所有连接、信道及节点相关信息
#administrator,最高权限,可以管理用户、虚拟主机、权限、策略、参数等设置用户角色
rabbitmqctl set_user_tags {username} {tag ...} #设置后任何之前的身份都会被删除
rabbitmqctl set_user_tags admin policymaket monitoring
Web端管理
启用RabbitMQ management插件,RabbitMQ提供很多插件,默认存放于$RABBITMQ_HOME/plugins目录下
rabbitmq-plugins语法:
rabbitmq-plugins [-n node] {command} [command options...]
启用插件:
rabbitmq-plugins enable [plugin-name]
关闭插件:
rabbitmq-plugins disable [plugin-name]启用management插件
rabbitmq-plugins enable rabbitmq_management查看插件启用情况
rabbitmq-plugins list
#[E*]为显示启动 [e*]为隐式启动
应用与集群管理
应用管理
rabbitmqctl stop [pid_file]
若使用rabbitmq-server -detach这个命令启动RabbitMQ,则不会生成pid_file
rabbitmqctl shutdown #阻塞直到erlang虚拟机进程退出
rabbitmqctl stop_app 停止MQ服务,但不停止Erlang虚拟机
rabbitmqctl reset #重置MQ,删除所有,恢复到初始状态
#从原来所在集群中删除此节点,从管理数据库中删除所有的配置数据,如用户、vhost,删除所有持久化消息
#执行reset前密码停止MQ应用
rabbitmqctl force_reset 强制重置还原到最初状态,执行前需要停止MQ应用
rabbitmqctl start_app
rabbitmqctl wait [pid_file] 等待MQ应用的启动,会等到pid_file的创建,然后等待pid_file中所代表的进程启动
rabbitmqctl rotate_logs {suffix} 指示轮换日志文件,suffix为日志文件后缀
集群管理
#将节点加入指定集群,执行前需要停止MQ应用并重置节点
rabbitmqctl join_cluster {cluster_node} [--ram]
#显示集群状态
rabbitmqctl cluster_status
#修改集群节点类型,执行前需要停止MQ应用
rabbitmqctl change_cluster_node_type {disc|ram}
#将节点从集群中删除,允许离线执行
rabbitmqctl forget_cluster_node [--offline]
#在集群节点应用启动前咨询clusternode节点的最新信息,并更新相应的集群信息,但不加入集群
rabbitmqctl update_cluster_nodes {clusternode}
#无条件的启动节点
rabbitmqctl force_boot
#指示未同步队列queue的slave镜像可以同步master镜像的内容,同步期间队列会被阻塞,直到同步完成
rabbitmqctl sync_queue [-p vhost] {queue}
#取消队列queue同步镜像的操作
rabbitmqctl cancel_sync_queue [-p vhost] {queue}
#设置集群名称
rabbitmqctl set_cluster_name {name}
服务端状态
#显示队列详细信息
rabbitmqctl list_queues [-p vhost] [queueinfoitem...]
其中queueinfoitem包含的值如下:
name,队列名称
durable,队列是否持久化
auto_delete,是否自动删除
arguments,队列参数
policy,应用到队列上的策略名称
pid,队列关联的Erlang进程ID
owner_pid,处理排他队列连接的Erlang进程ID,若此队列是非排他的,则值为空
exclusive,队列是否排他
exclusive_sonsumer_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,队列中所有消息大小总和(不包括消息属性和其他开销)
messages_bytes_ready messages_bytes_unacknowledged messages_bytes_ram messages_bytes_persistent
disk_reads,从队列启动开始,已从磁盘中读取该队列消息总次数
disk_writes,从队列启动开始,已向磁盘写入消息总次数
consumer,消费者数目
consumer_utilisation,能立刻投递给消费者的比率
memory,与队列相关的Erlang进程所消耗内存字节数,包括栈、堆及内部结构
slave_pids,镜像队列,列出所有slave镜像的pid
synchronised_slave_pids,镜像队列,列出所有已同步的slave镜像pid
state,队列状态
默认无参数显示队列名称和消息个数#显示交换器详细信息
rabbitmqctl list_exchanges [-p vhost] [exchangeinfoitem...]
name,交换器名称
type,类型
durable,是否持久化
auto_delete,是否自动删除
internal,是否是内置的
arguments,其他一些结构化参数,如alternate-exchange
policy,应用到交换器上的策略#显示绑定关系
rabbitmqctl list_bindings [-p vhost] [bindinginfoitem...]
source_name,绑定中消息来源
source_kind,来源的类型
destination_name,目的名称
destination_kind,目的类型
routing_key,绑定的路由键,默认没有名称的交换器会绑定所有队列,且路由键为队列名称
arguments,绑定的参数
#显示连接信息
rabbitmqctl list_connections [connectioninfoitem...]
返回TCP/IP连接统计信息
pid,与连接相关的Erlang进程ID
name,连接的名称
port,服务器的端口
host,反向DNS获取的服务器主机名称或者IP地址,或者未启用
peer_port,对端端口,客户端的端口
peer_host,客户端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}
auth_mechanism,使用的SASL认证机制,如PLAIN/AMQPLAIN/EXTERNAL/BABBIT-CR-DEMO等
user,与连接相关的用户
vhost,与连接相关的vhost
timeout,连接超时/协商的心跳间隔,秒
frame_max,最大传输的帧大小,单位B
channel_max,此连接上信道的最大数量,若为0表示无上限
client_properties,在建立连接期间由客户端发送的信息属性
recv_oct,收到的字节数
recv_cnt,收到的数据包个数
send_oct,发送的字节数
send_cnt,发送的数据包个数
send_pend,发送队列大小
connected_at,连接建立的时间戳
默认显示user、peer_host、peer_port、state这几项
#显示信道信息
rabbitmqctl list_channels [channelinfiitem...]
pid,与连接相关的Erlang进程ID
connection,信道所属的连接的Erlang进程ID
name,信道名称
number,信道序号
user,与信道相关的用户名称
vhost,与信道相关的vhost
transactional,信道是否处于事务模式
consumer_count,信道中消费者个数
messages_unacknowledged,已投递但未ack的消息个数
messages_uncommitted,已接收但还未提交事务的消息个数
acks_uncommitted,已ack收到,但还未提交事务的消息个数
messages_unconfirmed,已发送但未确认消息个数,若信道未处于publisher confirm模式下,此值为0
perfetch_count,新消费者的Qos个数限制,0表示不限
global_prefetch_count,整个信道的Qos个数限制,0表示不限
默认显示pid,user,consumer_count、messages_unacknowledged这几项
#显示消费者信息
rabbitmqctl list_consumers [-p vhost]
已订阅队列名称、相关信道进程标识、consumerTag、是否需要消费端确认、prefetch_count、参数列表
#显示Broker状态
rabbitmqctl status
当前Erlang节点上运行的应用程序、版本、OS名称、内存及文件描述符等信息
#节点健康检查
rabbitmqctl node_health_check
#运行环境
rabbitmqctl environment
显示程序环境中每个变量的名称和值
#服务器状态报告
rabbitmqctl report
为所有服务器状态生成状态报告
#执行任意表达式
rabbitmqctl eval {expr}
执行Erlang表达式,如rabbitmqctl eval 'node().' #返回rabbitmqctl连接的节点的名称
用户、Parameter、vhost、权限等要以通过rabbitmqctl创建和删除;交换器、队列、绑定关系的创建和删除没有相关的rabbitmqctl命令
曲线救国方案:
#创建名称为exchange2的交换器
rabbitmqctl eval 'rabbit_exchange:declare({resource,<<"/">>,exchange,<<"exchange2">>},direct,true,false,false,[]).'
##declare(XName,Type,Durable,AutoDelete,Internal,Args).
##XName,交换器命名细节,{resource,VHost,exchange,Name}
##Type,类型,direct、headers、topic、fanout
##Durable,持久化;AutoDelete,自动删除;Internal,是否为内置交换器;Args,参数
##删除rabbitmqctl eval 'rabbit_exchange:delete({resource,<<"/">>,exchange,<<"exchange2">>},false).'
#创建名称为queue2的队列
rabbitmqctl eval 'rabbit_amqqueue:declare({resource,<<"/">>,queue,<<"queue2">>},true,false,[],none).'
##declare(QueueName,Durable,AutoDelete,Args,Owner).
##QueueName,队列命名细节,{resource,VHost,queue,Name}
##Owner,队列的独占模式,一般为none,排他
##删除rabbitmqctl eval 'rabbit_amqqueue:internal_delete({resource,<<"/">>,queue,<<"queue2">>}).'
#将交换器exchange2与队列queue2绑定,路由键为rk2
rabbitmqctl eval 'rabbit_binding:add({binding,{resource,<<"/">>,exchange,<<"exchange2">>},<<"rk2">>,{resource,<<"/">>,queue,<<"queue2">>},[]}).'
##add({binding,Source,Key,Destination,Args}).
##删除rabbitmqctl eval 'rabbit_binding:remove({binding,{resource,<<"/">>,exchange,<<"exchange2">>},<<"rk2">>,{resource,<<"/">>,queue,<<"queue2">>},[]}).'
若要删除所有的交换器、队列及绑定关系,只需要删除对应的vhost就可以一键搞定
HTTP API接口管理
RabbitMQ Management插件不仅提供Web管理界面,还提供了HTTP API接口
POST方法创建的是无法用具体名称的资源,如绑定和发布消息等
创建名为queue33的队列
%2F是默认vhost:/的转义
curl -i -u admin:admin -H"content-type:application/json" -XPUT -d'{"auto_delete":false,"durable":true,"node":"rabbit@localhost"}' http://127.0.0.1:15672/api/queues/%2F/queue33
获取队列queue33的信息
curl -i -u admin:admin -XGET http://127.0.0.1:15672/api/queues/%2F/queue33
删除队列queue33
curl -i -u admin:admin -XDELETE http://127.0.0.1:15672/api/queues/%2F/queue33
向交换器exchange2发送一条消息
curl -i -u admin:admin -XPOST -d'{"properties":{},"routing_key":"rk2","payload":"my_body","payload_encoding":"string"}' http://127.0.0.1:15672/api/exchanges/%2F/exchange2/publish
清空队列queue2
curl -i -u admin:admin -XDELETE http://127.0.0.1:15672/api/queues/%2F/queue2/contents
从队列中消费消息
curl -i -u admin:admin -XPOST -d'{"count":5,"requeue":false,"encoding":"auto","truncate":50000}' http://127.0.0.1:15672/api/queues/%2F/queue2/get
#获取到的结果[{"payload_bytes":7,"redelivered":false,"exchange":"exchange2","routing_key":"rk2","message_count":0,"properties":[],"payload":"my_body","payload_encoding":"string"}]
#count表示最大能获取的消息个数
#requeue表示获取到消息后,消息是否从队列中删除,为true不删除,但会设置redelivered标识会被设置
#encoding表示编码格式,auto或base64
#truncate,可选参数,如果消息payload超过指定大小会被截断
健康检查
GET /api/healthchecks/node
#正常返回{"status":"ok"},异常返回{"status":"failed","reason":"string"} 返回码均为200获取HTTP API接口列表 GET /api/ 类似帮助文档
rabbitmqadmin工具
rabbitmqadmin是management插件提供的功能,包装了HTTP API接口,更易于使用
位置:/opt/rabbitmq/var/lib/rabbitmq/mnesia/rabbit@localhost-plugins-expand/rabbitmq_management-3.6.15/priv/www/cli/rabbitmqadmin
下载:wget http://127.0.0.1:15672/cli/rabbitmqadmin
#rabbitmqadmin需要python的支持
chmod +x rabbitmqadmin
#创建队列queue1
./rabbitmqadmin -u admin -p admin declare queue name=queue1
#显示队列
./rabbitmqadmin list queues
#删除队列
./rabbitmqadmin -u admin -p admin delete queue name=queue1
#其它常用命令
./rabbitmqadmin -V / list exchanges
#列出所有交换器
./rabbitmqadmin list queues / name queue2 messages message_stats.publish_details.rate
./rabbitmqadmin declare exchange name=my-new-exchange type=fanout
#创建交换器
./rabbitmqadmin publish exchange=exchange2 routing_key=rk2 payload="hello world"
#发送消息
./rabbitmqadmin get queue=queue2 requeue=false
#接收消息
./rabbitmqadmin export rabbit.definitions.json
#导出配置
./rabbitmqadmin -q import rabbit.definitions.json
#导入配置
#关闭所有连接
./rabbitmqadmin -f tsv -q list connections name | while read conn ; do ./rabbitmqadmin -q close connection name="${conn}" ; done
参数及策略
运行时参数可以通过rabbitmqctl工具或者management插件的http api接口进行修改
vhost级别的Parameter由一个组件名称component name、名称name、值value组成;global级别的参数,由名称和值组成。二者的值都是JSON类型的
vhost级别的参数对应的rabbitmqctl命令有三种:set_parameters、list_parameters、clear_patameter
**#设置参数**
rabbitmqctl set_parameters [-p vhost] {component_name} {name} {value}
rabbitmqctl list_parameters
rabbitmqctl set_parameters federation-upstream f1 '{"uri":"amqp://root:root123@192.168.0.2:5672\",\"ack-mode\":\"on-confirm\"}'
**#显示参数**
rabbitmqctl list_parameters [-p vhost]
**#消除参数**
rabbitmqctl clear_parameter [-p vhost] {componenet_name} {key}
rabbitmqctl clear_parameter -p / federation-upstream f1
HTTP API接口:
**#设置参数**
PUT /api/parameters/{component_name}/vhost/name
**#清除参数**
DELETE /api/parameters/{componenet_name}/vhost/name
**#显示参数**
GET /api/parameters
[图片上传失败...(image-a96fb4-1592387009197)]
客户端创建交换器或者队列时可设置一些参数,如x-message-ttl、x-expires、x-max-length等,这些参数一但创建就不能删除,只能删除交换器或队列重新创建。为解决这个问题,可以引入Policy,它是一种特殊的Parameter用法,Policy是vhost级别的,一个Policy可以匹配一个或多个队列,或者交换器。Policy支持动态修改一些属性参数。通常Policy用来配置Federation、镜像、备份交换器、死信等功能。
pattern,正则匹配,匹配相关的队列或交换器
apply to,指定policy作用于哪一方,可以是队列、交换器、或同时
priority,定义优先级,若有多个policy作用于同一个交换品茶或者队列,那么priority最大的那个policy才起作用
**#设置policy**
rabbitmqctl set_policy [-p vhost] [--priority priority] [--apply-to apply-to] {name} {pattern} {definition}
其中name pattern definition是必填项
#设置默认vhost中所有以^amp.开头的交换器为联邦交换器
rabbitmqctl set_policy --apply-to exchanges --priority 1 p1 "^amp." '{"federation-upstream":"f1"}'
curl -i -u admin:admin -XPUT -d'{"pattern":"^amq\.","definition":{"federation-upstream":"f11"},"priority":1,"apply-to":"exchanges"}' http://127.0.0.1:15672/api/policies/%2F/p12
**#显示policy**
rabbitmqctl list_policies [-p vhost]
curl -i -u admin:admin -XGET http://127.0.0.1:15672/api/policies/%2F
**#消除policy**
rabbitmqctl clear_policy [-p vhost] {name}
rabbitmqctl clear_policy p12
curl -i -u admin:admin -XDELETE http://127.0.0.1:15672/api/policies/%2F/p12
若两个或者多个policy都作用到同一交换器或队列上,且这些policy优先级都一样,则参数项最多的policy具有决定权;若参数一样多,则最后添加的policy具有决定权