关闭

系统拆分解耦利器之消息队列---RabbitMQ-Configuration

标签: rabbitmq配置configuration
1360人阅读 评论(1) 收藏 举报
分类:

[一曲广陵不如晨钟暮鼓]

通过前面的一系列文章,我们给大家介绍了RabbitMQ的基本用法。从本文开始,我们将介绍关于RabbitMQ的服务器配置的相关内容,鉴于英语水平比较渣,建议各位看官在学习的时候最好对比官方文档一起看,如果发现不合适的地方,欢迎积极留言!

官方文档:http://www.rabbitmq.com/configure.html#configuration-file

--------------------------------------------------------------------------------------------------------------------------------------------------------

RabbitMQ configuration

概述

RabbitMQ本身内置了一份配置信息,并且很大程度上能够很好的满足大多数的应用场景。如果其能够正常运行的,那么你可能就不在需要配置其他任何信息了。

RabbitMQ提供3种通用的方式来满足服务器上个性化的需求:

  • 环境变量(environment variables):默认端口,文件未知,节点名称(或者在shell上进行设置,或者在环境配置文件中配置,rabbitmq-env.conf/rabbitmq-env-conf.bat)
  • 配置文件(a configuration file):用于设置服务器的各种组件的约束,如权限,范围,集群,插件等配置。
  • 运行时参数和策略(runtime parameters and policies):用于设置对集群边界范围内的相关设置,这些设置可以在运行时改变。

大多数情况下,我们只需要配置前两项,因此,在本文中,我们也重点关注这两点内容。

配置文件的位置(Config File Locations)

默认的配置文件位置不同于操作系统和包类型。关于这个问题将在本文接下来的部分做详细介绍。

为了验证有效的RabbitMQ配置文件的位置,请阅读下面的内容。

验证配置(如何找到配置文件的位置)

实际生效的配置文件可以通过监视RabbitMQ的日志文件来验证。日志中将会显示顶端节点和其他broker引导的清单条目信息。如下:

node           : rabbit@example
home dir       : /var/lib/rabbitmq
config file(s) : /etc/rabbitmq/rabbitmq.config
如果日志文件没有被RabbitMQ发现,清单信息显示为:

node           : rabbit@example
home dir       : /var/lib/rabbitmq
config file(s) : /var/lib/rabbitmq/hare.config (not found)

定制RabbitMQ环境

某些服务器参数可以使用环境变量进行配置,如:节点名称,RabbitMQ配置文件位置,AMQP 0-9-1,内部节点交流的端口,等等。

Unix(general)

在基于Unix的系统中,包裹Linux,MacOSX,你可以创建/编辑rabbitmq-env.cof 来定义环境变量。文件的位置可以使用RABBITMQ_CONF_ENV_FILE环境变量。

环境变量的标准使用方法,如下:(要去掉“RABBITMQ_”前缀)

#example rabbitmq-env.conf file entries
#Rename the node
NODENAME=bunny@myhost
#Config file location and new filename bunnies.config
CONFIG_FILE=/etc/rabbitmq/testdir/bunnies
更多内容请在rabbitmq-env.conf文件中查看

Windows

如果是在Windows环境下进行配置,这是最简单的方法:开始--->计算机--->右键,属性--->高级系统设置--->环境变量。接着,根据需要创建对应的环境变量即可,关于这个就不过多讲了,各位看官应该再熟悉不过了。

另一种可选的方式是,亦可以创建/编辑 rabbitmq-env-conf.bat文件来定义环境变量。其位置是通过配置环境变量中RABBITMQ_CONF_ENV_FILE进行设置。

