《RabbitMQ实战指南》整理(四)RabbitMQ管理和配置

一、多租户与权限

每一个RabbitMQ服务器都能创建虚拟的消息服务器,我们称之为虚拟主机,简称vhost,每个vhost本质上是一个独立的小型RabbitMQ服务器,拥有自己独立的队列交换器及绑定关系,并拥有自己独立的权限。vhost之间是绝对隔离的,以保证安全性及可移植性。vhost是AMQP概念的基础,客户端在连接的时候必须指定一个vhost。

使用rabbitmqctl add_vhost {vhost}命令创建一个新的vhost;使用rabbitmqctl list_vhosts [vhostInfoItem]可以查看当前vhost的信息,vhostInfoItem的取值有两个,name表示vhost的名称,tracing表示是否使用了RabbitMQ的trace功能;使用rabbitmqctl delete_vhost [hostName]可以删除对应的vhost

RabbitMQ中的权限控制是以vhost为单位的,创建一个用户时,yoghurt通常会被指派给至少一个vhost,并且只能访问被指派的vhost内的队列、交换器和绑定关系,因此RabbitMQ中的授予权限是在vhost级别进行的。授权命令为rabbitmqctl set_permissions -p [vhost] [user] [conf] [write] [read]:其中vhost为vhost名称,user为用户名,conf用于匹配用户在哪些资源上拥有可配置资源的正则表达式,write用于匹配用户在哪些资源上拥有可写资源的正则表达式,read用于匹配用户在哪些资源上拥有可读资源的正则表达式。可配置指的是队列和交换器的创建及删除的操作,可写指的是发布消息,可读指的是与消息相关的操作。

清除权限的命令为rabbitmqctl clear_permissions -p [vhost] [userName];查看虚拟主机上的权限列表的命令为rabbitmqctl list_user_permissions -p [vhost];查看某个用户的权限命令为rabbitmqctl list_user_permissions [userName]

二、用户管理

RabbitMQ中用户是访问控制的基本单元,且单个用户可以跨越多个vhost进行授权,针对一至多个vhost,用户可以被赋予不同级别的访问权限。创建用户的命令为rabbitmqctl add_user [userName] [password]rabbitmqctl change_password [userName] [newpassword]命令可以用来更改用户的密码;此外rabbitmqctl clear_password [userName]可以清除密码,清除密码后不需要密码即可登录;删除用户的命令是rabbitmqctl delete_user [userName]

rabbitmqctl list_users命令可以列出当前所有的用户,后面会紧跟用户的角色。用户角色分为5种:

  • node:无任何角色,新创建的用户角色默认为none;
  • management:可以访问Web管理页面;
  • policymaker:包含management的所有权限,并且可以管理策略和参数;
  • monitoring:包含management的所有权限,并且可以看到所有的连接、信道及节点相关的信息;
  • administrator:包含monitoring的所有权限,并且可以管理用户、虚拟主机、权限、策略、参数等,它是最高权限

用户的角色可以通过rabbitmqctl set_user_tags [userName] [tag1,tag2..]进行设置,tag参数可以用于设置0个、1个或多个角色,设置完成后会覆盖之前的权限

三、Web端管理

使用rabbitmq-plugins enable [plugin-name]可以启用相关的插件,rabbitmq-plugins disable [plugin-name]可以关闭插件

四、应用与集群管理

1、应用管理

rabbitmqctl stop [pid_file]用于停止RabbitMQ的Erlang虚拟机和RabbitMQ服务应用,如果指定了pid_file还需要等待指定进程的结束

rabbitmqctl shutdown用于停止RabbitMQ的虚拟机和RabbitMQ服务应用,执行这个命令后会阻塞直到Erlang虚拟机进程退出,与stop命令不同的是它不需要指定pid_file

rabbitmqctl stop_app用于通知RabbitMQ服务应用,Erlang虚拟机仍处于运行状态

rabbitmqctl start_app用于启动RabbitMQ应用

rabbitmqctl wait [pid_file]用于等待RabbitMQ应用的启动,它会等到pid_file的创建,然后等待pid_file中所代表的进程启动

rabbitmqctl reset用于将RabbitMQ节点重置还原到最初的状态,执行此命令前必须先停止RabbitMQ应用

rabbitmqctl force_reset用于强制将RabbitMQ节点重置还原到最初状态,它会无条件地重置节点

rabbitmqctl rotate_logs [suffix]用于指示RabbitMQ节点轮换日志文件,RabbitMQ节点会将原来的日志文件中的内容追加到“原始名称+后缀”的日志文件中,然后再将新的日志内容记录到新创建的日志中,当目标文件不存在时会重新创建

