1、Rabbitmq管理
1.1、多租户与权限
每一个RabbitMQ 服务器都能创建虚拟的消息服务器,我们称之为虚拟主机(virtual host) ,简称为vhost 。每一个vhost 本质上是一个独立的小型RabbitMQ 服务器,拥有自己独立的队列、交换器及绑定关系等,井且它拥有自己独立的权限。vhost 就像是虚拟机与物理服务器一样,它们在各个实例间提供逻辑上的分离,为不同程序安全保密地运行数据,它既能将同一个RabbitMQ 中的众多客户区分开,又可以避免队列和交换器等命名冲突。vhost 之间是绝对隔离的,无法将vhost1中的交换器与vhost2 中的队列进行绑定,这样既保证了安全性,又可以确保可移植性。如果在使用RabbitMQ 达到一定规模的时候,建议用户对业务功能、场景进行归类区分,并为之分配独立的vhost。
vhost 是AMQP 概念的基础,客户端在连接的时候必须制定一个vhost。 RabbitMQ 默认创建的vhost 为" /" , 如果不需要多个vhost 或者对vhost 的概念不是很理解,那么用这个默认的vhost 也是非常合理的,使用默认的用户名guest 和密码guest 就可以访问它。但是为了安全和方便,建议重新建立一个新的用户来访问它。
可以使用rabbitmqctl add_vhost {vhost} 命令创建一个新的vhost,大括号里的参数表示vhost 的名称。
[root@myblnp ~]# rabbitmqctl add_vhost vhost1
Adding vhost "vhost1" ...
[root@myblnp ~]#
可以使用 rabbitmqctl list_vhosts [vhostinfoitem...] 来罗列当前vhost 的相关信息。目前vhostinfoitem 的取值有2 个。
- name: 表示vhost 的名称。
- tracing: 表示是否使用了RabbitMQ 的trace 功能。
[root@myblnp ~]# rabbitmqctl list_vhosts
Listing vhosts ...
name
vhost1
/
[root@myblnp ~]# rabbitmqctl list_vhosts tracing
Listing vhosts ...
tracing
false
false
[root@myblnp ~]# rabbitmqctl list_vhosts name tracing
Listing vhosts ...
name tracing
vhost1 false
/ false
[root@myblnp ~]#
对应的删除vhost 的命令是: rabbitmqctl delete_vhost {vhost) ,其中大括号里面的参数表示vhost 的名称。删除一个vhost 同时也会删除其下所有的队列、交换器、绑定关系、用户权限、参数和策略等信息。
[root@myblnp ~]# rabbitmqctl delete_vhost vhost1
Deleting vhost "vhost1" ...
[root@myblnp ~]#
AMQP 协议中并没有指定权限在vhost 级别还是在服务器级别实现,由具体的应用自定义。在RabbitMQ 中,权限控制则是以vhost 为单位的。当创建一个用户时,用户通常会被指派给至少一个vhost,并且只能访问被指派的vhost 内的队列、交换器和绑定关系等。因此, RabbitMQ中的授予权限是指在vhost 级别对用户而言的权限授予。
相关的授予权限命令为: rabbitmqctl set_permissions [-p vhost] {user} {conf} {write} {read} 。其中各个参数的含义如下所述。
- vhost : 授予用户访问权限的 vhost 名称,可以设置为默认值,即 vhost 为 "/"
- user: 可以访问指定vhost 的用户名。
- conf: 一个用于匹配用户在哪些资源上拥有可配置权限的正则表达式。
- write: 一个用于匹配用户在哪些资源上拥有可写权限的正则表达式。
- read : 一个用于匹配用户在哪些资源上拥有可读权限的正则表达式。
注意:可配直指的是队列和交换器的创建及删除之类的操作;可写指的是发布消息;可读指与消息有关的操作,包括读取消息及清空整个队列等。
** 关于 AMQP 命令与权限的映射关系:**
AMQP命令可配置可写可读Exchange.DeclareexchangeExchange.Declare (with AE)exchangeexchange(AE)exchangeExchange.DeleteexchangeQueue.DeclarequeueQueue.Declare (with DLX)queueexchange(DLX)queueQueue.DeletequeueExchange.Bindexchange (destination)exchange (source)Exchange.Unbindexchange (destination)exchange (source)Queue.BindqueueexchangeQueue.UnbindqueueexchangeBasic.PublishexchangeBasic.GetqueueBasic.ConsumequeueQueue.Puragequeue
授予 root 用户可访问虚拟主机vhostl,并在所有资源上都具备可配置、可写及可读的权限,示例如下:
[root@myblnp ~]# rabbitmqctl add_vhost vhost1
Adding vhost "vhost1" ...
[root@myblnp ~]#
[root@myblnp ~]# rabbitmqctl add_user root
Adding user "root" ...
Password:
root
Done. Don't forget to grant the user permissions to some virtual hosts! See 'rabbitmqctl help set_permissions' to learn more.
[root@myblnp ~]#
[root@myblnp ~]# rabbitmqctl set_permissions -p vhost1 root ".*" ".*" ".*"
Setting permissions for user "root" in vhost "vhost1" ...
[root@myblnp ~]#
授予root 用户可访问虚拟主机vhost2 , 在以"queue" 开头的资源上具备可配置权限, 并在所有资源上拥有可写、可读的权限, 示例如下:
[root@myblnp ~]# rabbitmqctl add_vhost vhost2
Adding vhost "vhost2" ...
[root@myblnp ~]#
[root@myblnp ~]#
[root@myblnp ~]# rabbitmqctl set_permissions -p vhost2 root "^queue.*" ".*" ".*"
Setting permissions for user "root" in vhost "vhost2" ...
[root@myblnp ~]#
清除权限也是在vhost 级别对用户而言的。清除权限的命令为rabbitmqctl clear_permissions [-p vhost] { username} 。其中vhost 用于设置禁止用户访问的虚拟主机的名称, 默认为"/ " ; username 表示禁止访问特定虚拟主机的用户名称。
[root@myblnp ~]# rabbitmqctl clear_permissions -p vhost1 root
Clearing permissions for user "root" in vhost "vhost1" ...
[root@myblnp ~]#
在RabbitMQ 中有两个Shell 命令可以列举权限信息。第一个命令是rabbitmqctl list_permissions [-p vhost} ,用来显示虚拟主机上的权限;第二个命令是rabbitmqctl list_user permissions {username} ,用来显示用户的权限。
[root@myblnp ~]# rabbitmqctl list_permissions -p /
Listing permissions for vhost "/" ...
user configure write read
admin .* .* .*
guest .* .* .*
[root@myblnp ~]# rabbitmqctl list_permissions -p vhost1
Listing permissions for vhost "vhost1" ...
[root@myblnp ~]# rabbitmqctl list_user_permissions root
Listing permissions for user "root" ...
[root@myblnp ~]# rabbitmqctl list_user_permissions admin
Listing permissions for user "admin" ...
vhost configure write read
/ .* .* .*
[root@myblnp ~]#
rabbitmqctl 工具的标准语法如下( [ ])表示可选参数, {}表示必选参数:
rabbitmqctl [-n node] [-t timeout] [-q] (command) {command options...} [-n node]
【-n node】
默认节点是" rabbit@hostname" 此处的hostname 是主机名称。在一个名为node.hidden.com"
的主机上, RabbitMQ 节点的名称通常是rabbit@node (除非RABBITMQ_NODENAME 参数在启动时被设置成了非默认值).hostname -s 命令的输出通常是"@"标志后的东西。
【-q】
.使用-q 标志来启用quiet 模式,这样可以屏蔽一些消息的输出。默认不开启quiet 模式。
【-t timeout】
操作超时时间(秒为单位),只适用于"list_xxx" 类型的命令,默认是无穷大。
[root@myblnp ~]# rabbitmqctl list_vhosts
Listing vhosts ...
name
vhost1
/
[root@myblnp ~]# rabbitmqctl list_vhosts -q
name
vhost1
/
[root@myblnp ~]#
1.2、用户管理
创建用户的命令为rabbitmqctl add_user {username} {password} 。其中username 表示要创建的用户名称; password 表示创建用户登录的密码。具体创建一个用户名为root 、密码为root123 的用户:
[root@myblnp ~]# rabbitmqctl add_user root root123
Adding user "root" ...
Done. Don't forget to grant the user permissions to some virtual hosts! See 'rabbitmqctl help set_permissions' to learn more.
[root@myblnp ~]#
可以通过rabbitmqctl change_password {username} {newpassword} 命令来更改指定用户的密码, 其中username 表示要变更密码的用户名称, newpassword 表示要变更的新的密码。举例,将root 用户的密码变更为root321 :
[root@myblnp ~]# rabbitmqctl change_password root root321
Changing password for user "root" ...
[root@myblnp ~]#
同样可以清除密码,这样用户就不能使用密码登录了,对应的操作命令为rabbitmqctl clear_password {username} ,其中username 表示要清除密码的用户名称。
使用rabbitmqctl authenticate_user {userηame} {password} 可以通过密码来验证用户,其中username 表示需要被验证的用户名称, password 表示密码。下面示例中分别采用root321 和root322 来验证root 用户:
[root@myblnp ~]# rabbitmqctl authenticate_user root root321
Authenticating user "root" ...
Success
[root@myblnp ~]# rabbitmqctl authenticate_user root root322
Authenticating user "root" ...
Error:
Error: failed to authenticate user "root"
user 'root' - invalid credentials
[root@myblnp ~]#
删除用户的命令是rabbitmqctl delete_user {username) ,其中username 表示要删除的用户名称。删除root 用户的示例如下:
[root@myblnp ~]# rabbitmqctl delete_user root
Deleting user "root" ...
[root@myblnp ~]#
rabbitmqctl list_users 命令可以用来罗列当前的所有用户。每个结果行都包含用户名称,其后紧跟用户的角色(tags) 。示例如下:
[root@myblnp ~]# rabbitmqctl list_users
Listing users ...
user tags
admin [administrator]
guest [administrator]
root []
[root@myblnp ~]#
用户的角色分为5 种类型:
- none: 无任何角色。新创建的用户的角色默认为none 。
- management: 可以访问Web 管理页面
- policymaker: 包含management 的所有权限,并且可以管理策略(Policy) 和参数(Parameter)
- monitoring: 包含management 的所有权限,并且可以看到所有连接、信道及节点相关的信息。
- administartor: 包含monitoring 的所有权限,井且可以管理用户、虚拟主机、权限、策略、参数等。administator 代表了最高的权限。
用户的角色可以通过rabbitmqctl set_user_tags {username} {tag ...} 命令设置。其中username 参数表示需要设置角色的用户名称; tag 参数用于设置0 个、1个或者多个的角色,设置之后任何之前现有的身份都会被删除。示例如下:
[root@myblnp ~]# rabbitmqctl set_user_tags root monitoring
Setting tags for user "root" to [monitoring] ...
[root@myblnp ~]#
[root@myblnp ~]# rabbitmqctl list_users -q
user tags
admin [administrator]
guest [administrator]
root [monitoring]
[root@myblnp ~]#
[root@myblnp ~]# rabbitmqctl set_user_tags root policymaker -q
[root@myblnp ~]#
[root@myblnp ~]# rabbitmqctl list_users -q
user tags
admin [administrator]
guest [administrator]
root [policymaker]
[root@myblnp ~]# rabbitmqctl set_user_tags root
Setting tags for user "root" to [] ...
[root@myblnp ~]#
[root@myblnp ~]# rabbitmqctl list_users -q
user tags
admin [administrator]
guest [administrator]
root []
[root@myblnp ~]#
[root@myblnp ~]# rabbitmqctl set_user_tags root monitoring,policymaker
Setting tags for user "root" to [monitoring,policymaker] ...
[root@myblnp ~]#
[root@myblnp ~]# rabbitmqctl list_users -q
user tags
admin [administrator]
guest [administrator]
root [monitoring,policymaker]
[root@myblnp ~]#
1.3、WEB端管理
RabbitMQ management 插件可以提供Web 管理界面用来管理如前面所述的虚拟主机、用户等,也可以用来管理队列、交换器、绑定关系、策略、参数等,还可以用来监控RabbitMQ服务的状态及一些数据统计类信息,可谓是功能强大,基本上能够涵盖所有RabbitMQ 管理的功能。
在使用Web 管理界面之前需要先启用RabbitMQ management 插件。RabbitMQ 提供了很多的插件,默认存放在$RABBITMQ_HOME/plugins 目录下,如下所示。
[root@myblnp plugins]# ls -al
total 13812
drwxr-xr-x. 2 rabit rabit 4096 May 5 2021 .
drwxr-xr-x. 7 rabit rabit 4096 May 5 2021 ..
-rw-r--r--. 1 rabit rabit 13402 May 5 2021 accept-0.3.5.ez
-rw-r--r--. 1 rabit rabit 106775 May 5 2021 amqp10_client-3.8.16.ez
-rw-r--r--. 1 rabit rabit 45582 May 5 2021 amqp10_common-3.8.16.ez
-rw-r--r--. 1 rabit rabit 414782 May 5 2021 amqp_client-3.8.16.ez
-rw-r--r--. 1 rabit rabit 19784 May 5 2021 aten-0.5.5.ez
-rw-r--r--. 1 rabit rabit 3190 May 5 2021 base64url-0.0.1.ez
-rw-r--r--. 1 rabit rabit 291030 May 5 2021 cowboy-2.8.0.ez
-rw-r--r--. 1 rabit rabit 644414 May 5 2021 cowlib-2.9.1.ez
-rw-r--r--. 1 rabit rabit 18574 May 5 2021 credentials_obfuscation-2.4.0.ez
-rw-r--r--. 1 rabit rabit 165282 May 5 2021 cuttlefish-3.0.0.ez
-rw-r--r--. 1 rabit rabit 2486961 May 5 2021 eetcd-0.3.3.ez
-rw-r--r--. 1 rabit rabit 13832 May 5 2021 gen_batch_server-0.8.4.ez
-rw-r--r--. 1 rabit rabit 69329 May 5 2021 goldrush-0.1.9.ez
-rw-r--r--. 1 rabit rabit 97349 May 5 2021 gun-1.3.3.ez
-rw-r--r--. 1 rabit rabit 831324 May 5 2021 jose-1.11.1.ez
-rw-r--r--. 1 rabit rabit 99032 May 5 2021 jsx-2.11.0.ez
-rw-r--r--. 1 rabit rabit 234023 May 5 2021 lager-3.9.1.ez
-rw-r--r--. 1 rabit rabit 167679 May 5 2021 observer_cli-1.6.1.ez
-rw-r--r--. 1 rabit rabit 223866 May 5 2021 prometheus-4.6.0.ez
-rw-r--r--. 1 rabit rabit 388178 May 5 2021 ra-1.1.8.ez
-rw-r--r--. 1 rabit rabit 2651488 May 5 2021 rabbit-3.8.16.ez
-rw-r--r--. 1 rabit rabit 802365 May 5 2021 rabbit_common-3.8.16.ez
-rw-r--r--. 1 rabit rabit 257342 May 5 2021 rabbitmq_amqp1_0-3.8.16.ez
-rw-r--r--. 1 rabit rabit 33874 May 5 2021 rabbitmq_auth_backend_cache-3.8.16.ez
-rw-r--r--. 1 rabit rabit 17174 May 5 2021 rabbitmq_auth_backend_http-3.8.16.ez
-rw-r--r--. 1 rabit rabit 53216 May 5 2021 rabbitmq_auth_backend_ldap-3.8.16.ez
-rw-r--r--. 1 rabit rabit 52388 May 5 2021 rabbitmq_auth_backend_oauth2-3.8.16.ez
-rw-r--r--. 1 rabit rabit 24428 May 5 2021 rabbitmq_auth_mechanism_ssl-3.8.16.ez
-rw-r--r--. 1 rabit rabit 76414 May 5 2021 rabbitmq_aws-3.8.16.ez
-rw-r--r--. 1 rabit rabit 35523 May 5 2021 rabbitmq_consistent_hash_exchange-3.8.16.ez
-rw-r--r--. 1 rabit rabit 27474 May 5 2021 rabbitmq_event_exchange-3.8.16.ez
-rw-r--r--. 1 rabit rabit 266831 May 5 2021 rabbitmq_federation-3.8.16.ez
-rw-r--r--. 1 rabit rabit 14743 May 5 2021 rabbitmq_federation_management-3.8.16.ez
-rw-r--r--. 1 rabit rabit 26640 May 5 2021 rabbitmq_jms_topic_exchange-3.8.16.ez
-rw-r--r--. 1 rabit rabit 1288744 May 5 2021 rabbitmq_management-3.8.16.ez
-rw-r--r--. 1 rabit rabit 191385 May 5 2021 rabbitmq_management_agent-3.8.16.ez
-rw-r--r--. 1 rabit rabit 203899 May 5 2021 rabbitmq_mqtt-3.8.16.ez
-rw-r--r--. 1 rabit rabit 27153 May 5 2021 rabbitmq_peer_discovery_aws-3.8.16.ez
-rw-r--r--. 1 rabit rabit 59166 May 5 2021 rabbitmq_peer_discovery_common-3.8.16.ez
-rw-r--r--. 1 rabit rabit 56186 May 5 2021 rabbitmq_peer_discovery_consul-3.8.16.ez
-rw-r--r--. 1 rabit rabit 55590 May 5 2021 rabbitmq_peer_discovery_etcd-3.8.16.ez
-rw-r--r--. 1 rabit rabit 31125 May 5 2021 rabbitmq_peer_discovery_k8s-3.8.16.ez
-rw-r--r--. 1 rabit rabit 99348 May 5 2021 rabbitmq_prelaunch-3.8.16.ez
-rw-r--r--. 1 rabit rabit 51326 May 5 2021 rabbitmq_prometheus-3.8.16.ez
-rw-r--r--. 1 rabit rabit 7652 May 5 2021 rabbitmq_random_exchange-3.8.16.ez
-rw-r--r--. 1 rabit rabit 18907 May 5 2021 rabbitmq_recent_history_exchange-3.8.16.ez
-rw-r--r--. 1 rabit rabit 49666 May 5 2021 rabbitmq_sharding-3.8.16.ez
-rw-r--r--. 1 rabit rabit 205865 May 5 2021 rabbitmq_shovel-3.8.16.ez
-rw-r--r--. 1 rabit rabit 27459 May 5 2021 rabbitmq_shovel_management-3.8.16.ez
-rw-r--r--. 1 rabit rabit 153370 May 5 2021 rabbitmq_stomp-3.8.16.ez
-rw-r--r--. 1 rabit rabit 72903 May 5 2021 rabbitmq_top-3.8.16.ez
-rw-r--r--. 1 rabit rabit 68241 May 5 2021 rabbitmq_tracing-3.8.16.ez
-rw-r--r--. 1 rabit rabit 86477 May 5 2021 rabbitmq_trust_store-3.8.16.ez
-rw-r--r--. 1 rabit rabit 49514 May 5 2021 rabbitmq_web_dispatch-3.8.16.ez
-rw-r--r--. 1 rabit rabit 52345 May 5 2021 rabbitmq_web_mqtt-3.8.16.ez
-rw-r--r--. 1 rabit rabit 66605 May 5 2021 rabbitmq_web_mqtt_examples-3.8.16.ez
-rw-r--r--. 1 rabit rabit 56616 May 5 2021 rabbitmq_web_stomp-3.8.16.ez
-rw-r--r--. 1 rabit rabit 52278 May 5 2021 rabbitmq_web_stomp_examples-3.8.16.ez
-rw-r--r--. 1 rabit rabit 108136 May 5 2021 ranch-2.0.0.ez
-rw-r--r--. 1 rabit rabit 59 May 5 2021 README
-rw-r--r--. 1 rabit rabit 77411 May 5 2021 recon-2.5.1.ez
-rw-r--r--. 1 rabit rabit 47501 May 5 2021 stdout_formatter-0.2.4.ez
-rw-r--r--. 1 rabit rabit 56947 May 5 2021 syslog-3.4.5.ez
-rw-r--r--. 1 rabit rabit 17593 May 5 2021 sysmon_handler-1.3.0.ez
[root@myblnp plugins]#
其中以 .ez 扩展名称结尾的文件就是RabbitMQ 的插件, 上面文件中的rabbitmq_management-3.8.16.ez 就是指RabbitMQ Management 插件。启动插件的命令不是使用rabbitmqctl 工具, 而是使用rabbitmq-plugins ,其语法格式为:
rabbitmq-plugins [-n node] {command} [command options ... ]
启动插件是使用rabbitmq-plugins enable [plugin - name] ,关闭插件的命令是rabbitmq-plugins disable [plugin-name] 。执行rabbitmq-plugins enable rabbitmq management 命令来开启RabbitMQ managmenet 插件:
rabbitmq-plugins enable rabbitmq_management
可以通过rabbitmq-plugins list 命令来查看当前插件的使用情况, 如下所示。其中标记为 [E*] 的为显式启动,而[e*] 为隐式启动, 如显式启动rabbitmq_management 插件会同时隐式启动amqp_client 、cowboy 、cowlib 、rabbitmq_management_agent 、rabbitmq_web_dispatch 等另外5 个插件。
[root@myblnp plugins]# rabbitmq-plugins list
Listing plugins with pattern ".*" ...
Configured: E = explicitly enabled; e = implicitly enabled
| Status: * = running on rabbit@myblnp
|/
[ ] rabbitmq_amqp1_0 3.8.13
[ ] rabbitmq_auth_backend_cache 3.8.13
[ ] rabbitmq_auth_backend_http 3.8.13
[ ] rabbitmq_auth_backend_ldap 3.8.13
[ ] rabbitmq_auth_backend_oauth2 3.8.13
[ ] rabbitmq_auth_mechanism_ssl 3.8.13
[ ] rabbitmq_consistent_hash_exchange 3.8.13
[ ] rabbitmq_event_exchange 3.8.13
[ ] rabbitmq_federation 3.8.13
[ ] rabbitmq_federation_management 3.8.13
[ ] rabbitmq_jms_topic_exchange 3.8.13
[E*] rabbitmq_management 3.8.13
[e*] rabbitmq_management_agent 3.8.13
[ ] rabbitmq_mqtt 3.8.13
[ ] rabbitmq_peer_discovery_aws 3.8.13
[ ] rabbitmq_peer_discovery_common 3.8.13
[ ] rabbitmq_peer_discovery_consul 3.8.13
[ ] rabbitmq_peer_discovery_etcd 3.8.13
[ ] rabbitmq_peer_discovery_k8s 3.8.13
[ ] rabbitmq_prometheus 3.8.13
[ ] rabbitmq_random_exchange 3.8.13
[ ] rabbitmq_recent_history_exchange 3.8.13
[ ] rabbitmq_sharding 3.8.13
[ ] rabbitmq_shovel 3.8.13
[ ] rabbitmq_shovel_management 3.8.13
[ ] rabbitmq_stomp 3.8.13
[ ] rabbitmq_top 3.8.13
[ ] rabbitmq_tracing 3.8.13
[ ] rabbitmq_trust_store 3.8.13
[e*] rabbitmq_web_dispatch 3.8.13
[ ] rabbitmq_web_mqtt 3.8.13
[ ] rabbitmq_web_mqtt_examples 3.8.13
[ ] rabbitmq_web_stomp 3.8.13
[ ] rabbitmq_web_stomp_examples 3.8.13
[root@myblnp plugins]#
开启rabbitmq_management 插件之后还需要重启RabbitMQ 服务才能使其正式生效。之后就可以通过浏览器访问htψ://localhost:15672/. 这样会出现一个认证登录的界面,可以通过默认的guest/guest 的用户名和密码来登录。如果访问的地址不是本地地址,比如在192.168.0.2的主机上访问http://192.168.0.3:15672 的Web 管理页面,使用默认的guest 账户是访问不了的。在之前比较古老的版本中可以访问,但是出于安全性方面的考虑,在最近的一些版本中需要使用一个具有非none 的用户角色的非guest 账户来访问Web 管理页面。
主界面
1.4、应用与集群管理
1.4.1、应用管理
指令:rabbitmqctl stop [pid_file]
用于停止运行RabbitMQ 的Erlang 虚拟机和RabbitMQ 服务应用。如果指定了pid_file,还需要等待指定进程的结束。其中pid file 是通过调用rabbitmq-server 命令启动RabbitMQ 服务时创建的,默认情况下存放于Mnesia 目录中,可以通过RABBITMQ_PID_FILE这个环境变量来改变存放路径。注意,如果使用rabbitmq-server -detach 这个带有-detach 后缀的命令来启动RabbitMQ 服务则不会生成pid file 文件。
[root@myblnp plugins]# rabbitmqctl stop
Stopping and halting node rabbit@myblnp ...
[root@myblnp plugins]# rabbitmqctl stop
Stopping and halting node rabbit@myblnp ...
Error: unable to perform an operation on node 'rabbit@myblnp'. Please see diagnostics information and suggestions below.
Most common reasons for this are:
* Target node is unreachable (e.g. due to hostname resolution, TCP connection or firewall issues)
* CLI tool fails to authenticate with the server (e.g. due to CLI tool's Erlang cookie not matching that of the server)
* Target node is not running
In addition to the diagnostics info below:
* See the CLI, clustering and networking guides on https://rabbitmq.com/documentation.html to learn more
* Consult server logs on node rabbit@myblnp
* If target node is configured to use long node names, don't forget to use --longnames with CLI tools
DIAGNOSTICS
===========
attempted to contact: [rabbit@myblnp]
rabbit@myblnp:
* connected to epmd (port 4369) on myblnp
* epmd reports: node 'rabbit' not running at all
no other nodes on myblnp
* suggestion: start the node
Current node details:
* node name: 'rabbitmqcli-185-rabbit@myblnp'
* effective user's home directory: /var/lib/rabbitmq
* Erlang cookie hash: YGXJmh5ZMPKrew0h033R/Q==
[root@myblnp plugins]#
**指令:rabbitmqctl shutdown **
用于停止运行RabbitMQ 的Erlang 虚拟机和RabbitMQ 服务应用。执行这个命令会阻塞直到Erlang 虚拟机进程退出。如果RabbitMQ 没有成功关闭,则会返回一个非零值。这个命令和rabbitmqctl stop 不同的是,它不需要指定pid_file 而可以阻塞等待指定进程的关闭。示例如下所示:
[root@myblnp ~]# rabbitmqctl shutdown
Shutting down RabbitMQ node rabbit@myblnp running at PID 15973
Waiting for PID 15973 to terminate
RabbitMQ node rabbit@myblnp running at PID 15973 successfully shut down
[root@myblnp ~]# systemctl status rabbitmq-server
● rabbitmq-server.service - RabbitMQ broker
Loaded: loaded (/usr/lib/systemd/system/rabbitmq-server.service; enabled; vendor preset: disabled)
Active: inactive (dead) since Tue 2023-09-12 10:30:16 CST; 14s ago
Process: 16437 ExecStop=/usr/sbin/rabbitmqctl shutdown (code=exited, status=69)
Process: 15973 ExecStart=/usr/sbin/rabbitmq-server (code=exited, status=0/SUCCESS)
Main PID: 15973 (code=exited, status=0/SUCCESS)
Status: "Initialized"
Sep 12 10:30:16 myblnp rabbitmqctl[16437]: attempted to contact: [rabbit@myblnp]
Sep 12 10:30:16 myblnp rabbitmqctl[16437]: rabbit@myblnp:
Sep 12 10:30:16 myblnp rabbitmqctl[16437]: * connected to epmd (port 4369) on myblnp
Sep 12 10:30:16 myblnp rabbitmqctl[16437]: * epmd reports: node 'rabbit' not running at all
Sep 12 10:30:16 myblnp rabbitmqctl[16437]: other nodes on myblnp: ['rabbitmqcli-553-rabbit']
Sep 12 10:30:16 myblnp rabbitmqctl[16437]: * suggestion: start the node
Sep 12 10:30:16 myblnp rabbitmqctl[16437]: Current node details:
Sep 12 10:30:16 myblnp rabbitmqctl[16437]: * node name: 'rabbitmqcli-239-rabbit@myblnp'
Sep 12 10:30:16 myblnp rabbitmqctl[16437]: * effective user's home directory: /var/lib/rabbitmq
Sep 12 10:30:16 myblnp rabbitmqctl[16437]: * Erlang cookie hash: YGXJmh5ZMPKrew0h033R/Q==
[root@myblnp ~]#
**指令:rabbitmqctl stop_app **
停止RabbitMQ 服务应用,但是Erlang 虚拟机还是处于运行状态。此命令的执行优先于其他管理操作(这些管理操作需要先停止RabbitMQ 应用),比如rabbitmqctl reset 。示例如下所示:
[root@myblnp ~]# rabbitmqctl stop_app
Stopping rabbit application on node rabbit@myblnp ...
[root@myblnp ~]#
指令:rabbitmqctl start_app
启动RabbitMQ 应用。此命令典型的用途是在执行了其他管理操作之后,重新启动之前停止的RabbitMQ 应用,比如rabbitmqctl reset 。示例如下:
[root@myblnp ~]# rabbitmqctl start_app
Starting node rabbit@myblnp ...
[root@myblnp ~]#
** 指令:rabbitmqctl wait [pid_file]**
等待RabbitMQ 应用的启动。它会等到pid_file 的创建,然后等待pid_file 中所代表的进程启动。当指定的进程没有启动RabbitMQ 应用而关闭时将会返回失败。
[root@myblnp ~]# rabbitmqctl wait
Error (argument validation): "No pid or pidfile specified"
Arguments given:
wait
Usage
rabbitmqctl [--node <node>] [--longnames] [--quiet] wait [<pidfile>] [--pid|-P <pid>] [--timeout <timeout>]
[root@myblnp ~]# ps -ef | grep rabbit
rabbitmq 15498 1 0 09:59 ? 00:00:00 /usr/lib64/erlang/erts-10.7.2.5/bin/epmd -daemon
rabbitmq 16483 1 1 10:30 ? 00:00:10 /usr/lib64/erlang/erts-10.7.2.5/bin/beam.smp -W w -MBas ageffcbf -MHas ageffcbf -MBlmbcs 512 -MHlmbcs 512 -MMmcs 30 -P 1048576 -t 5000000 -stbt db -zdbbl 128000 -sbwt none -sbwtdcpu none -sbwtdio none -- -root /usr/lib64/erlang -progname erl -- -home /var/lib/rabbitmq -- -pa -noshell -noinput -s rabbit boot -boot start_sasl -lager crash_log false -lager handlers [] --
rabbitmq 16498 16483 0 10:30 ? 00:00:00 erl_child_setup 32768
rabbitmq 16546 16498 0 10:30 ? 00:00:00 inet_gethost 4
rabbitmq 16547 16546 0 10:30 ? 00:00:00 inet_gethost 4
root 17591 1846 0 10:41 pts/0 00:00:00 grep --color=auto rabbit
[root@myblnp ~]# rabbitmqctl wait 16483
Waiting for pid file '16483' to appear
Error: operation wait on node rabbit@myblnp timed out. Timeout value used: 10000
[root@myblnp ~]#
** 指令:rabbitmqctl reset**
将RabbitMQ 节点重置还原到最初状态。包括从原来所在的集群中删除此节点,从管理数据库中删除所有的配置数据,如己配置的用户、vhost 等,以及删除所有的持久化消息。执行rabbitmqctl reset 命令前必须停止RabbitMQ 应用(比如先执行rabbitmqctl stop_app) 。示例如下:
[root@myblnp ~]# rabbitmqctl stop app
Stopping rabbit application on node rabbit@myblnp
[root@myblnp ~]# rabbitmqct1 reset
Resetting node rabbit@node
指令:rabbitmqctl force_reset
强制将RabbitMQ 节点重置还原到最初状态。不同于rabbitmqctl reset 命令,rabbitmqctl force_reset 命令不论当前管理数据库的状态和集群配置是什么,都会无条件地重直节点。它只能在数据库或集群配置己损坏的情况下使用。与rabbitmqctl reset命令一样,执行rabbitmqctl force_reset 命令前必须先停止RabbitMQ 应用。
[root@myblnp ~]# rabbitmqct1 stop_app
Stopping rabbit application on node rabbit@myblnp
[root@myblnp ~]# rabbitmqct1 force reset
Forcefully resetting node rabbit@myblnp
温馨提示:如果安装的rabbitmq有注册服务,并且忘记服务名的话。可以通过下面的指令查找下服务器已注册的自启服务,看下rabbitmq的完整名称。进而通过服务命令查询当前rabbitmq的服务状态。(Centos7)
systemctl list-unit-files --type=service | grep enabled
1.4.2、集群管理
指令:rabbitmqctl joio_cluster {cluster_node} [--ram]
将节点加入指定集群中。在这个命令执行前需要停止RabbitMQ 应用井重置节点。
指令:rabbitmqctl cluster_status
显示集群的状态
指令:rabbitmqctl change_cluster_node_type {disc/ram}
修改集群节点的类型。在这个命令执行前需要停止RabbitMQ 应用。
指令:rabbitmqctl forget_cluster_ node [--offiine]
将节点从集群中删除,允许离线执行。
指令:rabbitmqctl update_ cluster_nodes {clusternode}
在集群中的节点应用启动前咨询clusternode 节点的最新信息, 井更新相应的集群信息。这个和join_cluster 不同,它不加入集群。考虑这样一种情况, 节点A 和节点B 都在集群中,当节点A 离线了,节点C 又和节点B 组成了一个集群,然后节点B 又离开了集群, 当A醒来的时候,它会尝试联系节点B ,但是这样会失败, 因为节点B 己经不在集群中了。Rabbitmqctl update_cluster_nodes -n, A、C 可以解决这种场景下出现的问题。示例如下:
##假设己有 myblnp 和node 组成的集群
##1.初始状态
[root@myblnp ~]# rabbitmqctl cluster_status
Cluster status of node rabbit@myblnp ...
Basics
Cluster name: rabbit@myblnp
Disk Nodes
rabbit@myblnp
Running Nodes
rabbit@myblnp
Versions
rabbit@myblnp: RabbitMQ 3.8.13 on Erlang 22.3.4.12
Maintenance status
Node: rabbit@myblnp, status: not under maintenance
Alarms
(none)
Network Partitions
(none)
Listeners
Node: rabbit@myblnp, interface: [::], port: 15672, protocol: http, purpose: HTTP API
Node: rabbit@myblnp, interface: [::], port: 25672, protocol: clustering, purpose: inter-node and CLI tool communication
Node: rabbit@myblnp, interface: [::], port: 5672, protocol: amqp, purpose: AMQP 0-9-1 and AMQP 1.0
Feature flags
Flag: drop_unroutable_metric, state: disabled
Flag: empty_basic_get_metric, state: disabled
Flag: implicit_default_bindings, state: enabled
Flag: maintenance_mode_status, state: enabled
Flag: quorum_queue, state: enabled
Flag: user_limits, state: enabled
Flag: virtual_host_metadata, state: enabled
[root@myblnp ~]#
##2. 关闭nodel 节点的应用
[root@myblnp ~]# rabbitmqctl stop_app
Stopping rabbit application on node rabbit@myblnp
##3. 之后将node3 加入到集群中(rabbitmqctl join cluster rabbit@node2)
##4 . 再将node2 节点的应用关闭
##5 . 最后启动nodel 节点的应用, 此时会报错
[root@myblnp ~]# rabbitmqctl start_app
Starting node rabbit@myblnp
BOOT FAILED
Timeout contacting cluster nodes : [rabbit@node2) .
.. .. ..(省略)
##6. 如果在启动myblnp 节点的应用之前咨询node3 并更新相关集群信息则可以解决这个问题
[root@myblnp ~]# rabbitmqctl update_cluster_nodes rabbit@node3
Updating cluster nodes for rabbit@myblnp from rabbit@node3
[root@myblnp ~]# rabbitmqctl start_app
Starting node rabbit@myblnp
##7 . 最终集群状态
[root@myblnp ~]# rabbitmqctl cluster status
Cluster status of node rabbit@myblnp
[{nodes , [{disc, [rabbit@myblnp , rabbit@node3]}]} ,
{running_nodes , [rabbit@node3 , rabbit@myblnp]} ,
{cluster name , <<"rabbit@myblnp " >>} ,
{partitions , [] } ,
{alarms , [{rabbit@node3 , []} , {rabbit@myblnp , []}]}]
指令:rabbitmqctl force_boot
确保节点可以启动,即使它不是最后一个关闭的节点。通常情况下,当关闭整个RabbitMQ集群时,重启的第一个节点应该是最后关闭的节点,因为它可以看到其他节点所看不到的事情。但是有时会有一些异常情况出现,比如整个集群都掉电而所有节点都认为它不是最后一个关闭的。在这种情况下,可以调用rabbitmqctl force_boot 命令,这就告诉节点可以无条件地启动节点。在此节点关闭后,集群的任何变化,它都会丢失。如果最后一个关闭的节点永久丢失了,那么需要优先使用rabbitmqctl forget_cluster_node -offline 命令,因为它可以确保镜像队列的正常运转。
[root@myblnp ~]# rabbitmqctl force_boot
Forcing boot for Mnesia dir /opt/rabbitmq/var/lib/rabbitmq/mnesia/rabbit@node2
[root@myblnp ~]# rabbitmq-server -detached
指令:rabbitmqctl sync_queue [-p vhost] {queue}
指示未同步队列queue 的slave 镜像可以同步master 镜像行的内容。同步期间此队列会被阻塞(所有此队列的生产消费者都会被阻塞),直到同步完成。此条命令执行成功的前提是队列queue 配置了镜像。注意, 未同步队列中的消息被耗尽后, 最终也会变成同步,此命令主要用于未耗尽的队列。
[root@myblnp ~]# rabbitmqctl sync_queue queue
Synchronising queue 'queue ' in vhost '/'
指令:rabbitmqctl cancel_sync_queue [-p vhost] {queue}
取消队列queue 同步镜像的操作。示例如下:
[root@myblnp ~]# rabbitmqctl cancel_sync_queue queue
Stopping synchronising queue 'queue' in vhost ' /'
指令:rabbitmqctl set_cluster_name {name}
设置集群名称。集群名称在客户端连接时会通报给客户端。Federation 和Shovel 插件也会有用到集群名称的地方。集群名称默认是集群中第一个节点的名称,通过这个命令可以重新设置。在Web 管理界面的右上角有个"(change)"的地方,点击也可以修改集群名称。示例如下:
[root@myblnp ~]# rabbitmqctl cluster_status
Cluster status of node rabbit@myblnp ...
Basics
Cluster name: rabbit@myblnp
Disk Nodes
rabbit@myblnp
Running Nodes
rabbit@myblnp
Versions
rabbit@myblnp: RabbitMQ 3.8.13 on Erlang 22.3.4.12
Maintenance status
Node: rabbit@myblnp, status: not under maintenance
Alarms
(none)
Network Partitions
(none)
Listeners
Node: rabbit@myblnp, interface: [::], port: 15672, protocol: http, purpose: HTTP API
Node: rabbit@myblnp, interface: [::], port: 25672, protocol: clustering, purpose: inter-node and CLI tool communication
Node: rabbit@myblnp, interface: [::], port: 5672, protocol: amqp, purpose: AMQP 0-9-1 and AMQP 1.0
Feature flags
Flag: drop_unroutable_metric, state: disabled
Flag: empty_basic_get_metric, state: disabled
Flag: implicit_default_bindings, state: enabled
Flag: maintenance_mode_status, state: enabled
Flag: quorum_queue, state: enabled
Flag: user_limits, state: enabled
Flag: virtual_host_metadata, state: enabled
[root@myblnp ~]# rabbitmqctl set_cluster_name myblnps
Setting cluster name to myblnps ...
[root@myblnp ~]# rabbitmqctl cluster_status
Cluster status of node rabbit@myblnp ...
Basics
Cluster name: myblnps
Disk Nodes
rabbit@myblnp
Running Nodes
rabbit@myblnp
Versions
rabbit@myblnp: RabbitMQ 3.8.13 on Erlang 22.3.4.12
Maintenance status
Node: rabbit@myblnp, status: not under maintenance
Alarms
(none)
Network Partitions
(none)
Listeners
Node: rabbit@myblnp, interface: [::], port: 15672, protocol: http, purpose: HTTP API
Node: rabbit@myblnp, interface: [::], port: 25672, protocol: clustering, purpose: inter-node and CLI tool communication
Node: rabbit@myblnp, interface: [::], port: 5672, protocol: amqp, purpose: AMQP 0-9-1 and AMQP 1.0
Feature flags
Flag: drop_unroutable_metric, state: disabled
Flag: empty_basic_get_metric, state: disabled
Flag: implicit_default_bindings, state: enabled
Flag: maintenance_mode_status, state: enabled
Flag: quorum_queue, state: enabled
Flag: user_limits, state: enabled
Flag: virtual_host_metadata, state: enabled
[root@myblnp ~]#
1.5、服务端状态
1.5.1、rabbitmqctl list_queues
完整命令:rabbitmqctl list_queues [-p vhost] [queueinfoitem ……]
此命令返回队列的详细信息,如果无[-p vhost] 参数,将显示默认的vhost 为" /" 中的队列详情。queueinfoitem 参数用于指示哪些队列的信息项会包含在结果集中,结果集的列顺序将匹配参数的顺序。queueinfoitem 可以是下面列表中的任何值。
name: 队列名称。
durable: 队列是否持久化。
auto_delete: 队列是否自动删除。
arguments : 队列的参数。
policy : 应用到队列上的策略名称。
pid: 队列关联的Erlang 进程的ID 。
owner_pid: 处理排他队列连接的Erlang 进程D。如果此队列是非排他的,此值将为空。
exclusive: 队列是否是排他的。
exclusive_consumer_pid: 订阅到此排他队列的消费者相关的信道关联的Erlang进程ID 。如果此队列是非排他的,此值将为空。
exclusive_consumer_tag : 订阅到此排他队列的消费者的consumerTag 。如果此队列是非排他的,此值将为空。
messages_ready: 准备发送给客户端的消息个数。
messages_unacknowledged: 发送给客户端但尚未应答的消息个数。
messages: 准备发送给客户端和未应答消息的总和。
messages_ready_ram: 驻留在内存中messages_ready 的消息个数。
messages_unacknowledged_ram: 驻留在内存中messages_unac_knowledged的消息个数。
messages_ram : 驻留在内存中的消息总数。
messages_persistent : 队列中持久化消息的个数。对于非持久化队列来说总是0 。
messages_bytes: 队列中所有消息的大小总和。这里不包括消息属性或者任何其他开销
messages_bytes_ready: 准备发送给客户端的消息的大小总和。
messages_bytes_unacknowledged: 发送给客户端但尚未应答的消息的大小总和。
messages_bytes_ram: 驻留在内存中的messages_bytes 。
messages_bytes_persistent: 队列中持久化的messages_bytes 。
disk_reads: 从队列启动开始,己从磁盘中读取该队列的消息总次数。
disk_writes: 从队列启动开始,己向磁盘队列写消息的总次数。
consumer: 消费者数目。
consumer_utilisation: 队列中的消息能够立刻投递给消费者的比率,介于0 和1之间。这个受网络拥塞或者Basic.Qos 的影响而小于1 。
memory: 与队列相关的Erlang 进程所消耗的内存字节数,包括栈、堆及内部结构。
slave_pids: 如果队列是镜像的,列出所有slave 镜像的pid 。
synchronised_slave_pids: 如果队列是镜像的,列出所有己经同步的slave 镜像的pid 。
state : 队列状态。正常情况下是running : 如果队列正常同步数据可能会有"{syncing, MsgCount}" 的状态;如果队列所在的节点掉线了,则队列显示状态为down (此时大多数的queueinfoitems 也将不可用〉。
如果没有指定queueinfoitems ,那么此命令将显示队列的名称和消息的个数。相关示例如下:
[root@myblnp ~]# rabbitmqctl list_queues
Timeout: 60.0 seconds ...
Listing queues for vhost / ...
name messages
queue.normal 0
myAe_test 0
queue_demo 0
queue.dlx 1
queue.priority 1
[root@myblnp ~]# rabbitmqctl list_queues name
Timeout: 60.0 seconds ...
Listing queues for vhost / ...
name
queue.normal
myAe_test
queue_demo
queue.dlx
queue.priority
[root@myblnp ~]# rabbitmqctl list_queues name,durable
Timeout: 60.0 seconds ...
Listing queues for vhost / ...
name durable
queue.normal true
myAe_test true
queue_demo true
queue.dlx true
queue.priority true
[root@myblnp ~]# rabbitmqctl list_queues name,durable,arguments
Timeout: 60.0 seconds ...
Listing queues for vhost / ...
name durable arguments
queue.normal true [{"x-dead-letter-exchange","exchange.dlx"},{"x-message-ttl",10000},{"x-dead-letter-routing-key","routingkey"}]
myAe_test true [{"x-queue-type","classic"}]
queue_demo true []
queue.dlx true []
queue.priority true [{"x-max-priority",10}]
[root@myblnp ~]# rabbitmqctl list_queues name,durable,policy
Timeout: 60.0 seconds ...
Listing queues for vhost / ...
name durable policy
queue.normal true
myAe_test true
queue_demo true
queue.dlx true
queue.priority true
[root@myblnp ~]# rabbitmqctl list_queues name,durable,policy,pid
Timeout: 60.0 seconds ...
Listing queues for vhost / ...
name durable policy pid
queue.normal true <[email protected]>
myAe_test true <[email protected]>
queue_demo true <[email protected]>
queue.dlx true <[email protected]>
queue.priority true <[email protected]>
[root@myblnp ~]# rabbitmqctl list_queues name,durable,policy,pid,owner_pid
Timeout: 60.0 seconds ...
Listing queues for vhost / ...
name durable policy pid owner_pid
queue.normal true <[email protected]>
myAe_test true <[email protected]>
queue_demo true <[email protected]>
queue.dlx true <[email protected]>
queue.priority true <[email protected]>
[root@myblnp ~]#
1.5.2、rabbitmqctl list_exchanges
完整命令:rabbitmqctl list_exchanges [-p vhost] [exchangeinfoitem ...]
返回交换器的详细细节,如果无[ - p vhost] 参数,将显示默认的vhost 为 "/ " 中的交换器详情。exchangeinfoitem 参数用于指示哪些信息项会包含在结果集中,结果集的列顺序将匹配参数的顺序。exchangeinfoitem 可以是下面列表中的任何值。
name: 交换器的名称。
type: 交换器的类型。
durable : 设置是否持久化。durable 设置为true 表示持久化,反之是非持久化。持久化可以将交换器信息存盘, 而在服务器重启的时候不会丢失相关信息。
auto_delete : 设直是否自动删除。
internal : 是否是内置的。
arguments : 其他一些结构化参数,比如alternate-exchange 。
policy : 应用到交换器上的策略名称。
exchangeinfoitem 的内容和客户端中的channel.exchangeDeclare 方法的参数基本一致。如果没有指定exchangeinfoitem. 那么此命令将显示交换器的名称和类型。相关示例如下:
[root@myblnp ~]# rabbitmqctl list_exchanges
Listing exchanges for vhost / ...
name type
myAE fanout
amq.match headers
exchange_demo direct
direct
exchange.priority fanout
amq.rabbitmq.trace topic
exchange.dlx direct
amq.topic topic
amq.fanout fanout
exchange.normal fanout
amq.direct direct
amq.headers headers
[root@myblnp ~]# rabbitmqctl list_exchanges name type durable auto_delete internal arguments policy -q
name type durable auto_delete internal arguments policy
myAE fanout true false false []
amq.match headers true false false []
exchange_demo direct true false false [] AE2
direct true false false []
exchange.priority fanout true false false []
amq.rabbitmq.trace topic true false true []
exchange.dlx direct true false false []
amq.topic topic true false false []
amq.fanout fanout true false false []
exchange.normal fanout true false false []
amq.direct direct true false false []
amq.headers headers true false false []
[root@myblnp ~]#
1.5.3、rabbitmqctl list_bindings
完整命令:rabbitmqctl list_bindings [-p vhost] [bindinginfoitem ...]
返回绑定关系的细节, 如果无[-p vhost] 参数, 将显示默认的vhost 为"/"中的绑定关系详情。bindinginfoitem 参数用于指示哪些信息项会包含在结果集中,结果集的列顺序将匹配参数的顺序。bindinginfoitem 可以是下面列表中的任何值。
source_name: 绑定中消息来源的名称。
source_kind: 绑定中消息来源的类别。
destination_name: 绑定中消息目的地的名称。
destination_kind: 绑定中消息目的地的种类。
routing_key: 绑定的路由键。
arguments: 绑定的参数。
如果没有指定bindinginfoitem,那么将显示所有的条目。相关示例如下:
[root@myblnp ~]# rabbitmqctl list_bindings -q
source_name source_kind destination_name destination_kind routing_key arguments
exchange queue.normal queue queue.normal []
exchange myAe_test queue myAe_test []
exchange queue_demo queue queue_demo []
exchange queue.dlx queue queue.dlx []
exchange queue.priority queue queue.priority []
exchange.dlx exchange queue.dlx queue routingkey []
exchange.normal exchange queue.normal queue []
exchange.priority exchange queue.priority queue routingkey []
exchange_demo exchange queue_demo queue routingKey_demo []
myAE exchange myAe_test queue []
[root@myblnp ~]#
1.5.4、rabbìtmqctl lìst_connectìons
完整命令:rabbìtmqctl lìst_connectìons [connectìonìnfoìtem ...]
返回TCP/IP连接的统计信息。connectioninfoitem 参数用于指示哪些信息项会包含在结果集中,结果集的列顺序将匹配参数的顺序。connectioninfoitem 可以是下面列表中的任何值。
pid: 与连接相关的Erlang 进程ID 。
name: 连接的名称。
port: 服务器端口。
host: 返回反向DNS 获取的服务器主机名称,或者IP 地址,或者未启用。
peer_port: 服务器对端端口。当一个客户端与服务器连接时,这个客户端的端口就是peer_port 。
peer_host: 返回反向DNS 获取的对端主机名称,或者IP 地址,或者未启用。
ssl: 是否启用SSL 。
ssl_protoco1: SSL 协议,如tlsvl 。
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-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 : 连接建立的时间戳。
如果没有指定connectioninfoitem , 那么会显示user 、peer_host 、peer_port和state 这几项信息。相关示例如下:
[root@myblnp ~]# rabbitmqctl list_connections
Listing connections ...
user peer_host peer_port state
admin 192.168.56.1 50077 running
[root@myblnp ~]# rabbitmqctl list_connections pid,name,host,recv_cnt,channel_max
Listing connections ...
pid name host recv_cnt channel_max
<[email protected]> 192.168.56.1:50077 -> 192.168.56.106:5672 192.168.56.106 9 2047
[root@myblnp ~]#
1.5.5、rabbitmqctl list_ channels
完整命令:rabbitmqctl list_ channels [channelinfoitem ...]
返回当前所有信道的信息。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 confmn 模式下,则此值为0 。
perfetch_count : 新消费者的Qos 个数限制。0 表示无上限。
global_prefetch_count: 整个信道的Qos 个数限制。0 表示无上限。
如果没有指定channelinfoitem ,那么会显示pid 、user 、consumer count 和messages unacknowledged 这几项信息。相关示例如下:
[root@myblnp ~]# rabbitmqctl list_channels
Listing channels ...
pid user consumer_count messages_unacknowledged
<[email protected]> admin 1 0
[root@myblnp ~]# rabbitmqctl list_channels user,transactional,confirm,consumer_count
Listing channels ...
user transactional confirm consumer_count
admin false false 1
[root@myblnp ~]#
1.5.6、rabbitmqctl list_consumers
完整命令:rabbitmqctl list_consumers [-p vhost]
列举消费者信息。每行将显示由制表符分隔的己订阅队列的名称、相关信道的进程标识、consumerTag 、是否需要消费端确认、prefetch_ count 及参数列表这些信息。相关示例如下:
[root@myblnp ~]# rabbitmqctl list_consumers
Listing consumers in vhost / ...
queue_name channel_pid consumer_tag ack_required prefetch_count active arguments
amq.gen-YkY491597YmmGfe0WEIxdw <[email protected]> amq.ctag-1Zw0NLMwNGA-VeEmsDAE6g false 0 true []
[root@myblnp ~]#
1.5.7、rabbitmqctl status
显示Broker 的状态, 比如当前Erlang 节点上运行的应用程序、RabbitMQ/Erlang 的版本信息、os 的名称、内存及文件描述符等统计信息。
[root@myblnp ~]# rabbitmqctl status
Status of node rabbit@myblnp ...
Runtime
OS PID: 16483
OS: Linux
Uptime (seconds): 17986
Is under maintenance?: false
RabbitMQ version: 3.8.13
Node name: rabbit@myblnp
Erlang configuration: Erlang/OTP 22 [erts-10.7.2.5] [source] [64-bit] [smp:2:2] [ds:2:2:10] [async-threads:1] [hipe]
Erlang processes: 474 used, 1048576 limit
Scheduler run queue: 1
Cluster heartbeat timeout (net_ticktime): 60
Plugins
Enabled plugin file: /etc/rabbitmq/enabled_plugins
Enabled plugins:
* rabbitmq_management
* amqp_client
* rabbitmq_web_dispatch
* cowboy
* cowlib
* rabbitmq_management_agent
Data directory
Node data directory: /var/lib/rabbitmq/mnesia/rabbit@myblnp
Raft data directory: /var/lib/rabbitmq/mnesia/rabbit@myblnp/quorum/rabbit@myblnp
Config files
Log file(s)
* /var/log/rabbitmq/[email protected]
* /var/log/rabbitmq/rabbit@myblnp_upgrade.log
Alarms
(none)
Memory
Total memory used: 0.0878 gb
Calculation strategy: rss
Memory high watermark setting: 0.4 of available memory, computed to: 1.5893 gb
code: 0.0273 gb (30.59 %)
other_proc: 0.0238 gb (26.64 %)
allocated_unused: 0.016 gb (17.9 %)
other_system: 0.0133 gb (14.93 %)
other_ets: 0.0033 gb (3.74 %)
plugins: 0.0019 gb (2.1 %)
atom: 0.0016 gb (1.76 %)
binary: 0.0009 gb (0.98 %)
mgmt_db: 0.0003 gb (0.39 %)
queue_procs: 0.0003 gb (0.28 %)
metrics: 0.0003 gb (0.28 %)
mnesia: 0.0001 gb (0.13 %)
connection_other: 0.0001 gb (0.12 %)
msg_index: 0.0001 gb (0.07 %)
quorum_ets: 0.0 gb (0.05 %)
connection_readers: 0.0 gb (0.03 %)
connection_channels: 0.0 gb (0.01 %)
connection_writers: 0.0 gb (0.0 %)
queue_slave_procs: 0.0 gb (0.0 %)
quorum_queue_procs: 0.0 gb (0.0 %)
reserved_unallocated: 0.0 gb (0.0 %)
File Descriptors
Total: 8, limit: 32671
Sockets: 1, limit: 29401
Free Disk Space
Low free disk space watermark: 0.05 gb
Free disk space: 0.1821 gb
Totals
Connection count: 1
Queue count: 6
Virtual host count: 2
Listeners
Interface: [::], port: 15672, protocol: http, purpose: HTTP API
Interface: [::], port: 25672, protocol: clustering, purpose: inter-node and CLI tool communication
Interface: [::], port: 5672, protocol: amqp, purpose: AMQP 0-9-1 and AMQP 1.0
[root@myblnp ~]#
1.5.8、rabbitmqctl node_health_check
对RabbitMQ 节点进行健康检查, 确认应用是否正常运行、list_queues 和list_channels是否能够正常返回等。相关示例如下:
[root@myblnp ~]# rabbitmqctl node_health_check
This command is DEPRECATED and will be removed in a future version.
It performs intrusive, opinionated health checks and requires a fully booted node.
Use one of the options covered in https://www.rabbitmq.com/monitoring.html#health-checks instead.
Timeout: 70 seconds ...
Checking health of node rabbit@myblnp ...
Health check passed
[root@myblnp ~]#
1.5.9、rabbitmqctl environment
显示每个运行程序环境中每个变量的名称和值。
[root@myblnp ~]# rabbitmqctl environment
Application environment of node rabbit@myblnp ...
[{amqp_client,
[{prefer_ipv6,false},{ssl_options,[]},{writer_gc_threshold,1000000000}]},
{asn1,[]},
{aten,
[{detection_threshold,0.99},
{heartbeat_interval,100},
{poll_interval,5000},
{scaling_factor,1.5}]},
{compiler,[]},
{cowboy,[]},
{cowlib,[]},
{credentials_obfuscation,[{enabled,true}]},
{crypto,[{fips_mode,false},{rand_cache_size,896}]},
{cuttlefish,[]},
{gen_batch_server,[]},
{goldrush,[]},
{inets,[]},
{jsx,[]},
{kernel,
[{inet_default_connect_options,[{nodelay,true}]},
{inet_dist_listen_max,25672},
{inet_dist_listen_min,25672},
{logger,
[{handler,default,logger_std_h,
#{config => #{type => standard_io},
formatter =>
{logger_formatter,
#{legacy_header => true,single_line => false}}}}]},
{logger_level,notice},
{logger_sasl_compatible,false},
{shutdown_func,{rabbit_prelaunch,shutdown_func}}]},
{lager,
[{async_threshold,20},
{async_threshold_window,5},
{colored,false},
{colors,
[{debug,"\e[0;38m"},
{info,"\e[1;37m"},
{notice,"\e[1;36m"},
{warning,"\e[1;33m"},
{error,"\e[1;31m"},
{critical,"\e[1;35m"},
{alert,"\e[1;44m"},
{emergency,"\e[1;41m"}]},
{crash_log,"log/crash.log"},
{crash_log_count,5},
{crash_log_date,"$D0"},
{crash_log_msg_size,65536},
{crash_log_rotator,lager_rotator_default},
{crash_log_size,10485760},
{error_logger_format_raw,true},
{error_logger_hwm,500000},
{error_logger_hwm_original,5000},
{error_logger_redirect,true},
{extra_sinks,
[{rabbit_log_upgrade_lager_event,
[{handlers,
[{lager_file_backend,
[{date,[]},
{file,"/var/log/rabbitmq/rabbit@myblnp_upgrade.log"},
{formatter_config,
[date," ",time," ",color,"[",severity,"] ",
{pid,[]},
" ",message,"\n"]},
{level,info},
{size,0}]}]},
{rabbit_handlers,
[{lager_file_backend,
[{date,[]},
{file,"/var/log/rabbitmq/rabbit@myblnp_upgrade.log"},
{formatter_config,
[date," ",time," ",color,"[",severity,"] ",
{pid,[]},
" ",message,"\n"]},
{level,info},
{size,0}]}]}]},
{rabbit_log_shovel_lager_event,
[{handlers,[{lager_forwarder_backend,[lager_event,info]}]},
{rabbit_handlers,
[{lager_forwarder_backend,[lager_event,info]}]}]},
{rabbit_log_ra_lager_event,
[{handlers,[{lager_forwarder_backend,[lager_event,info]}]},
{rabbit_handlers,
[{lager_forwarder_backend,[lager_event,info]}]}]},
{rabbit_log_queue_lager_event,
[{handlers,[{lager_forwarder_backend,[lager_event,info]}]},
{rabbit_handlers,
[{lager_forwarder_backend,[lager_event,info]}]}]},
{rabbit_log_prelaunch_lager_event,
[{handlers,[{lager_forwarder_backend,[lager_event,info]}]},
{rabbit_handlers,
[{lager_forwarder_backend,[lager_event,info]}]}]},
{rabbit_log_mirroring_lager_event,
[{handlers,[{lager_forwarder_backend,[lager_event,info]}]},
{rabbit_handlers,
[{lager_forwarder_backend,[lager_event,info]}]}]},
{rabbit_log_ldap_lager_event,
[{handlers,[{lager_forwarder_backend,[lager_event,info]}]},
{rabbit_handlers,
[{lager_forwarder_backend,[lager_event,info]}]}]},
{rabbit_log_federation_lager_event,
[{handlers,[{lager_forwarder_backend,[lager_event,info]}]},
{rabbit_handlers,
[{lager_forwarder_backend,[lager_event,info]}]}]},
{rabbit_log_feature_flags_lager_event,
[{handlers,[{lager_forwarder_backend,[lager_event,info]}]},
{rabbit_handlers,
[{lager_forwarder_backend,[lager_event,info]}]}]},
{rabbit_log_connection_lager_event,
[{handlers,[{lager_forwarder_backend,[lager_event,info]}]},
{rabbit_handlers,
[{lager_forwarder_backend,[lager_event,info]}]}]},
{rabbit_log_channel_lager_event,
[{handlers,[{lager_forwarder_backend,[lager_event,info]}]},
{rabbit_handlers,
[{lager_forwarder_backend,[lager_event,info]}]}]},
{rabbit_log_lager_event,
[{handlers,[{lager_forwarder_backend,[lager_event,info]}]},
{rabbit_handlers,
[{lager_forwarder_backend,[lager_event,info]}]}]},
{error_logger_lager_event,
[{handlers,[{lager_forwarder_backend,[lager_event,info]}]},
{rabbit_handlers,
[{lager_forwarder_backend,[lager_event,info]}]}]}]},
{handlers,
[{lager_file_backend,
[{date,[]},
{file,"/var/log/rabbitmq/[email protected]"},
{formatter_config,
[date," ",time," ",color,"[",severity,"] ",
{pid,[]},
" ",message,"\n"]},
{level,debug},
{size,0}]}]},
{log_root,"/var/log/rabbitmq"},
{rabbit_handlers,
[{lager_file_backend,
[{date,[]},
{file,"/var/log/rabbitmq/[email protected]"},
{formatter_config,
[date," ",time," ",color,"[",severity,"] ",
{pid,[]},
" ",message,"\n"]},
{level,debug},
{size,0}]}]}]},
{mnesia,[{dir,"/var/lib/rabbitmq/mnesia/rabbit@myblnp"}]},
{observer_cli,[{plugins,[]},{scheduler_usage,disable}]},
{os_mon,
[{start_cpu_sup,false},
{start_disksup,false},
{start_memsup,false},
{start_os_sup,false}]},
{public_key,[]},
{ra,[{data_dir,"/var/lib/rabbitmq/mnesia/rabbit@myblnp/quorum"},
{logger_module,rabbit_log_ra_shim},
{wal_max_batch_size,4096},
{wal_max_size_bytes,536870912}]},
{rabbit,
[{auth_backends,[rabbit_auth_backend_internal]},
{auth_mechanisms,['PLAIN','AMQPLAIN']},
{autocluster,
[{peer_discovery_backend,rabbit_peer_discovery_classic_config}]},
{autoheal_state_transition_timeout,60000},
{background_gc_enabled,false},
{background_gc_target_interval,60000},
{backing_queue_module,rabbit_priority_queue},
{channel_max,2047},
{channel_operation_timeout,15000},
{channel_tick_interval,60000},
{cluster_keepalive_interval,10000},
{cluster_nodes,{[],disc}},
{cluster_partition_handling,ignore},
{collect_statistics,fine},
{collect_statistics_interval,5000},
{config_entry_decoder,[{passphrase,undefined}]},
{connection_max,infinity},
{credit_flow_default_credit,{400,200}},
{default_consumer_prefetch,{false,0}},
{default_permissions,[<<".*">>,<<".*">>,<<".*">>]},
{default_user,<<"guest">>},
{default_user_tags,[administrator]},
{default_vhost,<<"/">>},
{delegate_count,16},
{disk_free_limit,50000000},
{disk_monitor_failure_retries,10},
{disk_monitor_failure_retry_interval,120000},
{enabled_plugins_file,"/etc/rabbitmq/enabled_plugins"},
{feature_flags_file,
"/var/lib/rabbitmq/mnesia/rabbit@myblnp-feature_flags"},
{fhc_read_buffering,false},
{fhc_write_buffering,true},
{frame_max,131072},
{halt_on_upgrade_failure,true},
{handshake_timeout,10000},
{heartbeat,60},
{lager_default_file,"/var/log/rabbitmq/[email protected]"},
{lager_log_root,"/var/log/rabbitmq"},
{lager_upgrade_file,"/var/log/rabbitmq/rabbit@myblnp_upgrade.log"},
{lazy_queue_explicit_gc_run_operation_threshold,1000},
{log,
[{file,[{file,"/var/log/rabbitmq/[email protected]"}]},
{categories,
[{upgrade,
[{file,
"/var/log/rabbitmq/rabbit@myblnp_upgrade.log"}]}]}]},
{loopback_users,[<<"guest">>]},
{max_message_size,134217728},
{memory_monitor_interval,2500},
{mirroring_flow_control,true},
{mirroring_sync_batch_size,4096},
{mnesia_table_loading_retry_limit,10},
{mnesia_table_loading_retry_timeout,30000},
{msg_store_credit_disc_bound,{4000,800}},
{msg_store_file_size_limit,16777216},
{msg_store_index_module,rabbit_msg_store_ets_index},
{msg_store_io_batch_size,4096},
{msg_store_shutdown_timeout,600000},
{num_ssl_acceptors,10},
{num_tcp_acceptors,10},
{password_hashing_module,rabbit_password_hashing_sha256},
{plugins_dir,
"/usr/lib/rabbitmq/plugins:/usr/lib/rabbitmq/lib/rabbitmq_server-3.8.13/plugins"},
{plugins_expand_dir,
"/var/lib/rabbitmq/mnesia/rabbit@myblnp-plugins-expand"},
{proxy_protocol,false},
{queue_explicit_gc_run_operation_threshold,1000},
{queue_index_embed_msgs_below,4096},
{queue_index_max_journal_entries,32768},
{quorum_cluster_size,3},
{quorum_commands_soft_limit,32},
{reverse_dns_lookups,false},
{server_properties,[]},
{ssl_allow_poodle_attack,false},
{ssl_apps,[asn1,crypto,public_key,ssl]},
{ssl_cert_login_from,distinguished_name},
{ssl_handshake_timeout,5000},
{ssl_listeners,[]},
{ssl_options,[]},
{tcp_listen_options,
[{backlog,128},
{nodelay,true},
{linger,{true,0}},
{exit_on_close,false}]},
{tcp_listeners,[{"auto",5672}]},
{trace_vhosts,[]},
{track_auth_attempt_source,false},
{tracking_execution_timeout,15000},
{vhost_restart_strategy,continue},
{vm_memory_calculation_strategy,rss},
{vm_memory_high_watermark,0.4},
{vm_memory_high_watermark_paging_ratio,0.5},
{writer_gc_threshold,1000000000}]},
{rabbit_common,[]},
{rabbitmq_management,
[{content_security_policy,
"script-src 'self' 'unsafe-eval' 'unsafe-inline'; object-src 'self'"},
{cors_allow_origins,[]},
{cors_max_age,1800},
{http_log_dir,none},
{load_definitions,none},
{management_db_cache_multiplier,5},
{process_stats_gc_timeout,300000},
{stats_event_max_backlog,250}]},
{rabbitmq_management_agent,
[{rates_mode,basic},
{sample_retention_policies,
[{global,[{605,5},{3660,60},{29400,600},{86400,1800}]},
{basic,[{605,5},{3600,60}]},
{detailed,[{605,5}]}]}]},
{rabbitmq_prelaunch,[]},
{rabbitmq_web_dispatch,[]},
{ranch,[]},
{recon,[]},
{sasl,[{errlog_type,error},{sasl_error_logger,false}]},
{ssl,[]},
{stdlib,[]},
{stdout_formatter,[]},
{syntax_tools,[]},
{sysmon_handler,
[{busy_dist_port,true},
{busy_port,false},
{gc_ms_limit,0},
{heap_word_limit,0},
{port_limit,100},
{process_limit,100},
{schedule_ms_limit,0}]},
{tools,[{file_util_search_methods,[{[],[]},{"ebin","esrc"},{"ebin","src"}]}]},
{xmerl,[]}]
[root@myblnp ~]#
[root@myblnp ~]# rabbitmqctl environment --formatter=json
1.5.10、rabbitmqctl report
为所有服务器状态生成一个服务器状态报告,井将输出重定向到一个文件。相关示例如下:
[root@myblnp ~]# rabbitmqctl report > report.txt
[root@myblnp ~]# ls
anaconda-ks.cfg arthas logs mayfly report.txt rubbish soft
[root@myblnp ~]# cat report.txt
Reporting server status of node rabbit@myblnp ...
Status of node rabbit@myblnp ...
Runtime
OS PID: 16483
OS: Linux
Uptime (seconds): 19850
Is under maintenance?: false
RabbitMQ version: 3.8.13
……
exchange.normal exchange queue.normal queue []
exchange.priority exchange queue.priority queue routingkey []
exchange_demo exchange queue_demo queue routingKey_demo []
myAE exchange myAe_test queue []
Listing permissions for vhost "/" ...
user configure write read
admin .* .* .*
guest .* .* .*
Listing policies for vhost "/" ...
vhost name pattern apply-to definition priority
/ AE2 ^exchange_demo$ all {"alternate-exchange":"myAE"} 0
Listing global runtime parameters ...
name value
cluster_name "myblnps"
internal_cluster_id "rabbitmq-cluster-id-jpA-C8h6S2NRi300jibXlQ"
Listing runtime parameters for vhost "/" ...
[root@myblnp ~]#
1.5.11、rabbitmqctl eval {expr}
执行任意Erlang 表达式。相关示例如下(示例命令用于返回rabbitmqctl 连接的节点名称) :
[root@myblnp ~]# rabbitmqctl eval 'node().'
rabbit@myblnp
[root@myblnp ~]#
1.6、eval 的扩展
用户、Parameter 、vhost、权限等都可以通过rabbitmqctl 工具来完成创建(或删除)的操作,反观交换器、队列及绑定关系的创建(或删除)操作并无相应的rabbitmqctl 工具类的命令,到目前为止介绍的只有通过客户端或者Web 管理界面来完成,这对于 CLI 的使用爱好者来说无疑是一种遗憾。
实际上可以通过 rabbitmqctl eval {expr} 以"曲线救国"的形式实现通过 rabbitmqctl 工具来创建交换器、队列及绑定关系。执行下面三条命令就可以创建一个交换器exchange2 、一个队列queue2 并通过绑定键rk2进行绑定。
#反馈错误(创建交换机)
[root@myblnp ~]# rabbitmqctl eval 'rabbit_exchange:declare({resource , << "/" >> , exchange , << "exchange2">>} , direct , true , false , false , []).'
Error:
{:undef, [{:rabbit_exchange, :declare, [{:resource, "/", :exchange, "exchange2"}, :direct, true, false, false, []], []}, {:erl_eval, :do_apply, 6, [file: 'erl_eval.erl', line: 680]}, {:rpc, :"-handle_call_call/6-fun-0-", 5, [file: 'rpc.erl', line: 197]}]}
#正确示例(创建交换机)
[root@myblnp ~]# rabbitmqctl eval 'rabbit_exchange:declare({resource , << "/" >> , exchange , << "exchange2">>} , direct , true , false , false , [],<<"admin">>).'
{exchange,{resource,<<"/">>,exchange,<<"exchange2">>},
direct,true,false,false,[],undefined,undefined,undefined,
{[],[]},
#{user => <<"admin">>}}
[root@myblnp ~]#
上面的示例里,第一次执行失败了返回对应的错误信息。这是因为我使用的rabbitmq版本是“3.8.13”版本,在低于3.7.0版本的使用这条命令是可以正常执行的。高于这个版本需要添加参数【<<"admin">>】代理用户,否则会出现上述错误。
#创建队列
[root@myblnp ~]# rabbitmqctl eval 'rabbit_amqqueue:declare({resource,<<"/">>,queue,<<"queue2">>},true,false,[],none,<<"admin">>).'
{new,{amqqueue,{resource,<<"/">>,queue,<<"queue2">>},
true,false,none,[],<11270.9012.0>,[],[],[],undefined,undefined,
[],[],live,0,[],<<"/">>,
#{user => <<"admin">>},
rabbit_classic_queue,#{}}}
[root@myblnp ~]#
#绑定队列到指定交换机并指定路由key
[root@myblnp ~]# rabbitmqctl eval 'rabbit_binding:add({binding,{resource,<<"/">>,exchange,<<"exchange2">>},<<"rk2">>,{resource,<<"/">>,queue,<<"queue2">>},[]},<<"admin">>).'
ok
[root@myblnp ~]#
其实这里是调用了Erlang 中对应模块的相应函数,语法类似"Module:Function(Arg) ."。对于交换器的创建,则调用了rabbit_exchange 模块的declare 函数, 该函数具体声明为:
#尤为注意这个“.”,缺少了是不完整的并且无法执行
declare(XName , Type , Durable , AutoDelete , Internal , Args) .
不同的RabbitMQ 版本参数会略有差异,比如高版本会多个Username 参数,采用上面的定义可以在多个当前主流版本中创建交换器。对应的参数如下所述。
XName : 交换器的命名细节,具体格式为{resource , VHost , exchange , Name} 。VHost 为虚拟主机的名称, Name 为交换器的名称。注意VHost 和Name 需要以"<<>> "包裹,标注为binary 类型。
Type : 交换器的类型,可选值为direct 、headers 、topic 和fanout
Durable : 是否需要持久化。
AutoDelete : 是否自动删除。
Internal: 是否是内置的交换器。
Args: 交换器的其他选项参数, 一般设置为[]。
与创建交换器对应的删除操作为调用rabbit_exchange 模块的delete 函数,示例如下:
[root@myblnp ~]# rabbitmqctl eval 'rabbit_exchange:delete({resource,<<"/">>,exchange,<<"exchange2">>},false,<<"admin">>).'
ok
[root@myblnp ~]#
对于队列的创建,则调用了rabbit_amqqueue 模块的declare 函数, 该函数具体声明为:
declare(QueueName , Durable , AutoDelete , Args , Owner).
不同的RabbitMQ 版本参数会略有差异,比如高版本会多一个ActingUser 参数,采用上面的定义可以在多个当前主流版本中创建交换器。对应的参数如下所述。
QueueName : 队列的命名细节, 具体格式为{resource , VHost , queue , Name} 。VHost 为虚拟主机的名称, Name 为交换器的名称。注意VHost 和Name 需要以"<<>> "包裹,标注为binary 类型。
Durable: 是否需要持久化。
AutoDelete : 是否自动删除。
Args: 队列的其他选项参数, 一般设置为[] 。
Owner : 用于队列的独占模式, 一般设置为none 。
与创建队列对应的删除操作为调用rabbit_amqqueue 模块的internal_delete 函数,示例如下:
[root@myblnp ~]# rabbitmqctl eval 'rabbit_amqqueue:internal_delete({resource, <<"/">>,queue, <<"queue2">>},<<"admin">>).'
ok
[root@myblnp ~]#
与创建绑定关系对应的解绑操作为调用rabbit_binding 模块的remove 函数, 示例如下:
rabbitmqctl eval 'rabbit_binding:remove({binding, {resource, <<"/">>,exchange, <<"exchange2">>},<<"rk2">>,{resource,<<"/">>,queue,<<"queue2">>},[],<<"admin">>}).'
ok
技巧:若要删除所有的交换器、队要IJ 及绑定关系,删除对应的vhost 就可以"一键搞定",而不需要一个个边历删除。
1.7、HTTP API接口管理
RabbitMQ Management 插件不仅提供了Web 管理界面, 还提供了HTTPAPI 接口来方便调用。比如创建一个队列,就可以通过PUT 方法调用/api/queues/vhost/{name} 接口来实现。下面的示例通过curl 命令调用接口来完成队列queue 的创建:
[root@myblnp ~]# curl -i -u admin:admin@123 -H "content-type:application/json" -XPUT -d '{"auto_delete":false,"durable":true,"node":"rabbit@myblnp"}' http://192.168.56.106:15672/api/queues/%2F/queue
HTTP/1.1 201 Created
content-length: 0
content-security-policy: script-src 'self' 'unsafe-eval' 'unsafe-inline'; object-src 'self'
date: Tue, 12 Sep 2023 09:29:22 GMT
server: Cowboy
vary: accept, accept-encoding, origin
[root@myblnp ~]#
注意上面命令中的"%2F" 是指默认的vhost,即" / ", 这类特殊字符在HTTPURL 中是需要转义的。这里的curl 命令又为创建( 或删除)交换器、队列及绑定关系提供了另一种CLI的实现方式。所有的HTTPAPI 接口都需要HTTP 基础认证(使用标准的RabbitMQ 用户数据库),默认的是guest/guest 。 非localhost 的不能使用这组认证,除非特殊设置)。
这里的HTTPAPI 是完全基于RESTFUL 风格的, 不同的HTTPAPI 接口所对应的HTTP 方法各不相同, 这里一共涉及4 种HTTP 方法: GET, PUT 、DELETE 和POST。 GET 方法一般用来获取如集群、节点、队列、交换器等信息。PUT 方法用来创建资源, 如交换器、队列之类的。DELETE 方法用来删除资源。POST 方法也是用来创建资源的,与PUT 不同的是, POST 创建的是无法用具体名称的资源。比如绑定关系C bindings) 和发布消息C publish ) 无法指定一个具体的名称。下面示例展示了通过GET 方法来获取之前创建的队列queue 的信息:
[root@myblnp ~]# curl -i -u admin:admin@123 -XGET http://192.168.56.106:15672/api/queues/%2F/queue
HTTP/1.1 200 OK
cache-control: no-cache
content-length: 1406
content-security-policy: script-src 'self' 'unsafe-eval' 'unsafe-inline'; object-src 'self'
content-type: application/json
date: Wed, 13 Sep 2023 08:34:30 GMT
server: Cowboy
vary: accept, accept-encoding, origin
{"consumer_details":[],"arguments":{},"auto_delete":false,"backing_queue_status":{"avg_ack_egress_rate":0.0,"avg_ack_ingress_rate":0.0,"avg_egress_rate":0.0,"avg_ingress_rate":0.0,"delta":["delta","undefined",0,0,"undefined"],"len":0,"mode":"default","next_seq_id":0,"q1":0,"q2":0,"q3":0,"q4":0,"target_ram_count":"infinity"},"consumer_capacity":0,"consumer_utilisation":0,"consumers":0,"deliveries":[],"durable":true,"effective_policy_definition":{},"exclusive":false,"exclusive_consumer_tag":null,"garbage_collection":{"fullsweep_after":65535,"max_heap_size":0,"min_bin_vheap_size":46422,"min_heap_size":233,"minor_gcs":696},"head_message_timestamp":null,"idle_since":"2023-09-13 8:33:03","incoming":[],"memory":13204,"message_bytes":0,"message_bytes_paged_out":0,"message_bytes_persistent":0,"message_bytes_ram":0,"message_bytes_ready":0,"message_bytes_unacknowledged":0,"messages":0,"messages_details":{"rate":0.0},"messages_paged_out":0,"messages_persistent":0,"messages_ram":0,"messages_ready":0,"messages_ready_details":{"rate":0.0},"messages_ready_ram":0,"messages_unacknowledged":0,"messages_unacknowledged_details":{"rate":0.0},"messages_unacknowledged_ram":0,"name":"queue","node":"rabbit@myblnp","operator_policy":null,"policy":null,"recoverable_slaves":null,"reductions":856668,"reductions_details":{"rate":0.0},"single_active_consumer_tag":null,"state":"running","type":"classic","vhost":"/"}[root@myblnp ~]#
[root@myblnp ~]#
以下是关于RabbitMQ的所有http接口,以及接口的具体用途含义
GETPUTDELETEPOSTPATH & Description✔/api/overview 描述整个系统的各种信息✔✔/api/cluster-name 集群的名称✔/api/nodes 集群中节点的信息✔/api/nodes/name 集群中单个节点的信息✔/api/extensions 管理插件的扩展列表✔✔/api/definitions GET方法列出集群中所有的元数据信息,包括交换器、队列、绑定关系、用户、vhost、权限及参数。POST方法用来加载新的元数据信息,但是有以下注意事项: (1)、新的元数据信息会与原本的合并,如果旧的元数据信息中某些项在新加载的元数据中没有定义,则不受影响。 (2)、对于交换器、队列及绑定关系等不可变的内容,如果新旧元数据有冲突,则反馈错误 (3)、对于其他可变的内容,如果新旧元数据有冲突,则新的会替换旧的 (4)、如果在加载过程中发生错误,加载过程会停止,最终只能加载到那部分新的元数据信息✔✔/api/definitions/{vhost} 将【/api/definitions】接口的数据细化到 vhost 级别✔/api/connections 所有的连接信息✔✔/api/connections/{name} GET:方法可以列出指定连接的信息 DELETE:方法可以 close 指定的连接✔/api/connections/{name}/channels 指定连接的所有信道消息✔/api/channels 所有信息的信息✔/api/vhosts/{vhost}/channels 查看指定 vhost 中的所有信道信息✔/api/channels/{channel} 查看指定信道的信息✔/api/consumers 查看所有的消费者信息✔/api/consumers/{vhost} 查看指定 vhost 的所有消费者✔/api/exchanges 查看所有的交换器信息✔/api/exchanges/{vhost} 查看指定 vhost 的所有交换器信息✔✔✔/api/exchanges/{vhost}/{name} GET:方法列出一个指定交换器的信息 PUT:可以声明一个新的交换器,对应的内容可以参考如下:{"type": "direct","auto_delete": false,"internal": false,"durable": true,"arguments": {}} 其中type是必须的,其他是可选的。 DELETE:方法可以删除指定的交换器,其中可以加入 if-unused=true 参数用来防止有队列与其绑定时能够被删除✔/api/exchanges/vhost/{name}/bindings/source 列出指定交换器的所有绑定关系,此交换器需为绑定关系的源端✔/api/exchanges/vhost/{name}/bindings/destination 列出指定交换器的所有绑定关系,此交换器需为绑定关系的目的端✔/api/exchanges/vhost/{name}/publish 向指定的交换器中发生一条消息,对应的内容可以参考:{"properties": {},"routing_key": "myKey","payload": "myBody","payload_encoding": "string"} 这里面的所有参数项都是必填的,如果发生成功则会返回:{"routed": true} 这个接口不适合做稳定、高效的发送使用,可以采用其他的方式比如通过 AMQP 协议或者其他长连接的协议✔/api/queues 列出所有的队列信息✔/api/queues/{vhost} 列出指定 vhost 下的所有队列信息✔✔✔/api/queues/{vhost}/{name} GET:方法列出执行的队列信息 PUT:可以声明一个队列,对应的内容可以参考:{"auto_delete": false,"durable": true,"arguments": {},"node": "rabbit@myblnp"} 这里的所有参数都是可选的 DELETE:可以用来删除一个队列,当然还可以指定 if-empty=true 或者 if-unused=true 等参数✔/api/queues/{vhost}/{name}/bindings 列出指定交换器下指定队列的所有绑定关系✔/api/queues/{vhost}/{name}/contents 清空(purge)指定的队列✔/api/queues/{vhost}/{name}/actions 对指定的队列附加一些动作,对应的内容可参考:{"action": "sync"} 目前仅支持 sync 和 cancel_sync✔/api/queues/{vhost}/{name}/get 从指定的队列中获取消息,对应的内容参数可参考:{"count": 5,"requeue": true,"encoding": "auto","truncate": 50000} count:表示最大能获取的消息个数,实际可能小于这个数;requeue:表示获取到这些消息时是否从队列中删除,如果 requeue 为 true,则消息不会删除,但是消息的 redelivered 标识会被设置;ecoding:表示编码格式,有两种取值,分别是 auto 和 base64,auto 指如果消息符合 UTF-8 格式则返回 string类型,否则为 base64类型;truncate:表示如果消息的payload超过指定大小则会被截断。使用该接口时,除了 trucate 参数,其他的都是必填的✔/api/bindings 列出所有的绑定关系✔/api/bindings/{vhost} 列出指定交换器下的所有绑定关系信息✔✔/api/bindings/{vhost}/e/{exchange}/q/{name} GET:列出一个指定交换器和指定队列的所有绑定关系信息 POST:用来添加绑定关系,对应的请求参数为:{"routing_key": "my_rout","arguments": {}} 这里的参数都是可选的✔✔/api/bindings/{vhost}/e/{exchange}/q/{name}/{props} GET:列出一个交换器和队列的单独的绑定关系信息 DELETE:用来解绑相应的绑定关系信息,其中 props 表示的是 /api/bindings 返回的绑定关系列表里的 properties_key 值,具体是指绑定时 routingkey 和 arguments 的哈希值的组合,一般 arguments 为空,此时 properties_key 等于 routingkey✔✔/api/bindings/{vhost}/e/{sourceExchange}/e/{destExchange} GET:用来列出两个交换器的所有绑定关系信息 POST:用来添加绑定关系✔✔/api/bindings/{vhost}/e/{sourceExchange}/e/{destExchange}/{props} 与接口 /api/bindings/{vhost}/e/{exchange}/q/{name}/{props} 相似,只是查询的是两个交换器之间的绑定关系✔/api/vhosts 列出所有的 vhost 信息✔✔✔/api/vhosts/{name} GET:列出指定 vhost 的信息 PUT:用来添加一个 vhost ,host 通常只有一个名字,所以不需要任何其他参数 DELETE:则是用来删除指定的 vhost✔/api/vhosts/{name}/permissions 列出指定 vhost 的所有权限信息✔/api/users 列出所有的用户信息✔✔✔/api/users/{name} GET:列出指定用户的信息 POST:用来添加一个用户,对应的请求参数是:{"password": "pwd","tags": "administrator"} 或者 {password_hash": "2ewtgd5hdryry5ryftu=","tags": "administrators"} 其中 tags 是必须的参数,用来标识当前用户的角色。对于密码字段,可以二选一的方式。如果密码字段设置为:password_hash 为 "" 则表示用户可以无密码登录 DELETE:用来删除指定的用户✔/api/users/{user}/permissions 用来获取指定用户的所有权限✔/api/whoami 显示当前的登录用户✔/api/permissions 列出所有用户的所有权限✔✔✔/api/permissions/{vhost}/{user} GET:列出指定用户的权限 PUT:添加指定的权限,对应请求参数是:{"configure": ".","write": ".","read": ".*"} 所有参数都是必填的 DELETE:删除指定用户的权限✔/api/parameters 列出所有 vhost 级别的 Parameter。✔/api/parameters/component 列出指定的组件,比如 federation-upstream、shovel 等的所有 vhost 级别的 Parameter✔✔✔/api/parameters/component/{vhost}/{name} GET:列出一个指定的 vhost 级别的Parameter PUT:设置一个 Parameter ,对应的内容参数为:{"vhost": "/","component": "federation","name": "local_username","value": "guest"} DELETE:用来删除指定的 vhost 级别的 Parameter✔/api/global-parameters 列出所有 global 级别的Parameter✔✔✔/api/global-parameters/{name} GET:列出一个指定的 global 级别的Parameter PUT:用来新增一个 global 级别的 Parameter,对应请求参数为:{"name": "user_vhost","valuse": {"guest": "/", "rabbit": "warren"}} DELETE:用来删除一个指定的 global 级别的parameter✔/api/policies 列出所有的policy✔/api/policies/{vhost} 列出指定vhost下的所有policy✔✔✔/api/policies/{vhost}/{name} GET:列出指定的policy PUT:用来设置一个 policy,对应的请求参数为:{"pattern": "^amq.","definition": {"federation-upstream-set": "all"},"priority":0,"apply-to": "all"} 其中,pattern 和 definition是必填参数,其余可选 DELETE:用来删除一个指定的policy✔/api/aliveness-test/{vhost} 声明一个队列。并在基础上生产和消费一条消息,用来测试系统是否运行完好。这个接口可以方便一些监控工具接入(如:Zabbix)的调用。如果系统运行完好,则调用会返回 {"status": "ok"} 状态码为 200✔/api/healthchecks/node 对当前节点进行基本的健康检查,包括 rabbitmq 应用、信道、队列是否正常运行且无告警,如果一切正常则接口返回: {"status": "ok"} 反之则返回: {"status": "failed","reason": "string"} 不管正常与否,状态码都是 200✔/api/healthchecks/node/{node} 对指定节点进行基本的健康检查
HTTPAPI 接口通常用来方便客户端的调用,如果单纯地使用curl 的方式来调用,rabbitmqadrnin 会显得更加方便。rabbitmqadrnin 也是RabbitMQ Management 插件提供的功能,它会包装HTTPAPI 接口,使其调用显得更加简洁方便。比如前面的创建、显示和删除队列queue 就可以这么做:
特别说明:默认情况下 “rabbitmqadmin” 指令是无法使用的,需要启用 RabbitMQ Management 插件,并且做一定配置后才能使用。具体配置方式可参考下面的说明。
第一步:下载插件
[root@myblnp rabbitmq_server-3.8.16]# wget http://192.168.56.106:15672/cli/rabbitmqadmin
第二步:移动至PATH目录并授权
[root@myblnp rabbitmq_server-3.8.16]# mv rabbitmqadmin /usr/local/bin/
[root@myblnp rabbitmq_server-3.8.16]#
[root@myblnp rabbitmq_server-3.8.16]# chmod +x /usr/local/bin/rabbitmqadmin
第三步:使用命令
[root@myblnp rabbitmq_server-3.8.16]# rabbitmqadmin list queues
+----------------+----------+
| name | messages |
+----------------+----------+
| myAe_test | 0 |
| queue | 0 |
| queue.dlx | 1 |
| queue.normal | 0 |
| queue.priority | 1 |
| queue_demo | 0 |
+----------------+----------+
[root@myblnp rabbitmq_server-3.8.16]#
接上文的示例操作,如下代码:
[root@myblnp ~]# rabbitmqadmin -u admin -p admin@123 declare queue name=rabbitadminQueue
queue declared
[root@myblnp ~]# rabbitmqadmin list queues
+------------------+----------+
| name | messages |
+------------------+----------+
| myAe_test | 0 |
| queue | 0 |
| queue.dlx | 1 |
| queue.normal | 0 |
| queue.priority | 1 |
| queue_demo | 0 |
| rabbitadminQueue | 0 |
+------------------+----------+
[root@myblnp ~]# rabbitmqadmin -u admin -p admin@123 delete queue name=rabbitadminQueue
queue deleted
[root@myblnp ~]# rabbitmqadmin list queues
+----------------+----------+
| name | messages |
+----------------+----------+
| myAe_test | 0 |
| queue | 0 |
| queue.dlx | 1 |
| queue.normal | 0 |
| queue.priority | 1 |
| queue_demo | 0 |
+----------------+----------+
[root@myblnp ~]#
以下表格是关于 rabbitmqadmin 的一些常用命令说明
命令解释rabbitmqadmin list users查看所有用户 Userrabbitmqadmin list users name查看所有用户名 Usernamerabbitmqadmin list users tags查看所有用户角色rabbitmqadmin list vhosts查看所有虚拟主机rabbitmqadmin list connections查看所有连接rabbitmqadmin list exchanges查看所有路由 Exchangerabbitmqadmin list bindings查看所有路由与队列的关系绑定 Bindingrabbitmqadmin list permissions查看所有角色的权限 Permissionrabbitmqadmin list channels查看所有通道 Channelrabbitmqadmin list consumers查看所有消费者 Consumerrabbitmqadmin list queues查看所有消息队列 Queuerabbitmqadmin list nodes查看所有节点 Noderabbitmqadmin show overview概览 Overviewrabbitmqadmin list bindings source destination_type destination properties_key查看所有路由与队列的关系绑定的详细信息 Bindingrabbitmqadmin declare queue name=test durable=true定义一个队列queue,durable=true代表持久化打开。rabbitmqadmin declare exchange name=my.fanout type=fanout定义一个Fanout路由rabbitmqadmin declare exchange name=my.direct type=direct定义一个Direct路由rabbitmqadmin declare exchange name=my.topic type=topic定义一个Topic路由rabbitmqadmin declare binding source=my.fanout destination=test routing_key=first定义 bindingrabbitmqadmin publish routing_key=test payload="hello world"发布一条消息rabbitmqadmin publish routing_key=my.test exchange=my.topic payload="hello world"使用路由转发消息rabbitmqadmin get queue=test requeue=true查看消息,不消费rabbitmqadmin get queue=test requeue=false查看消息,并消费rabbitmqadmin purge queue name=test删除队列中的所有消息rabbitmqadmin delete queue name=hello删除消息队列 Queuerabbitmqadmin delete user name=test删除用户 Userrabbitmqadmin delete exchange name=test删除路由器 Exchangerabbitmqadmin delete binding source='kk' destination_type=queue destination=test properties_key=test删除路由器与消息队列的关系绑定 Bindingrabbitmqadmin -f raw_json list usersraw_json 格式化输出rabbitmqadmin -f long list users格式化输出rabbitmqadmin -f pretty_json list userspretty_json 格式化输出rabbitmqadmin -f kvp list users格式化输出rabbitmqadmin -f tsv list users格式化输出rabbitmqadmin -f table list userstable 格式化输出rabbitmqadmin -f bash list usersbash 格式化输出
2、RabbitMQ 配置
一般情况下,可以使用默认的内建配直未有效地运行RabbitMQ ,并且大多数情况下也并不需要修改任何RabbitMQ 的配直. 当然,为了更加有效地操控RabbitMQ ,也可以利用调节系统范围内的参数来达到定制化的需求。RabbitMQ 提供了三种方式来定制化服务:
- 环境变量( Enviroment Variables). RabbitMQ 服务端参数可以通过环境变量进行配直,例如,节点名称、RabbitMQ 配直文件的地址、节点内部通信端口等。
- 配置文件(Configuration File) . 可以定义RabbitMQ 服务和插件设直,例如, TCP 监听端口,以及其他网络相关的设直、内存限制、磁盘限制等。
- 运行时参数和策略( Runtime Parameters and Policies )。可以在运行时定义集群层面的服务设置
2.1、环境变量
RabbitMQ 的环境变量都是以"RABBITMQ_" 开头的,可以在Shell 环境中设置,也可以在rabbitmq-env.conf 这个RabbitMQ 环境变量的定义文件中设置。如果是在非Shell 环境中配置,则需要将"RABBITMQ_"这个前缀去除。优先级顺序按照Shell 环境最优先,其次rabbitmq-env.conf 配置文件,最后是默认的配置。
当采用rabbitmq-server -detached 启动RabbitMQ 服务的时候,此服务节点默认以"rabbit@" 加上当前的Shell 环境的hostname (主机名)来命名,即rabbit@$HOSTNAME 。参考下面,当前Shell 环境的hostname 为" myblnp " 。
[root@myblnp ~]# hostname
myblnp
[root@myblnp ~]# rabbitmqctl cluster_status
Cluster status of node rabbit@myblnp ...
Basics
Cluster name: myblnps
Disk Nodes
rabbit@myblnp
Running Nodes
rabbit@myblnp
Versions
rabbit@myblnp: RabbitMQ 3.8.13 on Erlang 22.3.4.12
Maintenance status
Node: rabbit@myblnp, status: not under maintenance
Alarms
(none)
Network Partitions
……
如果需要制定节点的名称,而不是采用默认的方式,可以在rabbitmq-s erver 命令前添加RABBITMQ_NODENAME 变量来设定指定的名称。如下所示, 此时创建的节点名称为" rabbit@node2 "而非"rabbit@myblnp"。
[root@myblnp ~]# RABBITMQ_NOOENAME=rabbit@node2 rabbitmq-server -detached
Warning: PIO file not written; -detached was passed.
[root@myblnp ~]#
注意要点:如果先执行RABBITMQ NODENAME=rabbit@nodel ,再执行rabbitmq-server -detached 命令,相当于只执行rabb 工tmq-server -detached 命令, 即对RABBITMQ NODENAME 的定义无效。
以RABBITMQ_NODENAME 这个变量为例, RabbitMQ 在启动服务的时候首先判断当前Shell 环境中有无RABBITMQ_NODENAME 的定义,如果有则启用此值:如果没有,则查看rabbitrnq-env.conf 中是否定义了NODENAME 这个变量,如果有则启用此值,如果没有则采用默认的取值规则,即rabbit@$HOSTNAME 。
下面演示如何配置rabbitrnq-env.conf 这个文件(默认在$RABBITMQ HOME/etc/rabbitrnq/ 目录下,可以通过在启动RabbitMQ 服务时指定RABITMQ_CONF_ENV_FILE 变量来设置此文件的路径) :
# RabbitMQ 环境变量的定义文件
#定义节点名称
NODENAME=rabbit@node1
#定义RabbitMQ 的对外通信端口号
NODE_PORT=5672
#定义RabbitMQ 配置文件的目录,注意对于rabbitmq.config
#文件来说这里不用添加、'. config 后缀"
CONFIG_FILE=/opt/rabbitmq/etc/rabbitmq/rabbitmq
对于默认的取值规则,这个在$RABBITMQ_HOME/sbin/rabbitrnq-defaults 文件中有相关设置,当然也可以通过修改这个文件中的内容来修改RabbitMQ 的环境变量,但是并不推荐这么做,还是建议在rabbitrnq-env.conf 中进行相应的设置:
#!/bin/sh -e
## The contents of this file are subject to the Mozilla Public License
## Version 1.1 (the "License"); you may not use this file except in
## compliance with the License. You may obtain a copy of the License
## at https://www.mozilla.org/MPL/
##
## Software distributed under the License is distributed on an "AS IS"
## basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
## the License for the specific language governing rights and
## limitations under the License.
##
## The Original Code is RabbitMQ.
##
## The Initial Developer of the Original Code is GoPivotal, Inc.
## Copyright (c) 2012-2021 VMware, Inc. or its affiliates. All rights reserved.
##
### next line potentially updated in package install steps
SYS_PREFIX=${RABBITMQ_HOME}
CLEAN_BOOT_FILE=start_clean
SASL_BOOT_FILE=start_sasl
BOOT_MODULE="rabbit"
if test -z "$CONF_ENV_FILE" && test -z "$RABBITMQ_CONF_ENV_FILE"; then
CONF_ENV_FILE=${SYS_PREFIX}/etc/rabbitmq/rabbitmq-env.conf
fi
下表是一些常见的RabbitMQ 变量
变量名称描述RABBITMQ_NODE_IP_ADDRESS绑定某个特定的网络接口.默认值是空字符串,即绑定到所有网络接口上.如果要绑定两个或者更多的网络接口,可以参考rabbitmq.config 中的tcp_listeners 配置RABBITMQ_NODE_PORT监听客户端连接的端口号,默认为5672RABBITMQ_DIST_PORTRabbitMQ 节点内部通信的端口号,默认值为RABBITMQ_NODE_PORT+20000.所以RABBITMQ_DIST_PORT 即25672 . 如果设置了kernel. inet_dist_listen_min 或者kemel. inect_dist_listen_max 时,此环境变量将被忽略RABBITMQ_NODENAMERabbitMQ 的节点名称,默认为rabbit@$HOSTNAME . 在每个Erlang 节点和机器的组合中,节点名称必须唯一RABBITMQ_ CONF_ENV_FlLERabbitMQ 环境变量的配置文件(rabbitmq-env.conf) 的地址,默认值为 $RABBITMQ_HOME/etc/rabbitmq/rabbitmq-env.conf。注意这里与RabbitMQ 配置文件rabbitmq.config 的区别RABBITMQ_USE_LONGNAME如果当前的hostname为nodel.longname. 那么默认情况下创建的节点名称为将此参数设置为true 时,创建的节点名称就为rabbi让t@node1.longname,即使用了长名称命名.默认值为空RABBITMQ_CONFIG_FILERabbitMQ 配置文件(rabbitmq.config) 的路径,注意没有".config"的后缀.默认值为$RABBITMQ_HOME/etc/rabbitmq/rabbitmqRABBITMQ_MNESIA_BASERABBITMQ_MNESIA_DIR 的父目录。除非明确设置了RABBITMQ_MNESIA_DIR目录,否则每个节点都应该配置这个环境变量.默认值为$RABBITMQ_HOME/var/lib/rabbitmq/mnesia注意对于RabbitMQ 的操作用户来说,需要有对当前目录可读、可写、可创建文件及子目录的权限RABBITMQ_MNESIA_DIR包含RabbitMQ 服务节点的数据库、数据存储及集群状态等目录,默认值为 $RABBITMQ_MNESIA_BASEI$RABBITMQ_NODENAMERABBITMQ_LOG_BASERabbitMQ 服务日志所在基础目录.默认值为$RABBITMQ_HOME/var/log/rabbitmqRABBITMQ_LOGSRabbitMQ 服务与Erlang 相关的日志,默认值为 $RABBITMQ_LOG_BASE/$RABBITMQ_NODENAME.logRABBITMQ_SASL_LOGSRabbitMQ 服务于Erlang 的SASL(System Application Support Libraries)相关的日志,默认值为$RABBITMQ_LOG BASE/$RABBITMQ_NODENAME-sasl.logRABBITMQ_PLUGINS_DIR插件所在路径。默认值为$RABBITMQ_HOME/plugins
注意,如果没有特殊的需求,不建议更改RabbitMQ 的环境变量。如果在实际生产环境中,对于配量和日志的目录有着特殊的管理目录,那么可以参考以下相应的配置:
#配置文件的地址
CONFIG_FILE=/apps/conf/rabbitmq/rabbitmq
#环境变量的配置文件的地址
CONF_ENV_FILE=/apps/conf/rabbitmq/rabbitmq-env.conf
#服务日志的地址
LOG_BASE=/apps/logs/rabbitmq
#Mnesia 的路径
MNE5IA_BA5E=/apps/dbdat/rabbitmq/mnesia
2.2、配置项
配置项描述tcp l isteners用来监听AMQP 连接(无SS L) 。可以配置为端口号或者端口号与主机名组成的二元数组.num tcp _ acceptors用来处理TC P 连接的Erlang 进程数目,默认值为10handshake_timeoutAMQP 0-8/0-9/0-9-1 握手(在socket 连接和SSL 握手之后〉的超时时间,单位为毫秒. 默认值为10000ssl_Iisteners同tcp_listeners. 用于SSL 连接。默认值为[]num_ssl_acceptors用来处理SSL 连接的Erlang 进程数目,默认值为lssl_optionsSSL 配置。默认值为[]ssl_handshake_timeoutSSL 的握手超时时间.默认值为5000vm_memory_high_watermark触发流量控制的内存阑值.默认值为0.4vm_memory_calculation_ strategy内存使用的报告方式。一共有2 种 ( 1) rss: 采用操作系统的RSS 的内存报告 ( 2) erlang: 采用Erlang 的内存报告 默认值为rssvm_memory_high_watermark_paging_ratio内存高水位的百分比阑值,当达到阑值时,队列开始将消息持久化到磁盘以释放内存.这个需要配合咱一mernory_ high_wa忧rmark 这个参数一起使用.默认值为0.5 .disk_free_limitRabbitMQ 存储数据分区的可用磁盘空间限制.当可用空间值低于阑值时,流程控制将被触发.此值可根据RAM 的相对大小来设置(如{ mem_relative, 1.0} ).此值也可以设为整数(单位为B). 或者使用数字+单位(如"50MB" ).默认情况下,可用磁盘空间必须超过50MB . 默认值为50000000log_levels控制日志的粒度.该值是日志事件类别(category) 和日志级别( Ievel)的二元组列 表 目前定义了4 种日志类别 ( 1) channel : 所有与AMQP 信道相关的日志 (2) connection: 所有与连接相关的日志 (3) federation: 所有与federation 相关的日志 (4) mirroring: 所有与镜像相关的日志 其他未分类的日志也会被记录下来,日志级别有5 种: none 表示不记录日志事件; error 表示只记录错误; waming 表示 只记录错误和告警; info 表示记录错误、告警和信息; debug 表示记录错误、告警、 信息和调试信息 默认值为[ {connection, info} ]frame_max与客户端协商的允许最大帧大小, 单位为B . 设置为0 表示无限制,但在某些QPid客户端会引发bug . 设置较大的值可以提高吞吐量:设置一个较小的值可能会提高延迟.默认值为131072channel_max与客户端协商的允许最大信道个数.设置为0 表示无限制.该数值越大,则Broker的内存使用就越高。默认值为0channel_operation_timeout信道运行的超时时间,单位为毫秒(内部使用,因为消息协议的区别和限制,不暴露给客户端).默认值为15000heartbeat服务器和客户端连接的心跳延迟, 单位为秒.如果设置为0 ,则禁用心跳。在有大量连接的情况下,禁用心跳可以提高性能,但可能会导致一些异常。默认值为60 。在3 . 5 .5版本之前为580default_vhost设置默认的vhost。交换器amq.rabbitmq.log 就在这个vhost 上默认值为<<"/">>default_user设置默认的用户.默认值为<<"guest">>default_pass设置默认的密码.默认值为<<"guest" >>default_user_tags设置默认用户的角色。默认值为[administrator]default_permissions设置默认用户的权限。默认值为[<<".*">>, <<".*">>, <<".*">>]loopback_ users设置只能通过本地网络(如localhost) 来访问Broker 的用户列表。如果希望通过默认的guest 用户能够通过远程网络访问Broker ,那么需要将这项设置为[].默认值为<<"guest">>cluster_nodes可以用来配置集群。这个值是一个二元组,二元组的第一个元素是想要与其建立集群关系的节点,第二个元素是节点的类型,要么是disc ,要么是ram. 默认值为{[], disc}server_properues连接时向客户端声明的键值对列表。默认值为[]collect_statistics统计数据的收集模式,主要与RabbitMQ Management 插件相关,共有3 个值可选: ( 1) none: 不发布统计事件 (2) coarse: 发布每个队列/信道/连接的统计事件 (3) fine: 同时还发布每个消息的统计事件 默认值为nonecollect_statistics_interval统计数据的收集时间间隔,主要与RabbitMQ Management 插件相关。默认值为5000management_db_ cache_multiplier设置管理插件将缓存代价较高的查询的时间.缓存将把最后一个查询的运行时间乘以这个值,并在此时间内缓存结果。默认值为5delegate_count内部集群通信中,委派进程的数目。在拥有很多个内核并且是集群中的一个节点的机器上可以增加此值。默认值为16tcp_listen_options默认的socket 选项。默认值为: [{backlog, 128}, {nodelay, true} , {linger, {true,0} }, {exit_ on_close, false})hipe_compile将此项设直为田e 就可以开启HiPE 功能,即Er1ang 的即时编译器。虽然在启动时会增加时延,但是能够有20%- 50%的性能提升, 当然这个数字高度依赖于负载和机器硬件。在你的Er1ang 安装包中可能没有包含HiPE 的支持,如果没有,则在开启这一项,并且在RabbitMQ 启动时会有相应的告警信息。HiPE 并非在所有平台都可以尤其是Windows操作系统,在Erlang/OTP17.5版本之前,HiPE 有明显问题。如果要使用HiPE 推荐使用最新版的Erlang/OTP. 默认值为falsecluster_partition_handling如何处理网络分区。有4 种取值: ignore; pause_minority; {pause_if_a ll_down, [nodes],ignore |autheal}; autoheal 默认值为fa l secluster_keepalive_interval向其他节点发送存活消息的频率.单位为毫秒。这个参数和net_ticktime 参数不同,丢失存活消息并不会导致节点被认为己失效。默认值为10000queue_index_embed_msgs_below消息的大小小于此值时会直接嵌入到队列的索引中.单位为B . 默认值为4096msg_store_index_module队列索引的实现模块。默认值为:rabbit_msg_store_ets_indexbacking_queue_module队列内容的实现模块。默认值为rabbit_variable_queue . 不建议修改此项rnnesia_table_loading_retry_limit等待集群中Mnes ia 数据表可用时最大的重试次数 默认值为10mnesia_table_loading_retry_timeout每次重试时,等待集群中Mnesia 数据表可用时的超时时间 默认值为30000queue_master_locator队列的定位策略, 即创建队列时以什么策略判断坐落的Broker 节点,如果配置了镜像,则这里指master 镜像的定位策略可用的策略有<<"min- masters">> 、<<"cli ent-l ocal ">> 、<<" random" >> 。默认值为<<"client-local">>lazy_queue_explicit_gc_run_operation_threshold在使用惰性队列(lazy queue) 时进行内存回收动作的阀值。一个低的值会降低性能,一个高的值可以提高性能, 但是会导致更高的内存消税。默认值为1 000queue_explicit_gc_run_operation_threshold在使用正常队列时进行内存回收动作的阀值. 一个低的值会降低性能, 一个高的值可以提高性能, 但是会导致更高的内存消耗.默认值为1 000
2.3、网络配置优化
网络是客户端和RabbitMQ 之间通信的媒介。RabbitMQ 支持的所有协议都是基于TCP 层面的。包括操作系统和RabbitMQ 本身都提供了许多可调节的参数,除了操作系统内核参数和DNS ,所有的RabbitMQ 设置都可以通过在rabbitmq.config 配置文件中配置来实现。
RabbitMQ 在等待接收客户端连接时需要绑定一个或者多个网络接口( 可以理解成E 地址),并监听特定的端口。网络接口使用rabbit .tcp listeners 选项来配置。默认情况下,RabbitMQ 会在所有可用的网络接口上监听5672 端口。下面的示例演示了如何在一个指定的IP地址和端口上进行监听:
## Related doc guide: https://rabbitmq.com/networking.html.
##
## By default, RabbitMQ will listen on all interfaces, using
## the standard (reserved) AMQP 0-9-1 and 1.0 port.
##
# listeners.tcp.default = 5672
## To listen on a specific interface, provide an IP address with port.
## For example, to listen only on localhost for both IPv4 and IPv6:
##
# IPv4
# listeners.tcp.local = 127.0.0.1:5672
# IPv6
# listeners.tcp.local_v6 = ::1:5672
## You can define multiple listeners using listener names
# listeners.tcp.other_port = 5673
# listeners.tcp.other_ip = 10.10.10.10:5672
优化网络配置的一个重要目标就是提高吞吐量,比如禁用Nagle 算法、增大TCP 缓冲区的大小。每个TCP 连接都分配了缓冲区。一般来说,缓冲区越大,吞吐量也会越高,但是每个连接上耗费的内存也就越多,从而使总体服务的内存增大,这是一个权衡的问题。在Linux 操作系统中,默认会自动调节TCP 缓冲区的大小,通常会设置为80KB 到120KB 之间。要提高吞吐量可以使用rabbit.tcp_listen_options 来加大配置。下面的示例中将TCP 缓冲区大小设置为192KB(192*1024 = 196608):
## Customising TCP Listener (Socket) Configuration.
##
## Related doc guides:
##
## * https://rabbitmq.com/networking.html
## * https://www.erlang.org/doc/man/inet.html#setopts-2
##
# tcp_listen_options.backlog = 128
# tcp_listen_options.nodelay = true
# tcp_listen_options.exit_on_close = false
#
# tcp_listen_options.keepalive = true
# tcp_listen_options.send_timeout = 15000
#
# tcp_listen_options.buffer = 196608
# tcp_listen_options.sndbuf = 196608
# tcp_listen_options.recbuf = 196608
Erlang 在运行时使用线程池来异步执行1/0 操作。线程池的大小可以通过RABBITMQ_SERVER_ADDITIONAL_ERL_ARGS 这个环境变量来调节。示例如下:
RABBITMQ_SERVER_ADDITIONAL_ERL_ARGS= "+A 128"
目前3.6.x 版本的默认值为128。当机器的内核个数大于等于8 时,建议将此值设置为大于等于96 , 这样可以确保每个内核上可以运行大于等于12 个I/O 线程。注意这个值并不是越高越能提高吞吐量。
大部分操作系统都限制了同一时间可以打开的文件句柄数。在优化并发连接数的时候, 需确保系统有足够的文件句柄数来支撑客户端和Broker 的交互。**可以用每个节点上连接的数目乘以 1.5来粗略的估算限制**。例如,要支撑10 万个TCP 连接,需要设置文件句柄数为15 万。当然,略微增加文件句柄数可以增加闲置机器内存的使用量,但这需要合理权衡。
如上所述,增大TCP 缓冲区的大小可以提高吞吐量,如果减小TCP 缓冲区的大小,这样就可以减小每个连接上的内存使用量。如果并发量比吞吐量更重要,可以修改此值。
前面所提到的禁用Nagle 算法可以提高吞吐量,但是其主要还是用于减少延迟。RabbitMQ 内部节点交互时可以在kernel.inet_default_connect_options 和kernel.inet_default_listen_options 配置项中配置{nodelay , true} 来禁用Nagle 算法。rabbit.tcp_listen_options 也需要包含同样的配置,井且默认都是这样配置的,参考下面示例:
#设置为true时,禁用 Nagle的算法。默认是真的。
tcp_listen_options.nodelay
当优化井发连接数时,恰当的Erlang 虚拟机的 I/O 线程池的大小也很重要,具体可以参考前面的内容。
当只有少量的客户端时,新建立的连接分布是非常不均匀的, 但是由于数量足够小, 所以没有太大的差异。当连接数量到达数万或者更多时,重要的是确保服务器能够接受入站连接。未接受的TCP 连接将会放在有长度限制的队列中。这个通过rabbit.tcp_listen_options.backlog 参数来设置,详细内容可以参考前一个示例。默认值为128 ,当挂起的连接队列的长度超过此值时,连接将被操作系统拒绝。
通用TCP套接字选项
参数项描述rabbit.tcp_listen_options. nodelay当设置为true. 可禁用Nagle 算法。默认为true。对于大多数用户而言,推荐设置为truerabbit. tcp_listen_options.sndbuf参考前面讨论的TCP 缓冲区。一般取值范围在88 KB 至128KB 之间。增大缓冲区可以提高消费者的吞吐量,同时也会加大每个连接上的内存使用量。减小则有相反的效果rabbit. tcp_listen_options.recbuf参考前面讨论的TCP 缓冲区。一般取值范围同样在88阻至1 28KB 之间。一般是针对发送者或者协议操作rabbit.tcp_listen_options. backlog队列中未接受连接的最大数目。当达到此值时,新连接会被拒绝。对于成千上万的并发连接环境及可能存在大量客户重新连接的场景,可设为4096 或更高rabbit.tcp listen_ options.linger当套接字关闭时,设置为{true,N}. 用于设置刷新未发送数据的超时时间, 单位为秒rabbit.tcp_listen_options.keepalive当设置为true 时,启用TCP 的存活时间。默认为falseo 对于长时间空闲的连接(至少10 分钟〕是有意义的,虽然更推荐使用heartbeat 的选项
与操作系统有关的网络设置也会影响到RabbitMQ 的运行, 理解这些设置选项同样至关重要。注意这一类型的内核参数在 /etc/sysctl.conf 文件( Linux 操作系统)中配置, 而不是在rabbitmq . config 这个文件中。
可配置的内核选项
参数项描述fs.file-max内核分配的最大文件句柄数。极限值和当前值可以通过/proc/sys/fs/file-nr 来查看。 示例如下: [iot@lidechang-test ~]$ cat /proc/sys/fs/file-nr 81632 0 1048576net. ipv4.ip_local_port_range本地 IP 端口范围,定义为一对值。该范围必须为并发连接提供足够的条目net. ipv4. tcp_tw_reuse当启用时,允许内核重用TIME_WAIT 状态的套接字。当用在NAT 时,此选项是很危险的net. ipv4.tcp_fin_timeout降低此值到5-10 可减少连接关闭的时间,之后会停留在TIME WAIT状态,建议用在有大量并发连接的场景net.core.somaxconn监听队列的大小〈同一时间建立过程中有多少个连接).默认为128. 增大到4096 或更高,可以支持入站连接的爆发,如clients 集体重连net. ipv4.tcp_max_syn_backlog尚未收到连接客户端确认的连接请求的最大数量.默认为128. 最大值为65535 . 优化吞吐量时. 4096 和8192 是推荐的起始值net.ipv4.tcp_keepalive_*net.ipv4. tcp_keepalive_time, net.ipv4. tcp_keepalive _ intvl 和net. ipv4.tcp_keepalive_probes 用于配置TCP 存活时间net. ipv4.conf.defau1t.rp_filter启用反向地址过滤.如果系统不关心 IP 地址欺骗,那么就禁用它
2.4、基本配置说明
##Rabbitmq下载地址 & Erlang下载地址
###Rabbitmq下载: https://www.rabbitmq.com/download.html
###Erlang下载:https://github.com/rabbitmq/erlang-rpm/releases
#端口访问说明
##SELinux和类似的机制可能会阻止RabbitMQ绑定到一个端口。发生这种情况时,RabbitMQ将无法启动防火墙可以防止节点和CLI工具相互通信。确保可以打开以下端口:
4369:#epmd, RabbitMQ节点和CLI工具使用的对等发现服务
5672,5671: #由AMQP 0-9-1和1.0客户端使用
25672: #由Erlang分配用于节点间和CLI工具通信,并且从动态范围分配(AMQP端口+20000)
15672: #HTTP API客户端和rabbitmqadmin(仅当管理插件启用时)
#调整系统限制
##运行生产工作负载的RabbitMQ安装可能需要系统限制和内核参数调整,以便处理体面的并发连接和队列。需要调整的主要设置是打开文件的最大数量
echo "* soft nproc 65535" >> /etc/security/limits.conf
echo "* hard nproc 65535" >> /etc/security/limits.conf
echo "* soft nofile 655350" >> /etc/security/limits.conf
echo "* hard nofile 655350" >> /etc/security/limits.conf
echo "ulimit -u 65535" >> /etc/profile
echo "ulimit -n 655350" >> /etc/profile
#修改rabbitmq配置
# 修改/etc/systemd/system/multi-user.target.wants/rabbitmq-server.service
# 在[Service]中,增加LimitNOFILE=30000(具体数值根据需要)
##执行重启rabbitmq服务
systemctl daemon-reload
##查看状态
rabbitmqctl status
#日志
##默认的情况下,日志位于/var/log/rabbitmq目录中,服务器的输出被发送到RABBITMQ_NODENAME.log文件 。其他日志数据写入RABBITMQ_NODENAME-sasl.log
2.5、常用操作
#配置方式
#环境变量:网络参数及配置文件路径
#配置文件:服务器各组件访问权限,资源限制,插件及集群
#运行时参数:集群的运行时参数设定
#
#环境变量:/etc/rabbitmq/rabbitmq-env.conf
RABBITMQ_BASE:数据库和日志文件存放位置
RABBITMQ_CONFIG_FILE:配置文件路径; /etc/rabbitmq/rabbitmq
RABBITMQ_LOGS:日志
RABBITMQ_NODE_IP_ADDRESS:监听的ip
RABBITMQ_NODE_PORT:
RABBITMQ_PLUGINS_DIR:
#配置文件:
auth_mechanisms:认证机制
default_user:guest
default_pass:guest
default_permission:
disk_free_limit: 磁盘预留空间
heartbeat:消息时长
hipe_compile:使用默认编译器还是高级编译器
log_levels:{none|error|warning|info}
tcp_listeners:监听的地址和端口
ssl_listeners:基于ssl通信监听的地址和端口
vm_memory_high_watermark:
#运行时参数:rabbitmqctl -h
rabbitmqctl status
set_parameter [-p <vhostpath>] <component_name> <name> <value>
clear_parameter [-p <vhostpath>] <component_name> <key>
list_parameters [-p <vhostpath>]
#设置清除参数
set_policy [-p <vhostpath>] <name> <pattern> <definition> [<priority>]
clear_policy [-p <vhostpath>] <name>
list_policies [-p <vhostpath>]
set_vm_memory_high_watermark <fraction>
stop [<pid_file>]
stop_app 停止所有应用
start_app 启动所有应用
add_user <username> <password>
delete_user <username>
change_password <username> <newpassword>
clear_password <username>
set_user_tags <username> <tag> ... 例:rabbitmqctl set_user_tags test administrator
list_users
#设定哪个用户对哪个虚拟主机有哪些权限
add_vhost <vhostpath> 例:rabbitmqctl add_vhost /myhost/test1
delete_vhost <vhostpath>
list_vhosts [<vhostinfoitem> ...]
set_permissions [-p <vhostpath>] <user> <conf> <write> <read>
clear_permissions [-p <vhostpath>] <username>
list_permissions [-p <vhostpath>]
list_user_permissions <username>
rabbitmqctl set_permissions -p /myhost/test test '.*' '.*' '.*'
Setting permissions for user "test" in vhost "/myhost/test" ...
...done.
rabbitmqctl list_permissions -p /myhost/test
Listing permissions in vhost "/myhost/test" ...
test .* .* .*
...done.
#组件查看
list_queues [-p <vhostpath>] [<queueinfoitem> ...]
list_exchanges [-p <vhostpath>] [<exchangeinfoitem> ...]
list_bindings [-p <vhostpath>] [<bindinginfoitem> ...]
list_connections [<connectioninfoitem> ...]
list_channels [<channelinfoitem> ...]
list_consumers [-p <vhostpath>]
#broker状态查看
status
#环境变量查看
environment
#关闭指定连接
close_connection <connectionpid> <explanation>
#内存使用
set_vm_memory_high_watermark <fraction>
2.6、配置参数解释
#像RabbitMQ这样的数据服务通常有许多可调参数。一些配置对开发有很大的意义,但并不适合生产,本指南旨在为此提供帮助
#
#虚拟主机
#例如,在单租户环境中,当您的RabbitMQ集群专门为生产中的单个系统供电时,使用默认的虚拟主机(/)是完全正确的
#在多租户环境中,为每个租户/环境使用单独的虚拟主机,例如project1_development, project1_production,project2_development和 project2_production等
#
#
#用户
#对于生产环境,请删除默认用户(guest),默认用户只能从本地主机默认连接,因为它具有众所周知的凭据。不要启用远程连接,而应考虑使用具有管理权限和生成密码的单独用户
#建议每个应用程序使用一个单独的用户。例如,如果您有一个移动应用程序,一个Web应用程序和一个数据聚合系统,您将有3个独立的用户。这使得许多事情更容易:将客户端连接与应用程序关联
#
#
#权限控制
#认证和授权通常会混淆或互换使用。这是错误的,在RabbitMQ中,两者是分开的。为了简单起见,我们将认证定义为“标识用户是谁”,授权定义为“确定用户是什么,不允许做什么”
#默认的虚拟主机和用户
# 当服务器首次开始运行,并检测到其数据库未初始化或被删除时,它将使用一下资源初始化一个新的数据库
# 一个名为 /虚拟主机
# 一个名为guest的用户,默认密码为guest,被授予对/虚拟主机的完全访问权限
# 明智的做法是删除guest用户或更改密码,特别是在公共网络上访问
# 默认情况下guest用户被禁止远程连接到代理,它只能通过localhost连接。我们创建的其他用户默认情况下没有这种限制
# 如果我们希望允许guest用户从远程主机连接,则应将loopback_users配置设置 为 none,如下:
loopback_users = none
#权限如何工作
#
#当一个RabbitMQ客户端建立到一个服务器的连接时,它指定了一个虚拟主机。此时执行第一级访问控制,服务器检查用户是否有权访问虚拟主机,否则拒绝连接尝试
#资源(即交换和队列)在特定虚拟主机内被命名为实体;当对资源执行某些操作时,强制执行第二级访问控制
#
#RabbitMQ在资源上有配置、写入、读取操作
# 配置:创建或销毁资源,或更改其行为
# 写: 写入消息到资源
# 读: 检索资源的消息
#
#
#内存
#默认情况下,当RabbitMQ检测到使用的内存超过40%(由操作系统报告)时,将不会接收任何消息:{vm_memory_high_watermark,0.4},这是一个安全的默认值
#在修改此值应该小心,即使主机是专用的RabbitMQ节点,因为如果没有足够的空闲系统内存,将会对操作系统交换造成不利影响,甚至会导致RabbitMQ进程终止
#调整默认vm_memory_high_watermark时的一些建议
# 托管RabbitMQ的节点应始终具有至少128MB的可用内存
# 推荐的vm_memory_high_watermark范围是 0.40到0.66
# 值不要超过0.7。操作系统和文件系统必须至少保留30%的内存,否则性能可能因寻呼而严重降级
#比如修改配置调整为0.6,编辑rabbitmq.conf
vm_memory_high_watermark.relative = 0.6
#磁盘空间
#disk_free_limit默认值是50MB
# {disk_free_limit,{mem_relative,1.0}}是最小推荐值,和内存的容量一样大
# 例如,在专用于具有4GB系统内存的RabbitMQ的主机上,如果可用磁盘空间低于4GB,所有发布者将被阻止,并且不会接收新消息。队列将需要被排空,通常由消费者,在发布之前将被允许恢复
# {disk_free_limit,{mem_relative,1.5}}是一个更安全的产品价值
# 在具有4GB内存的RabbitMQ节点上,如果可用磁盘空间低于6GB,则所有新消息都将被阻止,直到磁盘警报清除
#{disk_free_limit,{mem_relative,2.0}}是最保守的产品价值,我们想不出任何理由使用更高的产品。如果您希望RabbitMQ拥有所有需要的磁盘空间,编辑rabbitmq.conf,比如修改配置调整为2G
disk_free_limit.absolute = 2GB
#打开文件句柄限制
#保证您的环境至少允许有效的RabbitMQ用户使用至少50K的开放文件描述符,包括在开发环境中
#
#
#监控
#强烈建议监视系统的几个方面,从基础架构和内核度量到RabbitMQ到应用程序级度量。虽然监控需要在时间上进行前期投资,但在提前(或根本)解决问题方面非常有效。
#参考zabbix监控(http://blog.thomasvandoren.com/monitoring-rabbitmq-queues-with-zabbix.html)
#https://github.com/jasonmcintosh/rabbitmq-zabbix
#
#
#日志收集
#强烈建议所有RabbitMQ节点和应用程序(如果可能的话)的日志都被收集和汇总。日志对于调查不寻常的系统行为至关重要
#
#
#节点时间同步
#节点时间同步
#
#
#网络配置
#TCP侦听器配置接口和端口
listeners.tcp.1 = 192.168.1.99:5672
#将RabbitMQ配置为仅在IPv4和IPv6上的本地主机上侦听(双协议)
listeners.tcp.1 = 127.0.0.1:5672
listeners.tcp.2 = :: 1:5672
TCP缓冲区大小
#这是关键的可调参数之一。每个TCP连接都有为其分配的缓冲区。一般来说,这些缓冲区越大,每个连接使用的内存就越多,吞吐量越好
#在Linux系统上,操作系统默认会自动调整TCP缓冲区大小,通常在80-120KB之间
#可以使用rabbit.tcp_listen_options, rabbitmq_mqtt.tcp_listen_options, rabbitmq_amqp1_0.tcp_listen_options和相关的配置项来增加缓冲区大小
#以下示例将AMQP 0-9-1连接的TCP缓冲区设置为192 KiB(请注意,将发送和接收缓冲区大小设置为不同的值是危险的,不推荐使用):即每个连接使用的RAM
tcp_listen_options.backlog = 128
tcp_listen_options.nodelay = true
tcp_listen_options.linger.on = true
tcp_listen_options.linger.timeout = 0
tcp_listen_options.sndbuf = 196608
tcp_listen_options.recbuf = 196608
#有些环境中每个节点持续并发连接数量比吞吐量更重要,因此需要为每个工作负载找到吞吐量和每个连接的RAM使用量之间的最佳值,不建议低于8K
#
#连接握手超时
#RabbitMQ的连接握手超时,默认10秒。当客户端运行在严重受限的环境中时,可能需要增加超时。这可以通过rabbit.handshake_timeout(毫秒)完成:
handshake_timeout = 20000
#OS级调整
fs.file-MAX 内核将分配的最大文件数量
net.ipv4.ip_local_port_range 本地IP端口范围,定义为一对值。范围必须为并发连接的峰值数量提供足够的条目
net.ipv4.tcp_tw_reuse 启用时,允许内核在TIME_WAIT 状态下重新使用套接字
net.ipv4.tcp_fin_timeout 将此值降低到5-10会减少关闭连接保持TIME_WAIT状态的时间。推荐用于预计大量并发连接的情况。
net.core.somaxconn 侦听队列的大小(同时建立多少个连接)。默认值是128.增加到4096或更高,以支持入站连接突发,例如,当客户端重新连接时
net.ipv4.tcp_max_syn_backlog 记录的连接请求的最大数量尚未从连接客户端收到确认。默认值为128,最大值为65535.当优化吞吐量时,建议使用4096和8192开始值
net.ipv4.conf.default.rp_filter 启用反向路径过滤。如果IP地址欺骗 不是您的系统所关心的,请将其禁用
tcp_listen_options.nodelay 设置为true时,禁用 Nagle的算法。默认是真的。强烈建议大多数用户
tcp_listen_options.sndbuf 默认值由OS自动调整,通常在现代Linux版本的88 KiB至128 KiB范围内。增加缓冲区大小可提高每个连接的消费者吞吐量和RAM使用量。减少有相反的效果
tcp_listen_options.recbuf 默认值的效果与rabbit.tcp_listen_options.sndbuf类似,但是对于发布者和协议操作来说一般
tcp_listen_options.backlog 未接受的TCP连接队列的最大大小。达到这个尺寸时,新的连接将被拒绝。对于具有数千个并发连接和可能的批量客户端重新连接的环境,设置为4096或更高
tcp_listen_options.keepalive 当设置为true时,启用TCP保持活动(见上文)。默认是false。对于连接可以长时间闲置(至少10分钟)的环境有意义,但仍然建议使用心跳
TCP Keepalives
net.ipv4.tcp_keepalive_time = 60
net.ipv4.tcp_keepalive_intvl = 15
net.ipv4.tcp_keepalive_probes = 4
# TCP包含一个类似于心跳(aka keepalive)的机制,在消息传递协议和上面的网络核对超时(TCP tickal timeout)中包含TCP保持活动。由于默认设置不足,TCP Keepalive通常不会按照
# 预期的方式工作:需要很长时间(例如,一个小时或更长时间)才能检测到死亡的对等方。但是,通过调整,它们可以达到与心跳相同的目的,并且有意或无意地清除陈旧的TCP连接,例如
# 选择不使用心跳的客户端。下面是TCP keepalive的sysctl配置示例,它认为TCP连接在120秒后死机或不可达(连接空闲60秒后每15秒4次尝试):
# 在RabbitMQ操作员无法控制应用程序设置或使用的客户端库的环境中,TCP Keepalive可以成为有用的附加防御机制。
#分区处理策略
#
#在投入生产之前 选择分区处理策略非常重要
#强烈建议不要在网络分区的环境中部署RabbitMQ集群
2.7、官方配置详解
官方的配置文件说明:http://www.rabbitmq.com/configure.html
##相关文档指南:http://rabbitmq.com/configure.html。看到
## 联网
## ====================
##
##相关文档指南:http://rabbitmq.com/networking.html。
##
##默认情况下,RabbitMQ将使用侦听所有接口
##标准(保留)AMQP 0-9-1和1.0端口。
##
#listeners.tcp.default = 5672
##要监听特定的接口,请提供带有端口的IP地址。
##例如,只在本地主机上侦听IPv4和IPv6:
##
#IPv4
#listeners.tcp.local = 127.0.0.1:5672
#IPv6
#listeners.tcp.local_v6 = :: 1:5672
##您可以使用侦听器名称定义多个侦听器
#listeners.tcp.other_port = 5673
#listeners.tcp.other_ip = 10.10.10.10:5672
## TLS监听器的配置方式与TCP监听器相同,
##包括控制界面选择的选项。
##
#listeners.ssl.default = 5671
##将接受TCP连接的Erlang进程的数量
##和TLS监听器。
##
#num_acceptors.tcp = 10
#num_acceptors.ssl = 1
## AMQP 0-8 / 0-9 / 0-9-1握手的最大时间(套接字连接后)
##和TLS握手),以毫秒为单位。
##
#handshake_timeout = 10000
##设置为'true'在接受a时执行反向DNS查询
##连接。主机名将被显示,而不是IP地址
#在rabbitmqctl中的##和管理插件。
##
#reverse_dns_lookups = true
##
##安全,访问控制
## ==============
##
##相关文档指南:http://rabbitmq.com/access-control.html。
##默认的“访客”用户只能访问服务器
##通过一个回送接口(例如本地主机)。
## {loopback_users,[<<“guest”>>]},
##
#loopback_users.guest = true
##如果您想允许访问,请取消注释以下行
##来宾用户从网络上的任何地方。
#loopback_users.guest = false
## TLS配置。
##
##相关文档指南:http://rabbitmq.com/ssl.html。
##
#ssl_options.verify = verify_peer
#ssl_options.fail_if_no_peer_cert = false
#ssl_options.cacertfile = /path/to/cacert.pem
#ssl_options.certfile = /path/to/cert.pem
#ssl_options.keyfile = /path/to/key.pem
##选择要使用的认证/授权后端。
##
##备用后端由插件提供,例如rabbitmq-auth-backend-ldap。
##
##注意:这些设置需要启用某些插件。
##
##相关文档指南:
##
## * http://rabbitmq.com/plugins.html
## * http://rabbitmq.com/access-control.html
##
#auth_backends.1 = rabbit_auth_backend_internal
##使用单独的后端进行身份验证和授权,
## 见下文。
#auth_backends.1.authn = rabbit_auth_backend_ldap
#auth_backends.1.authz = rabbit_auth_backend_internal
## rabbitmq_auth_backend_ldap插件允许经纪人
##通过推迟到一个执行认证和授权
##外部LDAP服务器。
##
##相关文档指南:
##
## * http://rabbitmq.com/ldap.html
## * http://rabbitmq.com/access-control.html
##
##使用LDAP进行身份验证和授权
#auth_backends.1 = rabbit_auth_backend_ldap
##使用HTTP服务进行身份验证和
##授权
#auth_backends.1 = rabbit_auth_backend_http
##在链中使用两个后端:首先是HTTP,然后是内部
#auth_backends.1 = rabbit_auth_backend_http
#auth_backends.2 = rabbit_auth_backend_internal
##认证
##内置的机制是“普通”,
##'AMQPLAIN'和'EXTERNAL'可以通过添加其他机制
##插件。
##
##相关文档指南:http://rabbitmq.com/authentication.html。
##
#auth_mechanisms.1 = PLAIN
#auth_mechanisms.2 = AMQPLAIN
## rabbitmq-auth-mechanism-ssl插件使得它成为可能
##根据客户端的x509(TLS)证书对用户进行身份验证。
##相关文档指南:http://rabbitmq.com/authentication.html。
##
##要使用auth-mechanism-ssl,EXTERNAL机制应该
##被启用:
##
#auth_mechanisms.1 = PLAIN
#auth_mechanisms.2 = AMQPLAIN
#auth_mechanisms.3 = EXTERNAL
##要强制所有客户端上基于x509证书的身份验证,
##排除所有其他机制(注意:这将禁用基于密码的
##认证甚至管理用户界面!):
##
#auth_mechanisms.1 = EXTERNAL
##这涉及rabbitmq-auth-mechanism-ssl插件和
## STOMP ssl_cert_login配置。查看RabbitMQ STOMP插件
## 稍后在此文件和README中的##配置部分
## https://github.com/rabbitmq/rabbitmq-auth-mechanism-ssl进一步
## 细节。
##
##使用TLS证书的CN而不是DN作为用户名
##
#ssl_cert_login_from = common_name
## TLS握手超时,以毫秒为单位。
##
#ssl_handshake_timeout = 5000
##密码散列实现。只会影响新的
##创建用户。重新计算现有用户的散列值
##有必要更新她的密码。
##
##要使用SHA-512,请设置为rabbit_password_hashing_sha512。
##
#password_hashing_module = rabbit_password_hashing_sha256
##导入从早期版本导出的定义
##比3.6.0,有可能回到MD5(只做这个
##作为临时措施!)通过将其设置为rabbit_password_hashing_md5。
##
#password_hashing_module = rabbit_password_hashing_md5
##
##默认用户/ VHost
## ====================
##
##首先启动RabbitMQ将创建一个虚拟主机和一个用户。这些
## config items控制创建的内容。
##相关文档指南:http://rabbitmq.com/access-control.html
##
#default_vhost = /
#default_user = guest
#default_pass = guest
#default_permissions.configure =。*
#default_permissions.read =。*
#default_permissions.write =。*
##默认用户的标签
##
##有关标签的更多详细信息,请参阅文档
##管理插件在http://rabbitmq.com/management.html。
##
#default_user_tags.administrator = true
##定义这样的其他标签:
#default_user_tags.management = true
#default_user_tags.custom_tag = true
##
##其他网络和协议相关的配置
## ================================================ =====
##
##设置默认的AMQP 0-9-1心跳间隔(以秒为单位)。
##相关文档指南:
##
## * http://rabbitmq.com/heartbeats.html
## * http://rabbitmq.com/networking.html
##
#心跳= 600
##设置AMQP帧的最大允许大小(以字节为单位)。
##
#frame_max = 131072
##设置连接前服务器将接受的最大帧大小
##调整发生
##
#initial_frame_max = 4096
##设置每个连接的最大允许通道数量。
## 0的意思是“没有限制”。
##
#channel_max = 128
##自定义TCP监听器(套接字)配置。
##
##相关文档指南:
##
## * http://rabbitmq.com/networking.html
## * http://www.erlang.org/doc/man/inet.html#setopts-2
##
#tcp_listen_options.backlog = 128
#tcp_listen_options.nodelay = true
#tcp_listen_options.exit_on_close = false
##
##资源限制和流量控制
## ==============================
##
##相关文档指南:http://rabbitmq.com/memory.html。
##基于内存的流量控制阈值。
##
#vm_memory_high_watermark.relative = 0.4
##或者,我们可以设置节点使用的RAM的限制(以字节为单位)。
##
#vm_memory_high_watermark.absolute = 1073741824
##或者您可以使用内存单位设置绝对值(使用RabbitMQ 3.6.0+)。
##如果相对定义,绝对水印将被忽略!
##
#vm_memory_high_watermark.absolute = 2GB
##
##支持的单位后缀:
##
## kb,KB:kibibytes(2 ^ 10个字节)
## mb,MB:mebibytes(2 ^ 20)
## gb,GB:gibibytes(2 ^ 30)
##队列开始的高水印限制的分数
##寻呼消息到光盘为了释放内存。
##例如,当vm_memory_high_watermark被设置为0.4并且该值被设置为0.5时,
##分页可以在节点使用总可用RAM的20%时开始。
##
##大于1.0的值可能是危险的,应谨慎使用。
##
##一个替代方案是使用持久队列和发布消息
##作为永久(交付模式= 2)。有了这个组合队列将
##将消息更快地移动到磁盘。
##
##另一种选择是配置队列来寻呼所有消息(都是
##持久性和瞬态)到磁盘
##尽可能参见http://rabbitmq.com/lazy-queues.html。
##
#vm_memory_high_watermark_paging_ratio = 0.5
##选择Erlang VM内存消耗计算策略。可以是“分配”,“rss”或“legacy”(别名为“erlang”),
##在3.6.11中介绍。“rss”是3.6.12的默认值。
##查看https://github.com/rabbitmq/rabbitmq-server/issues/1223和rabbitmq / rabbitmq-common#224获取背景信息。
#vm_memory_calculation_strategy = rss
##我们执行内存检查的间隔(以毫秒为单位)
##水平对水印。
##
#memory_monitor_interval = 2500
##可用的总内存可以从OS资源中计算出来
## - 默认选项 - 或作为配置参数提供。
#total_memory_available_override_value = 2GB
##设置磁盘空闲限制(以字节为单位)。一旦可用磁盘空间达到此目的
##下限,磁盘报警将被设置 - 请参阅文档
##上面列出了更多的细节。
##
##如果相对定义,绝对水印将被忽略!
#disk_free_limit.absolute = 50000
##或者你可以使用内存单元(与vm_memory_high_watermark相同)
##与RabbitMQ 3.6.0+。
#disk_free_limit.absolute = 500KB
#disk_free_limit.absolute = 50mb
#disk_free_limit.absolute = 5GB
##或者,我们可以设置一个相对于可用RAM总量的限制。
##
##低于1.0的值可能是危险的,应谨慎使用。
#disk_free_limit.relative = 2.0
##
##聚类
## =====================
##
#cluster_partition_handling =忽略
## pause_if_all_down策略需要额外的配置
#cluster_partition_handling = pause_if_all_down
##恢复策略。可以是“autoheal”或“忽略”
#cluster_partition_handling.pause_if_all_down.recover =忽略
##节点名称检查
#cluster_partition_handling.pause_if_all_down.nodes.1 = rabbit @ localhost
#cluster_partition_handling.pause_if_all_down.nodes.2 = hare @ localhost
##在消息中镜像同步批量大小。增加这将加快速度
##同步,但批量总大小(以字节为单位)不得超过2 GiB。
##在RabbitMQ 3.6.0或更高版本中可用。
##
#mirroring_sync_batch_size = 4096
##在启动时自动进行聚类。仅适用
##到第一次刚复位或启动的节点。
##
##相关文档指南:http://rabbitmq.com//cluster-formation.html
##
#autocluster.peer_discovery_backend = rabbit_peer_discovery_classic_config
#
#autocluster.classic_config.nodes.node1 = rabbit1 @ hostname
#autocluster.classic_config.nodes.node2 = rabbit2 @ hostname
#autocluster.classic_config.nodes.node3 = rabbit3 @ hostname
#autocluster.classic_config.nodes.node4 = rabbit4 @ hostname
##基于DNS的对等发现。这后端将列出A记录
##配置的主机名##并执行反向查找
##返回的地址。
#autocluster.peer_discovery_backend = rabbit_peer_discovery_dns
#autocluster.dns.hostname = rabbitmq.discovery.mycompany.local
##此节点的类型可以配置。如果你不确定
##使用什么节点类型,总是使用“光盘”。
#autocluster.node_type =光盘
##发送Keepalive消息的间隔(以毫秒为单位)
##给其他集群成员。请注意,这不是一回事
## as net_ticktime; 遗漏的keepalive消息不会导致节点
##被认为是失望的。
##
#cluster_keepalive_interval = 10000
##
##统计收集
## =====================
##
##设置(内部)统计信息收集粒度。
##
##可以不是,粗或细
#collect_statistics =无
#collect_statistics =粗略
##统计信息收集间隔(以毫秒为单位)。增加
##这将减少管理数据库的负载。
##
#collect_statistics_interval = 5000
##
##其他/高级选项
## =====================
##
##注意:只有在你明白自己在做什么的情况下才能改变这些!
##
##显式启用/禁用hipe编译。
##
#hipe_compile = false
##在等待群集中的Mnesia表时使用的超时
##变得可用。
##
#mnesia_table_loading_retry_timeout = 30000
##在群集启动中等待Mnesia表时重试。注意
##此设置不适用于Mnesia升级或节点删除。
##
#mnesia_table_loading_retry_limit = 10
##以字节为单位的大小,低于该大小将消息嵌入到队列索引中。
##相关文档指南:http://rabbitmq.com/persistence-conf.html
##
#queue_index_embed_msgs_below = 4096
##你也可以用内存单位来设置这个大小
##
#queue_index_embed_msgs_below = 4kb
##是否启用所有的后台定期GC
## Erlang处于“等待”状态。
##
##禁用后台GC可以减少客户端操作的延迟,
##保持启用可能会减少RAM的使用量。
##
#background_gc_enabled = false
##运行背景GC的目标(期望)间隔(以毫秒为单位)。
##实际时间间隔取决于执行时间的长短
##操作(可高于此间隔)。值小于
##不建议使用30000毫秒。
##
#background_gc_target_interval = 60000
##是否启用代理协议支持。
##一旦启用,客户端不能直接连接到代理
##了。他们必须通过一个负载均衡器连接发送
##代理协议头在连接时间给代理。
##此设置仅适用于AMQP客户端,其他协议
##像MQTT或STOMP这样的##有自己的设置来启用代理协议。
##请参阅插件文档以获取更多信息。
##
#proxy_protocol = false
## ------------------------------------------------ ----------------------------
##高级的Erlang网络/集群选项。
##
##相关文档指南:http://rabbitmq.com/clustering.html
## ------------------------------------------------ ----------------------------
#======================================
#内核部分
#======================================
#kernel.net_ticktime = 60
## ------------------------------------------------ ----------------------------
## RabbitMQ管理插件
##
##相关文档指南:http://rabbitmq.com/management.html。
## ------------------------------------------------ ----------------------------
#=======================================
#管理部分
#=======================================
##从以下JSON文件中预载模式定义。
##相关文档指南:http://rabbitmq.com/management.html#load-definitions。
##
#management.load_definitions = /path/to/exported/definitions.json
##将所有对管理HTTP API的请求记录到一个文件中。
##
#management.http_log_dir = /path/to/access.log
##更改HTTP侦听器侦听的端口,
##指定Web服务器绑定的接口。
##还要将侦听器设置为使用TLS并提供TLS选项。
##
#management.listener.port = 15672
#management.listener.ip = 127.0.0.1
#management.listener.ssl = true
#management.listener.ssl_opts.cacertfile = /path/to/cacert.pem
#management.listener.ssl_opts.certfile = /path/to/cert.pem
#management.listener.ssl_opts.keyfile = /path/to/key.pem
##“基本”,“详细”或“无”之一。看到
## http://rabbitmq.com/management.html#fine-stats了解更多详情。
#management.rates_mode =基本
##配置聚合数据的长度(如消息速率和队列
##长度)被保留。请阅读插件的文档
## http://rabbitmq.com/management.html#configuration更多
## 细节。
##您可以使用“分钟”,“小时”和“日”键或整数键(以秒为单位)
#management.sample_retention_policies.global.minute = 5
#management.sample_retention_policies.global.hour = 60
#management.sample_retention_policies.global.day = 1200
#management.sample_retention_policies.basic.minute = 5
#management.sample_retention_policies.basic.hour = 60
#management.sample_retention_policies.detailed.10 = 5
## ------------------------------------------------ ----------------------------
## RabbitMQ铲子插件
##
##相关文档指南:http://rabbitmq.com/shovel.html
## ------------------------------------------------ ----------------------------
## Shovel插件配置示例在additional.config文件中定义
## ------------------------------------------------ ----------------------------
## RabbitMQ STOMP插件
##
##相关文档指南:http://rabbitmq.com/stomp.html
## ------------------------------------------------ ----------------------------
#=======================================
#STOMP部分
#=======================================
##网络配置。格式通常与核心代理相同。
##
#stomp.listeners.tcp.default = 61613
##与ssl监听器相同
##
#stomp.listeners.ssl.default = 61614
##将接受TCP连接的Erlang进程的数量
##和TLS监听器。
##
#stomp.num_acceptors.tcp = 10
#stomp.num_acceptors.ssl = 1
##其他TLS选项
##使用TLS时,从客户端证书中提取名称。
##
#stomp.ssl_cert_login = true
##设置默认的用户名和密码。这被用作默认登录
##每当CONNECT框架省略登录名和密码头。
##
##请注意,设置这将允许客户端连接没有
##验证!
##
#stomp.default_user = guest
#stomp.default_pass = guest
##如果配置了默认用户,或者您已配置使用TLS客户端
##证书为基础的身份验证,您可以选择允许客户端
##完全忽略CONNECT帧。如果设置为true,则客户端是
##自动连接为默认用户或用户提供的
##每当在一个会话上发送的第一帧不是一个## TLS证书
##连接框架。
##
#stomp.implicit_connect = true
##是否启用代理协议支持。
##一旦启用,客户端不能直接连接到代理
##了。他们必须通过一个负载均衡器连接发送
##代理协议头在连接时间给代理。
##此设置仅适用于STOMP客户端,其他协议
##像MQTT或AMQP这样的##有自己的设置来启用代理协议。
##请参阅插件或代理文档以获取更多信息。
##
#stomp.proxy_protocol = false
## ------------------------------------------------ ----------------------------
## RabbitMQ MQTT适配器
##
##见https://github.com/rabbitmq/rabbitmq-mqtt/blob/stable/README.md
##的细节
## ------------------------------------------------ ----------------------------
#=======================================
#MQTT部分
#=======================================
##设置默认的用户名和密码。将被用作默认登录
##如果连接客户端没有提供其他登录信息。
##
##请注意,设置这将允许客户端连接没有
##验证!
##
#mqtt.default_user = guest
#mqtt.default_pass = guest
##启用匿名访问。如果这被设置为false,客户端必须提供
##登录信息才能连接。请参阅default_user / default_pass
##配置元素管理登录没有身份验证。
##
#mqtt.allow_anonymous = true
##如果你有多个chosts,指定哪个
##适配器连接。
##
#mqtt.vhost = /
##指定发布来自MQTT客户端的消息的交换。
##
#mqtt.exchange = amq.topic
##指定TTL(生存时间)来控制非干净会话的生命周期。
##
#mqtt.subscription_ttl = 1800000
##设置预取计数(控制未确认的最大数量
##消息将被交付)。
##
#mqtt.prefetch = 10
## TCP / SSL配置(按照代理配置)。
##
#mqtt.listeners.tcp.default = 1883
##与ssl监听器相同
##
#mqtt.listeners.ssl.default = 1884
##将接受TCP连接的Erlang进程的数量
##和TLS监听器。
##
#mqtt.num_acceptors.tcp = 10
#mqtt.num_acceptors.ssl = 1
## TCP侦听器选项(按照代理配置)。
##
#mqtt.tcp_listen_options.backlog = 128
#mqtt.tcp_listen_options.nodelay = true
##是否启用代理协议支持。
##一旦启用,客户端不能直接连接到代理
##了。他们必须通过一个负载均衡器连接发送
##代理协议头在连接时间给代理。
##此设置仅适用于STOMP客户端,其他协议
##像STOMP或AMQP有自己的设置来启用代理协议。
##请参阅插件或代理文档以获取更多信息。
##
#mqtt.proxy_protocol = false
## ------------------------------------------------ ----------------------------
## RabbitMQ AMQP 1.0支持
##
##见https://github.com/rabbitmq/rabbitmq-amqp1.0/blob/stable/README.md。
## ------------------------------------------------ ----------------------------
#=======================================
#AMQP 1.0部分
#=======================================
##未通过SASL认证的连接将以此连接
##帐户。请参阅自述文件以获取更多信息。
##
##请注意,设置这将允许客户端连接没有
##验证!
##
#amqp1_0.default_user = guest
##启用协议严格模式。请参阅自述文件以获取更多信息。
##
#amqp1_0.protocol_strict_mode = false
## Lager控制记录。
##请参阅https://github.com/basho/lager获取更多文档
##
## Log direcrory,默认情况下取自RABBITMQ_LOG_BASE env变量。
##
#log.dir = / var / log / rabbitmq
##记录到控制台(可以为true或false)
##
#log.console = false
## Loglevel登录到控制台
##
#log.console.level = info
##记录到文件。可以是假的或文件名。
##默认:
#log.file = rabbit.log
## 把关掉:
#log.file = false
## Loglevel记录到文件
##
#log.file.level = info
##文件旋转配置。没有旋转的defualt。
##不要将旋转日期设置为“”。如果需要“”值,请保持不变
#log.file.rotation.date = $ D0
#log.file.rotation.size = 0
## QA:配置系统日志记录
#log.syslog = false
#log.syslog.identity = rabbitmq
#log.syslog.level = info
#log.syslog.facility =守护进程
## ------------------------------------------------ ----------------------------
## RabbitMQ LDAP插件
##
##相关文档指南:http://rabbitmq.com/ldap.html。
##
## ------------------------------------------------ ----------------------------
#=======================================
#LDAP部分
#=======================================
##
##连接到LDAP服务器
## ================================
##
##指定要绑定的服务器。你*必须*设置为了插件
##正常工作。
##
#auth_ldap.servers.1 =你的服务器名称在这里
##您可以定义多个服务器
#auth_ldap.servers.2 =你的其他服务器
##使用TLS连接到LDAP服务器
##
#auth_ldap.use_ssl = false
##指定要连接的LDAP端口
##
#auth_ldap.port = 389
## LDAP连接超时,以毫秒或“无限”
##
#auth_ldap.timeout =无限
##或号码
#auth_ldap.timeout = 500
##启用LDAP查询的记录。
##其中之一
## - false(不记录)
## - true(详细记录插件使用的逻辑)
## - 网络(如同,但另外记录LDAP网络流量)
##
##默认为false。
##
#auth_ldap.log = false
##也可以是真实的或网络
#auth_ldap.log = true
#auth_ldap.log =网络
##
##认证
## ==============
##
##模式将通过AMQP给出的用户名转换为DN
## 捆绑
##
#auth_ldap.user_dn_pattern = cn = $ {username},ou = People,dc = example,dc = com
##或者,您可以将用户名转换为Distinguished
##绑定后通过LDAP查找命名。请参阅文档
##全部细节。
##通过查找将用户名转换为dn时,将其设置为
##表示用户名的属性的名称,而查找查询的
##base DN。
##
#auth_ldap.dn_lookup_attribute = userPrincipalName
#auth_ldap.dn_lookup_base = DC = gopivotal,DC = com
##控制如何绑定授权查询,也可以
##检索登录用户的详细信息,而不显示一个
##密码(例如,SASL EXTERNAL)。
##其中之一
## - as_user(作为认证用户进行绑定 - 需要密码)
## - 匿名(匿名绑定)
## - {UserDN,Password}(用指定的用户名和密码绑定)
##
##默认为'as_user'。
##
#auth_ldap.other_bind = as_user
##或者可以更复杂:
#auth_ldap.other_bind.user_dn =用户
#auth_ldap.other_bind.password =密码
##如果user_dn和密码定义 - 其他选项被忽略。
#-----------------------------
#太复杂的LDAP部分
#-----------------------------
##
##授权
## =============
##
## LDAP插件可以针对您的应用程序执行各种查询
## LDAP服务器来确定授权的问题。
##
##相关文档指南:http://rabbitmq.com/ldap.html#authorisation。
##以下配置应该在additional.config文件中定义
##不要处理这条线!
##将查询设置为在确定访问虚拟主机时使用
##
## {vhost_access_query,{in_group,
##“ou = $ {vhost} -users,ou = vhosts,dc = example,dc = com”}}
##设置查询以在确定资源(例如,队列)访问时使用
##
## {resource_access_query,{constant,true}},
##设置查询来确定用户拥有哪些标签
##
## {tag_queries,[]}
#]},
#-----------------------------
2.8、参数及策略
RabbitMQ 绝大大多数的配置都可以通过修改rabbitrnq.config 配置文件来完成,但是其中有些配置并不太适合在rabbitrnq.config 中去实现。比如某项配置不需要同步到集群中的其他节点中,或者某项配置需要在运行时更改,因为rabbitrnq.config 需要重启Broker 才能生效。这种类型的配置在RabbitMQ 中的另一种称呼为参数(P缸ameter) ,也可以称之为运行时参数(Runtime Parameter) 。英文中的"arguments" 也翻译为参数,比如channel .basicPublish 方法中的参数就是指"arguments",为了与之能够有效地区分,后边都使用 Parameter 或者 Runtime Parameter 的称谓来进行相应的阐述。
Parameter 可以通过rabbitrnqctl 工具或者RabbitMQ Management 插件提供的HTTP API接口来设置。RabbitMQ 中一共有两种类型的Parameter: vhost 级别的Parameter 和global 级别的Parameter。vhost 级别的Parameter 由一个组件名称(component name) 、名称(name) 和值
( value) 组成,而global 级别的参数由一个名称和值组成,不管是vhost 级别还是global 级别的
参数,其所对应的值都是JSON 类型的。举例来说, Federation upstream 是一个vhost 级别的
Parameter ,它用来定义Federation link 的上游信息,其对应的Parameter 的组件名称为
" federation-upstream" 名称对应于其自身的名称,而值对应于与上游的相关的连接参数等;对
于Shovel 而言也可以通过Parameter 设置,其对应组件名称为"shovel"
vhost 级别的参数对应的 rabbitmq 相关的命令有三种: set_pararneter 、list_parameters 和clear_parameter。
rabbitmqctl set_parameter [-p vhost] {component_name} {name} {value}
用来设置一个参数。示例如下(例子中演示的Federation upstream 的Parameter 设置, 需要
先开启rabbitmq federation 插件) :
[root@myblnp ~]# rabbitmq-plugins enable rabbitmq_federation
Enabling plugins on node rabbit@myblnp:
rabbitmq_federation
The following plugins have been configured:
rabbitmq_federation
rabbitmq_management
rabbitmq_management_agent
rabbitmq_web_dispatch
Applying plugin configuration to rabbit@myblnp...
The following plugins have been enabled:
rabbitmq_federation
started 1 plugins.
[root@myblnp ~]#
使用 Rabbitmq_federation 插件设置参数:
[root@myblnp ~]# rabbitmqctl set_parameter federation-upstream f1 '{"uri":"amqp://root:[email protected]:5672","ack-mode":"on-confirm"}'
Setting runtime parameter "f1" for component "federation-upstream" to "{"uri":"amqp://root:[email protected]:5672","ack-mode":"on-confirm"}" in vhost "/" ...
[root@myblnp ~]#
rabbitmqctllist_parameters [-p vhost]
#用来列出指定虚拟主机上所有的Parameter
[root@myblnp ~]# rabbitmqctl list_parameters -p /
Listing runtime parameters for vhost "/" ...
component name value
federation-upstream f1 {"ack-mode":"on-confirm","uri":"amqp://root:[email protected]:5672"}
[root@myblnp ~]#
rabbitmqctl clear_parameter [-p vhost] {componenet_name} {key}
#用来清除指定的参数
[root@myblnp ~]# rabbitmqctl clear_parameter -p / federation-upstream f1
Clearing runtime parameter "f1" for component "federation-upstream" on vhost "/" ...
[root@myblnp ~]#
[root@myblnp ~]# rabbitmqctl list_parameters -p /
Listing runtime parameters for vhost "/" ...
[root@myblnp ~]#
与rabbitmqctl 工具相对应的HTTP API 接口如下所述:
- 设置一个参数: PUT /api/parameters/{componenet_name}/vhost/name
- 清除一个参数: DELETE /api/parameters/{componenet_name}/vhost/name
- 列出指定vhost 中的所有参数: GET /api/parameters
global 级别的 Parameter 操作
方式详细内容rabbitmqctlrabbitmqctl set_global_parameter name valuerabbitmqctl list_global_parametersrabbitmqctl clear_global_parameter nameHTTP API 接口PUT /api/global-parameters/nameDELETE /api/global-parameters/nameGET /api/global-parameters/
[root@myblnp ~]# rabbitmqctl list_global_parameters
Listing global runtime parameters ...
name value
cluster_name "myblnps"
internal_cluster_id "rabbitmq-cluster-id-jpA-C8h6S2NRi300jibXlQ"
[root@myblnp ~]#
[root@myblnp ~]#
[root@myblnp ~]# rabbitmqctl set_global_parameter name1 '{}'
Setting global runtime parameter "name1" to "{}" ...
[root@myblnp ~]#
[root@myblnp ~]#
[root@myblnp ~]# rabbitmqctl list_global_parameters
Listing global runtime parameters ...
name value
cluster_name "myblnps"
internal_cluster_id "rabbitmq-cluster-id-jpA-C8h6S2NRi300jibXlQ"
name1 []
[root@myblnp ~]# rabbitmqctl clear_global_parameter name1
Clearing global runtime parameter "name1" ...
[root@myblnp ~]#
[root@myblnp ~]#
[root@myblnp ~]# rabbitmqctl list_global_parameters
Listing global runtime parameters ...
name value
cluster_name "myblnps"
internal_cluster_id "rabbitmq-cluster-id-jpA-C8h6S2NRi300jibXlQ"
[root@myblnp ~]#
除了一些固定的参数(比如durable 或者exclusive) ,客户端在创建交换器或者队列的时候可以配置一些可选的属性参数来获得一些不同的功能,比如x-message-ttl 、x-expires 、x-max-length 等。通过客户端设定的这些属性参数一旦设置成功就不能再改变(不能修改也不能添加),除非删除原来的交换器或队列之后再重新创建新的。
Policy 的介入就可以很好的解决这类问题,它是一种特殊的Parameter 的用法。Policy 是vhost 级别的。一个Policy 可以匹配一个或者多个队列(或者交换器,或者两者兼有),这样便于批量管理。与此同时,Policy 也可以支持动态地修改一些属性参数, 大大地提高了应用的灵活度。一般来说, Policy 用来配置Federation 、镜像、备份交换器、死信等功能。
rabbitmq_managemet 插件本身就提供了Policy 的支持。可以在"Admin" -> "Policies "
-> "Add / update a policy" 中添加一个Policy 。包含以下几个参数:
- Virtual host: 表示当前Policy 所在的vhost 是哪个。
- Name : 表示当前Policy 的名称
- Pattern: 一个正则表达式,用来匹配相关的队列或者交换器
- Apply to : 用来指定当前Policy 作用于哪一方。一共有三个选项"Exchanges and queues" 表示作用与Pattern 所匹配的所有队列和交换器; "Exchanges" 表示作用于与Pattern 所匹配的所有交换器; "Queues" 表示作用于与Pattern 所匹配的所有队列
- Priority: 定义优先级。如果有多个Policy 作用于同一个交换器或者队列,那么Priority 最大的那个Policy 才会有用
- Definition: 定义一组或者多组键值对,为匹配的交换器或者队列附加相应的功能
作为一种Paramter,Policy 也可以通过rabbitmqctl 工具或者HTTP API 接口来操作。与前面所讲的Parameter 对应, rabbitmqctl 工具或者HTTP API 接口各种都有set 、clear 和list的功能。
rabbitmqctl set_policy [-p vhost] [--priority priority] [--apply-to apply-to] {name} {pattern}
{definition}#用来设置一个Policy。其中的参数name 、patte口和definition 是必填项
#示例如下,设置默认的vhost 中所有以"^amq." 开头的交换器为联邦交换器:
[root@myblnp ~]#
[root@myblnp ~]# rabbitmqctl set_policy --apply-to exchanges --priority 1 p1 "^amq." '{"federation-upstream":"f1"}'
Setting policy "p1" for pattern "^amq." to "{"federation-upstream":"f1"}" with priority "1" for vhost "/" ...
[root@myblnp ~]#
[root@myblnp ~]#
#对应的HTTP API 接口调用为:
[root@myblnp ~]# curl -i -u root:root123 -XPUT -d '{"pattern":"^amq\.","definition":{"federation-upstream":"f2"},"priority":2,"apply-to":"exchanges"}' http://192.168.56.106:15672/api/policies/%2F/p2
HTTP/1.1 201 Created
content-length: 0
content-security-policy: script-src 'self' 'unsafe-eval' 'unsafe-inline'; object-src 'self'
date: Tue, 17 Oct 2023 02:52:49 GMT
server: Cowboy
vary: accept, accept-encoding, origin
[root@myblnp ~]#
rabbitmqctl list_policies [-p vhost]
#列出默认vhost 中所有的Policy
[root@myblnp ~]# rabbitmqctl list_policies
Listing policies for vhost "/" ...
vhost name pattern apply-to definition priority
/ AE2 ^exchange_demo$ all {"alternate-exchange":"myAE"} 0
/ p1 ^amq. exchanges {"federation-upstream":"f1"} 1
/ p2 ^amq\. exchanges {"federation-upstream":"f2"} 2
[root@myblnp ~]#
[root@myblnp ~]#
#HTTP API 接口查询
[root@myblnp ~]# curl -i -u root:root123 -XGET http://192.168.56.106:15672/api/policies/%2F
HTTP/1.1 200 OK
cache-control: no-cache
content-length: 375
content-security-policy: script-src 'self' 'unsafe-eval' 'unsafe-inline'; object-src 'self'
content-type: application/json
date: Tue, 17 Oct 2023 02:56:03 GMT
server: Cowboy
vary: accept, accept-encoding, origin
[{"vhost":"/","name":"AE2","pattern":"^exchange_demo$","apply-to":"all","definition":{"alternate-exchange":"myAE"},"priority":0},{"vhost":"/","name":"p1","pattern":"^amq.","apply-to":"exchanges","definition":{"federation-upstream":"f1"},"priority":1},{"vhost":"/","name":"p2","pattern":"^amq\\.","apply-to":"exchanges","definition":{"federation-upstream":"f2"},"priority":2}][root@myblnp ~]#
[root@myblnp ~]#
[root@myblnp ~]#
rabbitmqctl clear_policy [-p vhost] {name}
#清除指定的Policy
[root@myblnp ~]# rabbitmqctl clear_policy p1
Clearing policy "p1" on vhost "/" ...
[root@myblnp ~]#
[root@myblnp ~]# rabbitmqctl list_policies
Listing policies for vhost "/" ...
vhost name pattern apply-to definition priority
/ AE2 ^exchange_demo$ all {"alternate-exchange":"myAE"} 0
/ p2 ^amq\. exchanges {"federation-upstream":"f2"} 2
[root@myblnp ~]#
[root@myblnp ~]#
[root@myblnp ~]# curl -i -u root:root123 -XDELETE http://192.168.56.106:15672/api/policies/%2F/p2
HTTP/1.1 204 No Content
content-security-policy: script-src 'self' 'unsafe-eval' 'unsafe-inline'; object-src 'self'
date: Tue, 17 Oct 2023 02:58:47 GMT
server: Cowboy
vary: accept, accept-encoding, origin
[root@myblnp ~]#
[root@myblnp ~]# rabbitmqctl list_policies
Listing policies for vhost "/" ...
vhost name pattern apply-to definition priority
/ AE2 ^exchange_demo$ all {"alternate-exchange":"myAE"} 0
[root@myblnp ~]#
特别注意:****如果两个或多个Policy 都作用到同一个交换器或者队列上,且这些Policy 的优先级都是一样的,则参数项最多的Policy 具有决定权。如果参数一样多,则最后添加的Policy 具有决定权。
版权归原作者 沿途欣赏i 所有, 如有侵权,请联系我们删除。