一、多租户和权限
每一个RabbitMQ 服务器都能创建虚拟的消息服务器,我们称之为虚拟主机( virtual host),简称为vhost 。每一个vhost 本质上是一个独立的小型RabbitMQ 服务器,拥有自己独立的队列、交换器及绑定关系等,井且它拥有自己独立的权限。vhost 之间是绝对隔离的,无法将vhostl 中的交换器与vhost2 中的队列进行绑定,这样既保证了安全性,又可以确保可移植性。如果在使用RabbitMQ 达到一定规模的时候,建议用户对业务功能、场景进行归类区分,并为之分配独立的vhost。
RabbitMQ 默认创建的vhost 为“/”,如果不需要多个vhost ,那么使用默认的用户名guest 和密码guest 就可以访问它。但是为了安全和方便,建议重新建立一个新的用户来访问它。
rabbitmqctl 工具是用来管理RabbitMQ 中间件的命令行工具,它通过连接各个RabbitMQ 节点来执行所有操作。
-
rabbitmqctl [ -n node] [-t timeout] [-q] {command) [command options ... ][-n node]
[-q]
使用-q 标志来启用quiet 模式,这样可以屏蔽一些消息的输出。默认不开启quiet 模式。
[ - t timeout]
操作超时时间(秒为单位),只适用于“ list_xxx ”类型的命令,默认是无穷大。 -
可以使用
rabbitmqctl add_vhost {vhost}
命令创建一个新的vhost ,大括号里的参数表示vhost 的名称。
命令示例:rabbitmqctl add_vhost testvhost
控制台的情况:
-
可以使用
rabbitmqctl list_vhosts [vhostinfoitem ... ]
来罗列当前vhost 的相关信息。目前vhostinfoitem 的取值有2 个:name :默认值,表示vhost 的名称;tracing :表示是否使用了RabbitMQ 的trace 功能。
命令示例:rabbitmqctl list_vhosts name tracing
-
删除vhost 的命令是:
rabbitmqctl delete_vhost {vhost }
命令示例:rabbitmqctl delete_vhost testvhost
-
授予权限命令为:
rabbitmqctl set_permissions [-p vhost] {user}{conf} {write} {read}
vhost :授予用户访问权限的vho st 名称,可以设置为默认值,即vhost 为“/,,
user : 可以访问指定vhost 的用户名。
conf : 一个用于匹配用户在哪些资源上拥有可配置权限的正则表达式。
write :一个用于匹配用户在哪些资源上拥有可写权限的正则表达式。
read : 一个用于匹配用户在哪些资源上拥有可读权限的正则表达式。
授予root 用户可访问虚拟主机testvhost ,并在所有资源上都具备可配置、可写及可读的权限,示例如下:
rabbitmqctl set_permissions -p testvhost root ".*" ".*" ".*"
授予root 用户可访问虚拟主机testvhost , 在以“ queue ”开头的资源上具备可配置权限,并在
所有资源上拥有可写、可读的权限, 示例如下:
rabbitmqctl set_permissions -p testvhost root " ^queue.*" ".*" ".*"
- 清除权限也是在vhost 级别对用户而言的:
clear_permissions [-p vhost] {username}
rabbitmqctl clear_permissions -p testvhost root
- 在RabbitMQ 中有两个Shell 命令可以列举权限信息。第一个命令是
rabbitmqctl list_permissions [-p vhost]
,用来显示虚拟主机上的权限;
第二个命令是rabbitmqctl list_user_permissions {username}
,用来显示用户的权限。
根据下图可知guest拥有"/"下的所有资源的所有权限。
二、用户管理
以下命令比较简单,不做赘述:
- 添加用户:
rabbitmqctl add_user {username} {password}
- 修改用户密码:
rabbitmqctl change_password {username} {newpassword}
- 清除用户密码(这样用户就不能使用密码登录):
rabbitmqctl clear_password {username}
- 验证用户密码:
rabbitmqctl authenticate_user {userηame} {password}
- 删除用户:
rabbitmqctl delete_user {username}
- 罗列当前的所有用户(每个结果行都包含用户名称,其后紧跟用户的角色):
rabbitmqctl list_users
用户的角色分为5 种类型:
none : 无任何角色。新创建的用户的角色默认为no 口e 。
1.management:可以访问Web 管理页面。Web 管理页面在5.3 节中会有详细介绍。
2.policymaker :包含management 的所有权限,并且可以管理策略( Policy )和参数( Parameter )。
3.monitoring : 包含management 的所有权限,并且可以看到所有连接、信道及节点相关的信息。
4.administartor : 包含monitoring 的所有权限,井且可以管理用户、虚拟主机、权限、策略、参数等,administator 代表了最高的权限。
- 设置用户角色:
rabbitmqctl set_user_tags {username) {tag ...}
其中username 参数表示需要设置角色的用户名称: tag 参数用于设置0 个、1个或者多个的角色,设置之后任何之前现有的身份都会被删除。
三、Web端管理
①开启管理界面:
执行rabbitmq-plugins enable rabbitmq_management
命令来开启RabbitMQ managmenet 插件:
②查看当前插件使用情况
可以通过rabbitmq-plugins list
命令来查看当前插件的使用情况:
其中标记为[E*]的为显式启动,而[e*]为隐式启动,如显式启动rabbitmq ma n agement 插件会同时隐式启动amqp_client 、cowboy 、cow_lib 、rabbitmq_management_agent 、rabbitmq_web_dispatch 等另外5 个插件。
③重启RabbitMQ
开启rabbitmq_management 插件之后还需要重启RabbitMQ 服务才能使其正式生效:
net stop RabbitMQ && net start RabbitMQ
④之后就可以通过浏览器访问 http://localhost:15672 了
之前由命令行执行的操作都可以在该管理界面进行操作。
四、应用与集群管理
①应用管理
rabbitmqctl stop [pid_file]
用于停止运行RabbitMQ 的Erlang 虚拟机和RabbitMQ 服务应用。其中pid file 是通过调用rabbitmq-server 命令启动RabbitMQ 服务时创建的,默认情况下存放于Mnesia 目录中,可以通过RABBITMQ PID FILE这个环境变量来改变存放路径。注意,如果使用rabbitmq -ser ver -detach 这个带有-detach 后缀的命令来启动RabbitMQ 服务则不会生成pid file 文件。rabbitmqctl shutdown
用于停止运行RabbitMQ 的Erlang 虚拟机和RabbitMQ 服务应用。执行这个命令会阻塞直到Erlang 虚拟机进程退出。如果RabbitMQ 没有成功关闭,则会返回一个非零值。这个命令和rabbitmqctl stop 不同的是,它不需要指定pid file 而可以阻塞等待指定进程的关闭。rabbitmqctl stop_app
停止RabbitMQ 服务应用,但是Erlang 虚拟机还是处于运行状态。
rabbitmqctl start_app
启动RabbitMQ 应用。此命令典型的用途是在执行了其他管理操作之后,重新启动之前停止的RabbitMQ 应用。rabbitmqctl reset
将RabbitMQ 节点重置还原到最初状态。包括从原来所在的集群中删除此节点,从管理数据库中删除所有的配置数据,如己配置的用户、vhost 等,以及删除所有的持久化消息。执行rabbitmqctl reset 命令前必须停止RabbitMQ 应用(比如先执行rabbitmqctl stop_app )。rabbitmqctl force_reset
强制将RabbitMQ 节点重置还原到最初状态。不同于rabbitmqctl reset 命令,rabbitmqctl force reset 命令不论当前管理数据库的状态和集群配置是什么,都会无条件地重直节点。它只能在数据库或集群配置己损坏的情况下使用。与rabbitmqctl reset命令一样,执行rabbitmqctl force reset 命令前必须先停止RabbitMQ 应用。
②集群管理(具体参考集群章节)
rabbitmqctl join_cluster {cluster_node} [--ram]
将节点加入指定集群中。在这个命令执行前需要停止RabbitMQ 应用井重置节点。rabbitmqctl cluster_status
显示集群的状态。rabbitmqctl change_cluster_node_type {disclram}
修改集群节点的类型。在这个命令执行前需要停止RabbitMQ 应用。rabbitmqctl forget_cluster_node [--offline]
将节点从集群中删除,允许离线执行。rabbitmqctl update_cluster_nodes {clusternode}
在集群中的节点应用启动前咨询clusternode 节点的最新信息,井更新相应的集群信息。这个和join_cluster
不同,它不加入集群。
考虑这样一种情况,节点A 和节点B 都在集群中,当节点A 离线了,节点C 又和节点B 组成了一个集群,然后节点B 又离开了集群,当A重新连上的时候,它会尝试联系节点B , 但是这样会失败,因为节点B 己经不在集群中了。rabbitmqctl update_cluster_nodes -n A C
可以解决这种场景下出现的问题。rabbitmqctl force_boot
确保节点可以启动,即使它不是最后一个关闭的节点。通常情况下, 当关闭整个RabbitMQ集群时,重启的第一个节点应该是最后关闭的节点,因为它可以看到其他节点所看不到的事情。但是有时会有一些异常情况出现,比如整个集群都掉电而所有节点都认为它不是最后一个关闭的。在这种情况下,可以调用rabbitmqctl f orce_boot 命令,这就告诉节点可以无条件地启动节点。在此节点关闭后,集群的任何变化,它都会丢失。如果最后一个关闭的节点永久丢失了,那么需要优先使用rabbitmqctl forget_cluster_node --offline
命令,因为它可以确保镜像队列的正常运转。rabbitmqctl sync_queue [-p vhost] {queue}
指示未同步队列queue 的slave 镜像可以同步master 镜像行的内容。同步期间此队列会被阻塞(所有此队列的生产消费者都会被阻塞〉,直到同步完成。此条命令执行成功的前提是队列queue 配置了镜像。注意,未同步队列中的消息被耗尽后,最终也会变成同步,此命令主要用于未耗尽的队列。rabbitmqctl cancel_sync_queue [-p vhost] {queue}
取消队列queue 同步镜像的操作。rabbitmqctl set_cluster_ name {name}
设置集群名称。集群名称在客户端连接时会通报给客户端。
五、服务端状态
服务器状态的查询会返回一个以制表符分隔的列表, list_queues 、list_exchanges 、list_bindings 和list_consumers 这种命令接受一个可选的vhost 参数以显示其结果,默认值为“/ ”。
传参就不赘述了,都是它的一些属性。
rabbitmqctl list_queues [-p vhost] [queueinfoitem ... ]
此命令返回队列的详细信息,如果无[-p vhost ]参数,将显示默认的vhost 为“/”中的队列详情。queueinfoitem 参数用于指示哪些队列的信息项会包含在结果集中,结果集的列顺序将匹配参数的顺序。rabbitmqctl list_exchanges [-p vhost] [exchangeinfoitem ...]
返回交换器的详细细节,如果无[ - p vhost ]参数,将显示默认的vhost 为“ / ”中的交换器详情。exchangeinfoitem 参数用于指示哪些信息项会包含在结果集中,结果集的列顺序将匹配参数的顺序。rabbitmqctl list_bindings [-p vhost] [bindinginfoitem ... ]
返回绑定关系的细节,如果无[-p vhost]参数,将显示默认的v hos t 为“/”中的绑定关系详情。bindinginfoitem 参数用于指示哪些信息项会包含在结果集中,结果集的列顺序将匹配参数的顺序。rabbitmqctl list_connections [connectioninfoitem ... ]
返回TCP/IP 连接的统计信息。connectioninfoitem 参数用于指示哪些信息项会包含在结果集中,结果集的列顺序将匹配参数的顺序。rabbitmqctl list_channels [channelinfoitem . . . ]
返回当前所有信道的信息。channelinfoitem 参数用于指示哪些信息项会包含在结果集中,结果集的列顺序将匹配参数的顺序。rabbitmqctl list_consumers [-p vhost]
列举消费者信息。rabbitmqctl status
显示Broker 的状态,比如当前Erlang 节点上运行的应用程序、RabbitMQ/Erlang 的版本信息、OS 的名称、内存及文件描述符等统计信息。rabbitmqctl node_health_check
对RabbitMQ 节点进行健康检查,确认应用是否正常运行、list queues 和list channels是否能够正常返回等。rabbitmqctl environment
显示每个运行程序环境中每个变量的名称和值。rabbitmqctl report
为所有服务器状态生成一个服务器状态报告,井将输出重定向到一个文件。rabbitmqctl eval {expr}
执行任意Erlang 表达式。
六、HTTP API接口管理
RabbitMQ Man agem ent 插件不仅提供了Web 管理界面, 还提供了HTTP API 接口来方便调用。比如创建一个队列,就可以通过PUT 方法调用/api/queues/vhost/name 接口来实现。
下面的示例通过curl 命令调用接口来完成队列queue 的创建:
注意下面命令中的“ %2F ”是指默认的vhost,即“/”,这类特殊字符在HTTP URL 中是需要转义的。
这里只给出一个范例,具体各个功能对应的URL及调用方法可以自行查阅资料。