rabbitmqctl hipe_compile [directory]用于将部分RabbitMQ代码用Hipe(Erlang版的JIT)编译,并将编译后的文件保存到指定目录

2、集群管理

rabbitmqctl join_cluster [cluster_node] [--ram]用于将节点加入到指定集群中,执行前需要停止RabbitMQ并重置节点

rabbitmqctl cluster_status用于显示集群的状态

rabbitmqctl change_cluster_node_type [disc|ram]用于修改集群节点的类型,执行前需要停止RabbitMQ应用

rabbitmqctl forget_cluster_node [--offline]用于将节点从集群中删除,允许离线执行

rabbitmqctl update_cluster_nodes [clusterNode]用于在集群中的节点应用启动前咨询clusternode节点的最新信息,并更新相应的集群信息

rabbitmqctl force_boot用于确保节点可以启动,即使它不是最后一个关闭的节点(通常情况下RabbitMQ集群被整个关闭后,重启的第一个节点应该时最后关闭的节点)

rabbitmqctl sync_queue -p [vhost] [queue]用于指示未同步队列queue的slave镜像可以同步master镜像行的内容,同步期间此队列会被阻塞(该队列的所有生产者消费者),直到同步完成

rabbitmqctl cannel_sync_queue -p [vhost] [queue]用于取消队列同步镜像的操作

rabbitmqctl set_cluster_name [name]用于设置集群的名称,集群名称会在客户端连接时通报给客户端

五、服务器状态

rabbitmqctl list_queues -p [vhost] [queueInfoItem...]命令返回队列相关的信息,queueInfoItem参数用于指示哪些队列的信息项显示在结果集中,结果集的列顺序将匹配参数的顺序,如果没有指令queueInfoItem,那么该命令将显示队列额名称和消息的个数

rabitmqctl list_exchanges -p [vhost] [exchangeInfoItem...]返回交换器的详细细节,如果没有-p vhost将显示默认的vhost

rabbitmqctl list_bindings - [vhost] [bindingInfoItem...]将返回绑定关系的细节

rabbitmqctl list_connections [connetionInfoItem...]返回TCP/IP连接的统计信息

rabbitmqctl list_channels [channelInfoItem...]返回当前所有信道的信息

rabbitmqctl list_consumers -p [vhost]列举消费者信息

rabbitmqctl status显示Broker的状态

rabbitmqctl node_health_check对RabbitMQ节点进行健康检查,确定应用是否正常运行,list_queues和list_channels是否能够正常返回等

rabbitmqctl environment显示每个运行程序环境中每个变量的名称和值

rabbitmqctl report为所有服务器状态生成一个服务器状态报告,并将输出重定向到一个文件

rabbitmqctl eval {expr}执行任意Erlang表达式

若要删除所有的交换器、队列及绑定关系,删除对应的vhost即可,而不需要一个个遍历删除

六、HTTP API接口管理

RabbitMQ Management插件提供HTTP API接口来方便调用,如创建队列可以通过PUT方法调用/api/queues/vhost/name接口来实现。这里的HTTP API是完全基于RESTful风格的,GET方法一般用来获取集群、节点、队列、交换器等信息,PUT方法用来创建交换器、队列等资源,DELETE方法用来删除资源,POST方法同样用来创建资源,但创建的是无法用具体名称的资源,如绑定关系及发布关系

七、环境变量

RabbitMQ提供了三种方式来定制化服务:①通过环境变量配置服务端参数;②通过配置文件定义服务和插件设置;③通过运行时参数和策略定义集群层面的服务设置

环境变量以RabbitMQ下划线开头,可以在Shell中设置,也可以在rabbitmq-env.conf文件中设置,如果在非shell环境中,需要去掉RabbitMQ下划线开头。优先级为Shell环境最优先,conf文件次之,最后是默认的配置。

八、配置文件

1、配置加密

配置文件中一些敏感的信息可以进行加密,RabbitMQ启动时会对这些信息进行解密,我们需要遵循一些必要的规范,将敏感数据不以文本的形式保存在配置文件中。

比如可以使用{encrypted,<<"加密后的字符串">>}{config_enter_decoder,[{passphrase,<<"口令">>}]}来进行对应的加密和解密,加密后的字符串可以通过rabbitmqctl encode '<<“密码”>>' 口令来获得,解密则可以使用rabbitmqctl encode --decode '{encrypted,<<"加密后的字符串">>}' 口令来获取。默认情况下,加密机制PBKDF2用来从口令中派生出密钥,默认的Hash算法是SHA512,当然这也是可配置的。