在Window环境下,一旦环境信息发生变化,服务需要重新安装。直接重启服务显然是不够的。具体步骤,可以运行installer,或者用管理员权限打开命令行工具,步骤如下:

  • 开启一个管理员权限的命令行窗口。
  • 进入RabbitMQ安装目录下的sbin文件夹,如(C:\Program Files (x86)\RabbitMQ Server\rabbitmq_server-3.6.5\sbin
  • 运行命令:rabbitmq-service.bat remove
  • 通过命令行设置环境变量,如:set RABBITMQ_BASE=c:\data\RabbitMQ
  • 运行命令:rabbitmq-service.bat install

另外,如果新的配置需要在下一个broker重启之后才发挥作用的话,第一步是可以被跳过的。

RabbitMQ环境变量(RabbitMQ Environment Variables)

RabbitMQ所有环境变量的名称都是包括“RABBITMQ_”前缀的。典型的变量命名RABBITMQ_var_name按照如下方式定义:

  • 优先级第一:如果在shell中定义了环境变量RABBITMQ_var_name,则优先使用该环境变量。
  • 优先级第二:如果在rabbitmq-env.conf文件中配置var_name变量。
  • 优先级第三:系统默认值。

按照上面设置规则,优先级数越小的,优先级越高。

但这并不意味着,你需要配置所有的环境变量。如果你有非标准化的需求的话,可以参考下面这张表格进行配置,但该表只列举了部分内容:

Name Default Description
RABBITMQ_NODE_IP_ADDRESS 空字符串---表明绑定所有网络接口 如果你只需要绑定唯一的一个网络接口,则可以对该项进行相关配置
RABBITMQ_NODE_PORT 接口5672
RABBITMQ_DIST_PORT RABBITMQ_NODE_PORT+20000 用于集群的端口,如果你在配置文件中配置了inet_dist_listen_min
或者inet_dest_listen_max则该项配置被忽略
RABBITMQ_NODENAME Unix*:rabbit@$HOSTNAME
windows:rabbit@%COMPUTERNAME%
节点名称需要在erlang-node-and-machine级别上做到唯一。
如果想运行多个节点,请参考集群教程的配置,我们后续再做相关介绍。
RABBITMQ_CONF_ENV_FILE Unix*:$RABBITMQ_HOME/etc/rabbitmq/rabbitmq-env.conf
Debain:/etc/rabbitmq/rabbitmq-env.conf
RPM:/etc/rabbitmq/rabbitmq-env.conf
Mac OS X:${install_prefix}/etc/rabbitmq-env.conf
Windows:%APPDATA%\RabbitMQ\rabbitmq-env-conf.bat
包含环境变量定义的文件的位置,(变量定义没有RABBITMQ_prefix)。
特别的,windows系统中的文件命名不同于其他的操作系统。
RABBITMQ_USE_LONGNAME
当被设置为true时,RabbitMQ将使用节点的全路径名称来识别节点。
这在EC2上可能有有用的。
注意:在使用短名称,长名称之间不重新设置节点的条件下
,节点是不能起作用的。
RABBITMQ_SERVICENAME Windows Service:RabbitMQ 安装服务的名称,将出现在services.msc中。
RABBITMQ_CONSOLE_LOG Windows Service 该变量被设置为new或者reuse,从服务器控制台输出
重定向到文件%RABBITMQ_SERVICENAME%.debug中,
文件位于默认的RABBITMQ_BASE目录当中。
如果没有被设置,服务器上的控制台输出将会被丢弃(默认的)。
如果是new,每当一个服务器启动时,就会创建一个文件。
如果是reuse,每当一个服务器启动时,就会覆盖上一个文件。
RABBITMQ_CTL_ERL_ARGS None 在通过 erl 命令启动 RabbitMQ 服务器时可使用的额外参数,仅在调试状态下使用。
RABBITMQ_SERVER_ERL_ARGS Unix*:“+K true+A30+P 1048576-kernel inet_default_connect_options[{nodelay,true}]"
Windows:none
在通过 erl 命令启动 RabbitMQ 服务器时可使用的额外参数,仅在调试状态下使用。
重写此变量用以替换默认值。
RABBITMQ_SERVER_ADDITIONAL_ERL_ARGS Unix*:None
Windows:None
在通过 erl 命令启动 RabbitMQ 服务器时可使用的额外参数
该变量将被添加到默认参数的默认列表当中。
RABBITMQ_SERVER_START_ARGS None 在通过 erl 命令启动 RabbitMQ 服务器时可使用的额外参数。该参数不会覆盖掉 
此外,还有一些环境变量用于告知RabbitMQ在何处定位其数据库,日志文件,配置文件等等。

其他RabbitMQ需要依赖的环境变量如下:

Name Default Description
HOSTNAME Unix,linux:‘env hostname’
MacOSX:‘env hostname -s’
当前机器名称
COMPUTERNAME Windows:localhost 当前机器名称
ERLANG_SERVICE_MANAGER_PATH Windows Service:
%ERLANG_HOME%\erts-x.x.x\bin
erlsrv.exe的位置,Erlang服务包脚本。

配置文件(Configuration File)

rabbitmq.config 文件

该配置文件用于对核心应用,Erlang服务,RabbitMQ插件进行相关配置。该配置文件是标准的Erlang配置文件,在Erlang官网上有文件进行描述。

示例如下:

[
    {rabbit, [{tcp_listeners, [5673]}]}
  ].
上面的这个示例的作用:将RabbitMQ监听的AMQP 0-9-1规范的客户端端口从5672上转移到5673上。

为了覆盖掉RabbitMQ配置文件位置,请使用RABBITMQ_CONFIG_FILE环境变量。

请注意:该配置文件不同于环境变量文件,rabbitmq-env.conf,其用于在非window系统能改下进行环境变量配置。

rabbitmq.config与rabbitmq-env.conf文件的位置

这两个文件的位置是官方指定的。默认情况下,其不能被创建,但是,其会被放置在下面这些位置上:

  • Unix:$RABBITMQ_HOME/etc/rabbitmq/
  • Debian:/etc/rabbitmq/
  • RPM:/etc/rabbitmq/
  • Mac OS X(Homebrew):${install_prefix}/etc/rabbitmq/,Homebrew前缀通常情况下是:/usr/local/
  • Windows:%APPDATA%\RabbitMQ\

如果rabbitmq-env.conf文件不存在的话,其将会被手动创建,其位置为:环境变量RABBITMQ_CONF_ENV_FILE的值。在Windows操作系统中,其命名为rabbitmq-env.bat

如果rabbitmq.config文件不存在的话,其将会被手动创建。如果你改变为文件的位置,那么就需要修改RABBITMQ_CONFIG_FILE环境变量的值。Erlang在运行时会自动的将“.config”作为后缀拼接到你设置的值之后。

在修改完配置之后,你需要重新启动服务器。Windows系统的用户还需要再增加或者删除配置文件后重新安装服务器。(Windows好麻烦啊,Orz)

rabbitmq.config文件示例

RabbitMQ服务的源码仓库中已经包含了一份示例的配置文件:rabbitmq.config.example。这个配置文件中包含了你可能向想要配置(其中包含一些省略)的大部分配置项的一个示例,以及在本文中包含的一些配置项。该文件中的所有条目均是以被注释掉的形式给出,你可以根据自己的需要开放出响应条目使用。注意:示例文件仅作为示例,而不能作为推荐设置。

在大多数的发行版本当中,我们都把该文件放置在相同的位置,这也是该文件真正应该存放的位置。但是,对Debian和RPM这种做法是禁止的,所以,该文件分别被转移到了/usr/share/doc/rabbitmq-server/ 或者/usr/share/doc/rabbitmq-server-3.6.5/路径下。

rabbitmq.config中的变量配置(Variables Configurable in rabbitmq.config)

大多数用户不需要改变这些配置项的值,并且其中一些是相当难理解的。但是,为了完整性,我们还是给出所有配置项:(可能翻译不精确,望参考官方文档学习)

  • key:Documentation
  • tcp_listeners:监听AMQP连接(无SSL)的端口列表。可以包含证书(意思是监听器其上的所有端口)或者一组对应关系如“{“127.0.0.1”,5672}”来监听一个或多个接口。默认值为:[5672].
  • num_tcp_acceptors:Erlang进程数,将接受TCP监听器的连接。默认值为:10.
  • handshake_timeout:AMQP 0-8/0-9/0-9-1握手的最大时间,单位毫秒。(在socket连接和SSL握手之后),默认值为:10000.
  • ssl_listeners:同上,用于SSL连接。默认值为:[]
  • num_ssl_acceptors:Erlang进程数,将接受SSL监听器的连接。默认值为:1
  • ssl_options:SSL配置,具体内容请查看SSL documentation文档:http://www.rabbitmq.com/ssl.html#enabling-ssl
  • ssl_handshake_timeout:SSL握手的超时时间,单位毫秒。默认值为:5000
  • vm_memory_high_watermark:触发流量控制的存储阈值。默认值为:0.4.具体内容请查看memory-based flow control文档:http://www.rabbitmq.com/memory.html
  • vm_memory_high_watermark_paging_ratio:最大比例的上限,受限于哪个队列开始向磁盘写入消息来释放内存空间。默认值为:0.5、具体内容请查看memory-based flow control文档。
  • disk_free_limit:RabbitMQ存储数据分区的磁盘空闲空间的限制。当磁盘的可用空间低于这一限制是,流控制触发。这个限制可能是RAM本身的总大小。(如{mem_relative,1.0})。也可能是被设置为一个整形的字节数。或者,可选择的,其他的信息单位如:50MB。默认情况下,磁盘空闲空间的大小限制小于50MB。更多内容请查看Disk Alarms文档:http://www.rabbitmq.com/disk-alarms.html。默认值为:50000000
  • log_levels:控制日志的粒度。该值是一个日志时间类别和日志级别的列表。日志的级别可以为“none”“error”“warning”“info”“debug”。从前到后,每一级都会输出之前的所有界别。与平时使用的日志级别控制没有区别。但是,这里类别一共定义了4种,除此之外的事件都会被记录到。这些种类具体如下:channel--所有连接到AMQP channel的事件。connection--所有连接网络的事件。federation--所有互联的事件。mirroring--所有镜像队列的事件。默认值为:[{connection,info}]
  • frame_max:与客户端交换数据的一个frame允许的最大值,单位:byte。设置为0,表示不设限制。但是将会触发QPid客户端的bug。设置一个较大的值可能会提高吞吐量,设置为一个较小的值可能会增大延迟。默认值为:131072
  • channel_max:与客户端连接的最大的channel数量。设置为0,表示不设限制。使用更大的数字会增加broker内存占用。默认值为:0。
  • channel_operation_timeout:channel操作的超时时间,单位:毫秒。(内部使用,不直接暴露给客户端,是因为消息传递协议的不同和局限性)。默认值为:15000.
  • heartbeat:该值代表心跳延迟,单位:秒,其代表服务器发送给connection.tune框架。如果设置为0,心跳数被禁止。客户端可能不会遵从服务器发出的建议,具体详细内容请查看AMQP reference文档:http://www.rabbitmq.com/amqp-0-9-1-reference.html#connection.tune。禁用心跳,可能会提升巨大连接数量下的性能表现,但同时,也可能导致网络设备关闭了不活动的连接。默认值为:60
  • default_vhost:当RabbitMQ重新创建一个数据库时,将创建一个虚拟host。名称为amq.rabbitmq.log的exchange将会存在于整个虚拟host当中。默认值为:<<"/">>
  • default_user:当RabbitMQ重新创建一个数据库时,使用的用户名。默认值为:<<"guest">>
  • default_pass:同上,用户对应的密码。默认值为:<<"guest">>
  • default_user_tags:默认用户的标签分组,默认值为:{administrator}
  • default_permissions:创建用户时,为其分配的默认权限。默认值为:[<<".*">>,<<".*">>,<<".*">>]
  • loopback_users:只允许通过一个loopback接口进行连接到broker的用户列表。(如:localhost)。如果你想允许默认的guest用户进行远程连接,那就需要将其设置到[]。默认值为:[<<"guest">>]
  • cluster_nodes:开启此设置,将在一个节点正好第一次启动时,自动的进行集群连接。数据组的第一个元素表示节点尝试连接的地址,第二个元素只能是disc或者ram表示节点的类型。默认值为:{[],disc}
  • server_properties:在连接上,向客户端声明的键值对的列表。默认值为:[]
  • collect_statistics:统计集合类型。主要作用是进行管理插件。选项如下:none(不产生统计事件),coarse(产生 per-queue/per-channel/per-connection 统计),fine(在上面的基础上,再生成per-message 统计)。绝大部分情况,你不需要改变这里的配置。默认值为:none。
  • collect_statistics_interval:统计集合间隔,单位:毫秒。主要作用在管理插件时。默认值为:5000.
  • auth_mechanisms:为客户提供SASL认证机制。具体内容请查看文档:http://www.rabbitmq.com/authentication.html。默认值为:{"PLAIN","AMQPLAIN}
  • auth_backends:认证/授权后端要使用的列表。该列表包括模块的名称(相同模块被同时用于身份验证和授权)或者2元数组,如{ModN,ModZ},在这种情况下,ModN用于认证,ModZ用于授权。ModZ可以被列表取代,所有元素必须确认被一个授权查询,如{ModN,[ModZ1,ModZ2]}。这种方式允许授权插件混合使用,并提供额外的安全约束。默认值为:{rabbit_auth_backend_internal}
  • reverse_dns_lookups:设置为true,使得RabbitMQ执行一个反向DNS查找客户端连接,并且,通过rabbmitmqctl和管理插件呈现信息。默认值为:false。
  • trace_vhost:通过跟踪器在内部使用,你不应该改变此配置。默认值为:[]
  • tcp_listen_options:默认的socket选项。你不需要改变此配置。默认值为:[{backlog,128},{nodelay,true},{linger,{true,0}},{exit_on_close,close}]
  • hipe_compile:设置为true,用HiPE(一个Erlang的即时编译器)预编译RabbitMQ的部分。这将在启动时间增加耗时,但增加了服务器的吞吐量。你可能会在启动时花费几分钟的延迟,而看到20%--50%的性能提升。HiPE支持,其可能不会被编译到你的Erlang的安装当中。如果它不是,启动此选项,将只会导致警告消息被显示出来,并且正常进行启动过程。举个例子:Debain/Ubuntu 用户将需要按照erlang-base-hipe包。HiPE并不适用于所有的平台,包括Windows。我们推荐使用最新版本的Erlang/OTP。默认值为:false。
  • cluster_partition_handling:如何控制网络分片。可选的模式如下:ignore,pause_minority,{pause_if_all_down,{nodes},ignore|autoneal}其中{nodes}代表节点名称的列表,autoheal。更多内容请在documentation on partitions文档中查看:http://www.rabbitmq.com/partitions.html#automatic-handling。默认值为:ignore。
  • cluster_keepalive_interval:节点向其他节点发送生存状态的消息的频率,单位:毫秒。注意:这个配置不同于net_ticktime,丢失生存状态的消息并不会导致节点下线。默认值为:10000.
  • queue_index_embed_msgs_below:具体内容建议阅读persister tuning文档:http://www.rabbitmq.com/persistence-conf.html。默认值为:4096.
  • msg_store_index_module:同上。默认值为:rabbitmq_msg_store_ets_index
  • backing_queue_module:队列内容的实现模块。你可能不需要改变此配置。默认值为:rabbit_varible_queue
  • msg_store_file_size_limit:缓冲区大小调解。绝大多数情况下,你不需要改变此配置。默认值为:16777216.
  • mnesia_table_loading_timeout:在集群中,等待数据库表连接的超时时间。默认值为:30000.
  • queue_index_max_journal_entries:缓冲区大小调解。绝大多数情况下,你不需要修改此配置。默认值为:65536
  • queue_master_locator:队列主存储位置策略。可选择的如下:<<"min-masters">>,<<client-local>>,<<"random">>。更多内容请查看documentation on queue master location 文档:http://www.rabbitmq.com/ha.html#queue-master-location。默认值为:<<"client-local">>

更多关于插件的配置,请参考官方文档,如下:

http://www.rabbitmq.com/management.html#configuration

--------------------------------------------------------------------------------------------------------------------------------------------------------

至此,系统拆分解耦利器之消息队列---RabbitMQ-Configuration 结束


特别备注:翻译不妥之处,还请积极留言。


参考资料:

官方文档:http://www.rabbitmq.com/configure.html


1
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:274727次
    • 积分:3751
    • 等级:
    • 排名:第8911名
    • 原创:117篇
    • 转载:7篇
    • 译文:6篇
    • 评论:33条
    联系方式
    文章分类
    最新评论