RabbitMQ04-管理RabbitMQ
- rabbitmqctl是一个命令行工具,使用这个工具可以执行大部分的RabbitMQ的管理操作。
- rabbitmq management是RabbitMQ提供的一个管理插件,可以让用户通过图形化的方式来管理RabbitMQ,但是它的功能却远不仅于此。
1、RabbitMQ服务管理
rabbitmq-server #启动RabbitMQ服务,并在前台运行 rabbitmq-server -detached #启动RabbitMQ服务,并在后台运行 rabbitmqctl stop #停止RabbitMQ服务和Erlang虚拟机。可以指定PID文件。 rabbitmqctl shutdown #停止RabbitMQ服务和Erlang虚拟机。不指定PID文件。 rabbitmqctl stop_app #停止RabbitMQ服务,但不停止Erlang虚拟机。 rabbitmqctl start_app #启动RabbitMQ服务,但不启动Erlang虚拟机。 rabbitmqctl reset #将RabbitMQ节点重置并还原到最初状态。包括从原来所在的集群中删除此节点,从管理数据库中删除所有的配置数据,如用户、vhost等,以及删除所有的持久化消息。 #执行rabbitmqctl reset命令前必须停止RabbitMQ应用(比如先执行rabbitmqctl stop_app)。 rabbitmqctl force_reset #强制将RabbitMQ节点重置并还原到最初状态。 #不同于rabbitmqctl reset命令,rabbitmqctl force_reset命令不论当前管理数据库的状态和集群配置是什么,都会无条件地重置节点。它只能在数据库或集群配置己损坏的情况下使用。 #执行rabbitmqctl force_reset命令前必须停止RabbitMQ应用。 rabbitmqctl [--node <node>] [--longnames] [--quiet] stop [--idempotent] [<pidfile>] rabbitmqctl [--node <node>] [--longnames] [--quiet] shutdown [--wait] [--timeout <timeout>] rabbitmqctl [--node <node>] [--longnames] [--quiet] stop_app rabbitmqctl [--node <node>] [--longnames] [--quiet] start_app rabbitmqctl [--node <node>] [--longnames] [--quiet] reset rabbitmqctl [--node <node>] [--longnames] [--quiet] force_reset
2、用户管理
- 在RabbitMQ中,用户是访问控制(Access Control)的基本单元,可以对一个用户授予多个vhost的权限。且对于多个vhost,用户可以被赋予不同级别的访问权限,并使用标准的用户名和密码来认证用户。
2.1、用户管理的基本操作
rabbitmqctl list_users #列出用户名和角色(tags) rabbitmqctl add_user <username> <password> #创建一个新用户。默认情况下,此用户没有任何vhost的权限 rabbitmqctl delete_user <username> #删除用户 rabbitmqctl change_password <username> <password> #修改用户密码 rabbitmqctl clear_password <username> #清除密码(禁用基于密码的身份验证) rabbitmqctl authenticate_user <username> <password> #验证用户。如果身份验证失败,退出时使用非零代码 rabbitmqctl [--node <node>] [--longnames] [--quiet] list_users [--no-table-headers] [--timeout <timeout>] rabbitmqctl [--node <node>] [--longnames] [--quiet] add_user <username> <password> <username>:用户名 <password>:用户密码。使用空字符串禁用基于密码的身份验证。 rabbitmqctl [--node <node>] [--longnames] [--quiet] change_password <username> <password> rabbitmqctl [--node <node>] [--longnames] [--quiet] clear_password <username> rabbitmqctl [--node <node>] [--longnames] [--quiet] authenticate_user <username> <password> rabbitmqctl [--node <node>] [--longnames] [--quiet] delete_user <username>
- 注意,删除用户时,任何引用该用户的访问控制条目都会从RabbitMQ权限数据库中自动删除。rabbitmqctl不会警告你与用户相关的访问控制条目也会删除,所以请谨慎删除用户,否则你会发现不得不重建一大堆访问控制条目。
2.2、设置用户的角色
- 角色可以赋予用户在web管理页面上有哪些操作权限。
- 用户角色有5种:none、普通管理者、策略制定者、监控者和超级管理员。
- none:无任何角色。新用户的角色默认为none。(通常就是普通的生产者和消费者)
- 普通管理者(management):可以登陆管理控制台(启用management plugin的情况下),无法看到节点信息,也无法对策略进行管理。
- 策略制定者(policymaker):包含management的所有权限,并且可以管理策略(Policy)和参数(Parameter)。
- 监控者(monitoring):包含management的所有权限,并且可以看到所有连接、信道及节点相关的信息。
- 超级管理员(administrator):包含monitoring的所有权限,并且可以管理用户、虚拟主机、权限、策略、参数等。
rabbitmqctl set_user_tags <username> <tag> [...] #设置用户的角色 rabbitmqctl [--node <node>] [--longnames] [--quiet] set_user_tags <username> <tag> [...] <tag>:用于设置0 个、l 个或者多个的角色。(之前的身份角色都会被删除)
示例:
//查看用户列表 ]# rabbitmqctl list_users Listing users ... user tags guest [administrator] //创建一个新用户 ]# rabbitmqctl add_user root root Adding user "root" ... Done. Don't forget to grant the user permissions to some virtual hosts! See 'rabbitmqctl help set_permissions' to learn more. //设置用户的角色 ]# rabbitmqctl set_user_tags root administrator Setting tags for user "root" to [administrator] ... //查看用户列表 ]# rabbitmqctl list_users Listing users ... user tags guest [administrator] root [administrator]
3、管理虚拟主机
3.1、创建和删除虚拟主机
- 删除一个vhost同时也会删除其下所有的队列、交换器、绑定关系、用户权限、参数和策略等信息。
rabbitmqctl list_vhosts #查看虚拟主机列表 rabbitmqctl add_vhost <vhost> #创建虚拟主机 rabbitmqctl delete_vhost <vhost> #删除虚拟主机 rabbitmqctl [--node <node>] [--longnames] [--quiet] list_vhosts [--no-table-headers] [<column> ...] [--timeout <timeout>] rabbitmqctl [--node <node>] [--longnames] [--quiet] add_vhost <vhost> [--description <description> --tags "<tag1>,<tag2>,<...>"] rabbitmqctl [--node <node>] [--longnames] [--quiet] delete_vhost <vhost>
3.2、管理虚拟主机的权限
- 在RabbitMQ中,权限控制是以vhost为单位的。当创建一个用户时,用户通常会被指派给至少一个vhost,并且只能访问被指派的vhost内的队列、交换器和绑定关系等。
- RabbitMQ中的授予权限是指在vhost级别对用户进行权限授予。
3.2.1、列出权限
rabbitmqctl list_permissions [--vhost <vhost>] #列出vhost上的权限 rabbitmqctl list_user_permissions <username> #列出一个用户在所有vhost上的权限 rabbitmqctl [--node <node>] [--longnames] [--quiet] list_permissions [--vhost <vhost>] [--no-table-headers] [--timeout <timeout>] rabbitmqctl [--node <node>] [--longnames] [--quiet] list_user_permissions [--no-table-headers] <username> [--timeout <timeout>]
3.2.2、配置权限
rabbitmqctl set_permissions [--vhost <vhost>] <username> <conf> <write> <read> #在vhost中为用户设置权限 rabbitmqctl clear_permissions [--vhost <vhost>] <username> #清除用户在vhost上的所有权限 rabbitmqctl [--node <node>] [--longnames] [--quiet] set_permissions [--vhost <vhost>] <username> <conf> <write> <read> <vhost>:对用户授予哪个vhost的权限,默认值vhost是"/"。 <username>:用户的名称 <conf>:用于匹配用户在哪些资源上拥有可配置的权限(可以使用正则表达式)。可配置是指队列和交换器的创建及删除之类的操作。 <write>:用于匹配用户在哪些资源上拥有可写的权限(可以使用正则表达式)。可写是指发布消息。 <read>:用于匹配用户在哪些资源上拥有可读的权限(可以使用正则表达式)。可读是指与消息有关的操作,包括读取消息及清空整个队列等。 rabbitmqctl [--node <node>] [--longnames] [--quiet] clear_permissions [--vhost <vhost>] <username>
- AMQP命令与权限的映射关系
示例:
//创建vhost ]# rabbitmqctl add_vhost vhost_hh Adding vhost "vhost_hh" ... //查看vhost列表(名称、标签、集群状态、追踪、描述) ]# rabbitmqctl list_vhosts name tags cluster_state tracing description Listing vhosts ... name tags cluster_state tracing description vhost_hh [] [{rabbit@hh14, running}] false / [] [{rabbit@hh14, running}] false Default virtual host //在vhost中为用户设置权限 ]# rabbitmqctl set_permissions --vhost vhost_hh root "^queue.*" ".*" ".*" Setting permissions for user "root" in vhost "vhost_hh" ... //查看用户在所有vhost上的权限 ]# rabbitmqctl list_user_permissions root Listing permissions for user "root" ... vhost configure write read vhost_hh ^queue.* .* .* //查看vhost上的权限 ]# rabbitmqctl list_permissions --vhost vhost_hh Listing permissions for vhost "vhost_hh" ... user configure write read root ^queue.* .* .*
4、集群管理
rabbitmqctl cluster_status #显示集群的状态 rabbitmqctl set_cluster_name <name> #设置集群名称 rabbitmqctl join_cluster [--disc|--ram] <existing_cluster_member> #将节点加入到指定集群中。执行这个命令前需要停止RabbitMQ应用并重置节点 rabbitmqctl change_cluster_node_type <disc | ram> #修改集群节点的类型。执行这个命令前需要停止RabbitMQ应用。 rabbitmqctl update_cluster_nodes <seed_node> #在集群中的节点启动前,向seed_node节点咨询集群的最新信息,并更新集群信息。 rabbitmqctl forget_cluster_node [--offline] <existing_cluster_member_node> #将节点从集群中删除,允许离线执行。 rabbitmqctl force_boot #强制节点启动,即使它不是最后一个关闭的节点 rabbitmqctl sync_queue [--vhost <vhost>] <queue> #进行镜像同步 rabbitmqctl cancel_sync_queue [--vhost <vhost>] <queue> #取消镜像同步。 rabbitmqctl [--node <node>] [--longnames] [--quiet] join_cluster [--disc|--ram] <existing_cluster_member> <existing_cluster_member>:要加入的集群中的成员(节点) --disc:将该节点设置为disk节点,将数据存储在磁盘中。推荐使用(默认使用)。 --ram:将该节点设置为RAM节点,将数据存储在内存中。不推荐。 rabbitmqctl [--node <node>] [--longnames] [--quiet] cluster_status [--timeout <timeout>] rabbitmqctl [--node <node>] [--longnames] [--quiet] change_cluster_node_type <disc | ram> rabbitmqctl [--node <node>] [--longnames] [--quiet] forget_cluster_node [--offline] <existing_cluster_member_node> --offline:可以将非运行状态下的节点剔除集群。 rabbitmqctl [--node <node>] [--longnames] [--quiet] update_cluster_nodes <seed_node> rabbitmqctl [--node <node>] [--longnames] [--quiet] force_boot rabbitmqctl [--node <node>] [--longnames] [--quiet] sync_queue [--vhost <vhost>] <queue> rabbitmqctl [--node <node>] [--longnames] [--quiet] cancel_sync_queue [--vhost <vhost>] <queue> rabbitmqctl [--node <node>] [--longnames] [--quiet] set_cluster_name <name>
5、服务端状态
rabbitmqctl status #显示Broker的状态,比如当前Erlang节点上运行的应用程序、RabbitMQ的版本信息、os的名称、内存及文件描述符等统计信息。 rabbitmqctl environment #显示每个运行程序环境中每个变量的名称和值。 rabbitmqctl report #为生成服务器状态报告 rabbitmqctl list_queues [--vhost <vhost>] [<column>, ...] #查看队列的详细信息 rabbitmqctl list_exchanges [--vhost <vhost>] [<column> ...] #查看交换器的详细信息 rabbitmqctl list_bindings [--vhost <vhost>] [<column> ...] #查看绑定的详细信息 rabbitmqctl list_connections [<column> ...] #查看连接的详细信息 rabbitmqctl list_channels [<column> ...] #查看信道的详细信息 rabbitmqctl list_consumers [--vhost <vhost>] [<column> ...] #查看消费者的详细信息 rabbitmqctl [--node <node>] [--longnames] [--quiet] status [--unit <unit>] [--timeout <timeout>] rabbitmqctl [--node <node>] [--longnames] [--quiet] environment rabbitmqctl [--node <node>] [--longnames] [--quiet] report rabbitmqctl [--node <node>] [--longnames] [--quiet] list_queues [--vhost <vhost>] [--online] [--offline] [--local] [--no-table-headers] [<column>, ...] [--timeout <timeout>] name:队列名称。 durable:队列是否持久化。 auto_delete:队列是否自动删除。 arguments:队列的参数。 policy:应用到队列上的策略名称。 pid:队列关联的Er1ang进程的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 。 message_bytes:队列中所有消息的大小总和。这里不包括消息属性或者任何其他开销。 message_bytes_ready:准备发送给客户端的消息的大小总和。 message_bytes_unacknowledged:发送给客户端但尚未应答的消息的大小总和。 message_bytes_ram:驻留在内存中的messages_bytes 。 message_bytes_persistent:队列中持久化的messages_bytes 。 disk_reads:从队列启动开始,己从磁盘中读取该队列的消息总次数。 disk_writes:从队列启动开始,己向磁盘队列写消息的总次数。 consumers:消费者数目。 consumer_utilisation:队列中的消息能够立刻投递给消费者的比率,介于0 和l之间。这个受网络拥塞或者Basic.Qos 的影响而小于1 。 memory:与队列相关的Erlang 进程所消耗的内存字节数,包括械、堆及内部结构。 slave_pids:如果队列是镜像的,列出所有slave 镜像的pid 。 synchronised_slave_pids:如果队列是镜像的,列出所有己经同步的slave 镜像的pid 。 state:队列状态。正常情况下是running;如果队列正常同步数据可能会有"{syncing, MsgCount}"的状态;如果队列所在的节点掉线了,则队列显示状态为down(此时大多数的queueinfoitems也将不可用)。 rabbitmqctl [--node <node>] [--longnames] [--quiet] list_exchanges [--vhost <vhost>] [--no-table-headers] [<column> ...] [--timeout <timeout>] name:交换器的名称。 type:交换器的类型。 durable:设置是否持久化。durable设置为true表示持久化,反之是非持久化。持久化可以将交换器信息存盘,而在服务器重启的时候不会丢失相关信息。 auto_delete:设直是否自动删除。 internal:是否是内置的。 arguments:其他一些结构化参数,比如alternate-exchange。 policy:应用到交换器上的策略名称。 rabbitmqctl [--node <node>] [--longnames] [--quiet] list_bindings [--vhost <vhost>] [--no-table-headers] [<column> ...] [--timeout <timeout>] source_name:绑定中消息来源的名称。 source_kind:绑定中消息来源的类别。 destination_name:绑定中消息目的地的名称。 destination_kind:绑定中消息目的地的种类。 routing_key:绑定的路由键。 arguments:绑定的参数。 rabbitmqctl [--node <node>] [--longnames] [--quiet] list_connections [--no-table-headers] [<column> ...] [--timeout <timeout>] pid:与连接相关的Er1ang进程ID 。 name:连接的名称。 port:服务器端口。 host:返回反向DNS获取的服务器主机名称,或者IP地址,或者未启用。 peer_port:服务器对端端口。当一个客户端与服务器连接时,这个客户端的端口就是peer_port 。 peer_host:返回反向DNS获取的对端主机名称,或者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} 或者{0,8,0}。注意,如果客户端请求的是AMQP 0-9的连接, RabbitMQ也会将其视为0-9-l 。 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:连接建立的时间戳。 rabbitmqctl [--node <node>] [--longnames] [--quiet] list_channels [--no-table-headers] [<column> ...] 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:己发送但是还未确认的消息个数。如果信道不处于prefetch_count模式下,则此值为0。 prefetch_count:新消费者的Qos 个数限制。0 表示无上限。 global_prefetch_count:整个信道的Qos个数限制。0表示无上限。 rabbitmqctl [--node <node>] [--longnames] [--quiet] list_consumers [--vhost <vhost>] [--no-table-headers] [<column> ...] [--timeout <timeout>]
6、使用Web页面管理RabbitMQ
- RabbitMQ management插件提供Web管理界面用来管理虚拟主机、用户等,也可以用来管理队列、交换器、绑定关系、策略、参数等,还可以用来监控RabbitMQ服务的状态及一些数据统计类信息,可谓是功能强大,基本上能够涵盖所有RabbitMQ管理的功能。
- RabbitMQ management插件同样是由Erlang语言编写的,并且和RabbitMQ服务运行在同一个Erlang虚拟机中。
- 在使用Web管理界面之前需要先启用RabbitMQ management插件。
6.1、管理插件
//列出所有插件 rabbitmq-plugins list //启用插件 rabbitmq-plugins enable <plugin1> [ <plugin2>] //禁用插件 rabbitmq-plugins disable <plugin1> [ <plugin2>] //显示插件目录和启用的插件文件路径 rabbitmq-plugins directories rabbitmq-plugins [--node <node>] [--longnames] [--quiet] list [pattern] [--verbose] [--minimal] [--enabled] [--implicitly-enabled] <pattern>:只列出与正则表达式匹配的插件 --verbose:输出详细信息 --minimal:只输出插件名称 --enabled:只列出启用的插件 --implicitly-enabled:包含启用的插件作为其他插件的依赖项 rabbitmq-plugins [--node <node>] [--longnames] [--quiet] enable <plugin1> [ <plugin2>] | --all [--offline] [--online] rabbitmq-plugins [--node <node>] [--longnames] [--quiet] disable <plugin1> [ <plugin2>] | --all [--offline] [--online] rabbitmq-plugins [--node <node>] [--longnames] [--quiet] directories [--offline] [--online]
6.2、示例
1、启用rabbitmq_management插件
- 标记为[E*]的是显式启动,而[e*]是隐式启动。例如显式启动rabbitmq_management插件,同时会隐式启动rabbitmq_management_agent和rabbitmq_web_dispatch插件。
//启用rabbitmq_management插件 ]# rabbitmq-plugins enable rabbitmq_management //查看插件 ]# rabbitmq-plugins list ...... [E*] rabbitmq_management 3.9.19 [e*] rabbitmq_management_agent 3.9.19 [e*] rabbitmq_web_dispatch 3.9.19
2、配置登录用户
//创建一个用户,用户账密root/root ]# rabbitmqctl add_user root root //为用户root配置角色administrator ]# rabbitmqctl set_user_tags root administrator
3、登录web管理页面
- 使用主机IP和端口登录,http://IP:15672
- 默认的用户guest/guest只能使用http://localhost:15672/访问。