2、优化网络配置

网络是客户端和RabbitMQ之间通信的媒介,RabbitMQ支持的所有协议都是基于TCP层面的,除了操作系统内核参数和DNS,所有的RabbitMQ设置都可以通过在rabbitmq.config配置文件中配置实现。

  • 默认情况下,RabbitMQ会在所有可用的网络接口上监听5672端口,而网络接口(可以理解为IP)可以使用rabbit.tcp_listeners选项来配置。
  • 增大TCP缓冲区大小可以提高吞吐量,但也会导致服务占用的内存增大,RabbitMQ中可以使用rabbit.tcp_listen_options来加大配置;另外也可以禁用Nagle算法增大TCP缓冲区大小
  • 线程池的大小可以通过Rabbitmq_server_addItional_erl_args环境变量来调节,但并不是越高越能提高吞吐量。
  • 在优化并发连接数时需要确保系统有足够的文件句柄来支撑客户端和Broker的交互,节点连接数*1.5即为设置的文件句柄数,增大句柄数会增加闲置内存的使用量
  • 禁用Nagle算法可以提高吞吐量,但其主要作用还是用于减少延迟,RabbitMQ内部节点交互式可以在kernel.inet_default_connect_options和kernel.inet_default.tcp_listen_options配置项中配置{nodelay,true}来禁用Nagle算法,rabbitmq.tcp_listen_options中同样需要添加上述配置;
  • 当连接数量过多时,需要确保服务器能够接受入站连接,为接受的TCP连接将会放在长度限制的队列中,可以通过rabbit.tcp_listen_options.backlog参数进行设置,当挂起的连接队列长度超出此值时,连接将被操作系统拒绝

九、参数及策略

1、RabbitMQ绝大数配置可以通过config文件实现,但部分配置不适合在配置文件中实现,如某项配置需要在运行时更改,因此该类参数也称为运行时参数,这里我们称之为Parameter。Parameter可以通过rabbitmqctl工具或者RabbitMQ Management插件提供的HttpAPI接口来设置

2、RabbitMQ中共有两种类型的Parameter,vhost级别的Parameter和global级别的Parameter。vhost级别的Parameter由一个组件名称,名称和值组成,而global级别的参数由一个名称和值组成,两者对应的值都是Json格式

vhost级别的参数对应的rabbitmqctl相关的命令有三种:

  • set_parameter:用来设置一个参数,rabbitmqctl set_parameter [-p vhost] {component_name} {name} {value}
  • list_parameter:用来列出指定虚拟主机上所有的Parameter,rabbitmqctl list_parameters [-p vhost]
  • clear_parameter:用来清除指定的参数,rabbitmqctl clear_parameter [-p vhost] {componment_name} {key}

与rabbitmqctl工具对应的HTTPAPI接口如下:

  • 设置一个参数:PUT /api/parameters/{componenet_name}/vhost/name
  • 清除一个参数:Delete /api/parameters/{componenet_name}/vhost/name
  • 列出指定vhost中的所有参数:GET /api/parameters

golbal同上,区别就是将rabbitmqctl命令中的parameter替换为global_parameter,HTTPAPI接口中的parameters替换为global-parameter

3、Policy是一种特殊的Parameter用法,它是vhost级别的,一个Policy可以配置一个或多个队列以便于批量管理,此外Policy支持动态地修改一些属性参数,如Federation、镜像、备份交换器、死信等功能,大大提高了应用的灵活度。rabbitmq_managemet插件提供了对Policy的支持,可以在Admin-Poicies中添加一个Policy:

  • Virtual host表示当前Policy所在的vhost
  • Name表示当前Policy的名称
  • Pattern表示一个正则表达式,用来匹配相关的队列或者交换器
  • Apply to用来指定Policy作用于哪一方;
  • Priority表示优先级,如果多个Policy作用于同一个交换器或者队列,那么Priority最大的那个Policy才会有用;
  • Definition定义一组或多组键值对,为匹配的交换器或队列附加相关的功能

Policy作为一种Parameter,同样可以使用rabbitmqctl工具或者HTTPAPI接口来操作:

rabbitmqctl set_policy [-p vhost] [--priority] [--apply-to apply-to] {name} {pattern} {definition}其中参数name、patten和definition是必填项。如果两个或多个Policy都作用于同一个交换器或者队列上,且优先级一样,那么参数最多的Policy拥有决定权,如果参数一样多,后添加的Policy具有决定权

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章