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/访问。

posted @ 2022-06-29 01:58  麦恒  阅读(170)  评论(0编辑  收藏  举报