rabbitmq集群搭建以及万级并发下的性能调优

Posted TGITCIC

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了rabbitmq集群搭建以及万级并发下的性能调优相关的知识,希望对你有一定的参考价值。

一、 服务器列表

ROLEOPERATING SYSTEMNAMESIZEAVAILABILITY SETPRIVATE IP ADDRESSDATA DISKSMOUNT  POINTEnvironment versionListen Port
RabbitMQ01OpenLogic/CentOS/7.4aceta022vu11Standard_DS2_v2(2 vcpus, 7 GB memory)ACETA022AS0510.224.28.12132GB/datasample3.7.175672,15672,25672
RabbitMQ02OpenLogic/CentOS/7.4aceta022vu12Standard_DS2_v2(2 vcpus, 7 GB memory)ACETA022AS0510.224.28.12232GB/datasample3.7.175672,15672,25672
RabbitMQ03OpenLogic/CentOS/7.4aceta022vu13Standard_DS2_v2(2 vcpus, 7 GB memory)ACETA022AS0510.224.28.12332GB/datasample3.7.175672,15672,25672

二、 环境配置

配置三台rabbitmq的hosts:

sudo vim /etc/hosts

10.224.28.121   aceta022vu11
10.224.28.122   aceta022vu12
10.224.28.123   aceta022vu13

配置Erlang yum repository

sudo vim /etc/yum.repos.d/rabbitmq-erlang.repo

[rabbitmq-erlang]
name=rabbitmq-erlang
baseurl=https://dl.bintray.com/rabbitmq-erlang/rpm/erlang/21/el/7
gpgcheck=1
gpgkey=https://dl.bintray.com/rabbitmq/Keys/rabbitmq-release-signing-key.asc
repo_gpgcheck=0
enabled=1

安装erlang依赖

sudo yum install -y erlang

三、RabbitMQ安装

以下操作在10.224.28.121上执行:

官网下载地址:https://www.rabbitmq.com/install-generic-unix.html

wget https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.7.17/rabbitmq-server-generic-unix-3.7.17.tar.xz

解压到/data目录下

// 把/data目录owner更改为appadmin
sudo chown appadmin:appadmin -R /data
 
tar xvf rabbitmq-server-generic-unix-3.7.17.tar.xz -C /data

添加环境变量(这个步骤三台主机都需要)

sudo vim /etc/profile

export RABBITMQ_HOME=/data/rabbitmq_server-3.7.17
export PATH=$RABBITMQ_HOME/sbin:$PATH

注:执行 source /etc/profile 使变量生效

 

启用Rabbitmq插件

rabbitmq-plugins enable rabbitmq_management
rabbitmq-plugins enable rabbitmq_tracing

拷贝rabbitmq-server到另两台主机

scp -r /data/rabbitmq_server-3.7.17/ appadmin@10.224.28.122:/data
scp -r /data/rabbitmq_server-3.7.17/ appadmin@10.224.28.123:/data

拷贝.erlang.cookie到另两台主机:

.erlang.cookie 文件位置位于$home/.erlang.cookie,必须保证集群内所有的cookie文件是一致的,然后在启动服务。

scp $HOME/.erlang.cookie appadmin@10.224.28.122:$HOME/.erlang.cookie
 
scp $HOME/.erlang.cookie appadmin@10.224.28.123:$HOME/.erlang.cookie

四、 启动Rabbitmq服务,并配置权限

使用-detached参数运行各节点

rabbitmq-server -detached

添加admin用户,并授权

# 添加用户并设置密码:
rabbitmqctl add_user admin admin
 
# 添加权限(使admin用户对虚拟机"/" 具有所有权限)
rabbitmqctl set_permissions -p "/" admin ".*" ".*" ".*"
 
# 修改用户角色(加入administrator用户组)
rabbitmqctl set_user_tags admin administrator

五、 组建集群

rabbitmq-server启动时,会一起启动节点和应用,它预先设置RabbitMQ应用为standalone模式。要将一个节点加入到现有的集群中,你需要停止这个应用,并将节点设置为原始状态。如果使用./rabbitmqctl stop,应用和节点都将被关闭。所以使用rabbitmqctl stop_app仅仅关闭应用。

将aceta022vu12、aceta022vu13与aceta022vu11组成集群

# 在aceta022vu12、aceta022vu13分别执行:

rabbitmqctl stop_app
rabbitmqctl join_cluster rabbit@aceta022vu11
rabbitmqctl start_app

则此时 aceta022vu12与 aceta022vu13也会自动建立连接,集群配置完毕

PS:如果要使用内存节点,则可以使用aceta022vu12# rabbitmqctl join_cluster --ram rabbit@aceta022vu11加入集群,集群配置好后,可以在 RabbitMQ 任意节点上执行 rabbitmqctl cluster_status 来查看是否集群配置成功。

六、 集群状态查看

可以任意节点上执行:

rabbitmqctl cluster_status

[appadmin@aceta022vu11 ~]$ rabbitmqctl cluster_status
Cluster status of node rabbit@aceta022vu11 ...
[{nodes,[{disc,[rabbit@aceta022vu11]}]},
 {running_nodes,[rabbit@aceta022vu11]},
 {cluster_name,<<"rabbit@aceta022vu11">>},
 {partitions,[]},
 {alarms,[{rabbit@aceta022vu11,[]}]}]
[appadmin@aceta022vu11 ~]$  rabbitmqctl cluster_status
Cluster status of node rabbit@aceta022vu11 ...
[{nodes,[{disc,[rabbit@aceta022vu11,rabbit@aceta022vu12,
                rabbit@aceta022vu13]}]},
 {running_nodes,[rabbit@aceta022vu13,rabbit@aceta022vu12,rabbit@aceta022vu11]},
 {cluster_name,<<"rabbit@aceta022vu11">>},
 {partitions,[]},
 {alarms,[{rabbit@aceta022vu13,[]},
          {rabbit@aceta022vu12,[]},
          {rabbit@aceta022vu11,[]}]}]

七、 网页访问管理页面查看

http://10.224.28.121:15672/#/

八、 配置优化建议(每台保持同样的配置,配置完成后重启RabbitMQ,如启动失败则用前台方式启动查看输出日志)

1. linux操作系统参数优化(视服务器实际情况参数优化),配置文件:/etc/sysctl.conf

fs.file-max = 6553560
net.core.somaxconn = 65534
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_keepalive_time = 30
net.ipv4.tcp_keepalive_probes = 3
net.ipv4.tcp_keepalive_intvl = 15

2. RabbitMQ配置优化,新增文件rabbitmq.conf,文件存放目录:/data/rabbitmq_server-3.7.17/etc/rabbitmq/,注意修改日志目录:log.dir,主要修改接受TCP连接的Erlang进程数、握手超时、最大内存使用、磁盘空间大小、数据存放目录、设置每个连接允许的最大通道数、心跳超时、日志文件大小等等。放上官方最全配置:https://github.com/rabbitmq/rabbitmq-server/blob/v3.7.x/docs/rabbitmq.conf.example

listeners.tcp.default = 5672
num_acceptors.tcp = 20
handshake_timeout = 10000
vm_memory_high_watermark.relative = 0.4
vm_memory_calculation_strategy = rss
vm_memory_high_watermark_paging_ratio = 0.5
disk_free_limit.absolute = 10GB
frame_max = 131072
initial_frame_max = 4096
channel_max = 2047
heartbeat = 60
default_vhost = /
log.dir = /data/rabbitmq_server-3.7.17/logs
log.file = rabbit.log
log.file.level = info
log.file.rotation.size = 52428800
log.file.rotation.count = 10
hipe_compile=true

RabbitMQ 环境配置文件,文件名:rabbitmq-env.conf,文件存放目录:/data/rabbitmq_server-3.7.17/etc/rabbitmq/  注意参数:LOG_BASE,还有 MNESIA_BASE(此目录是Rabbit数据库目录,必须保证有足够的空间)

3. 配置修改完成后,重启每个节点,登录控制台查看配置是否生效,如下图:

参数

请不要看上面安装文档中的参数,那些只是“普通通用安装”,真正的调优是以此篇中的参数为准,以下标红部分为特别重要,特别需要仔细。

listeners.tcp.default

用于监听 AMQP连接的端口列表(无SSL). 可以包含整数 (即"监听所有接口")或者元组如 {"127.0.0.1", 5672} 用于监听一个或多个接口.

Default: [5672]

5672
num_acceptors.tcp

接受TCP侦听器连接的Erlang进程数。

Default: 10

这个值直接影响到了另一个值即:connection_max,这个值是在客户端设的,公式如下:最大连接数=connection_max +num_acceptors -1

20
handshake_timeout

AMQP 0-8/0-9/0-9-1 handshake (在 socket连接和SSL 握手之后)的最大时间, 毫秒为单位.

Default: 10000,这边10秒是足够了,不能再长了,再长这个不是网络了,是电话拨号网。

10000
vm_memory_high_watermark.relative

流程控制触发的内存阀值,这个值必须设,设置法则如下:

<=16gb内存的机器,设成04即MQ最多会使用到16gb*0.4=6.4GB时,阻塞所有的请求

>=32gb内存的机器,设成0.6

0.4/0.6
vm_memory_high_watermark_paging_ratio

高水位限制的分数,当达到阀值时,队列中消息消息会转移到磁盘上以释放内存。

设置机制同vm_memory_high_watermark,只不过它的阀值从0.5起板~0.6.

0.5~0.6
disk_free_limit.absoluteabbitMQ存储数据分区的可用磁盘空间限制.当可用空间值低于阀值时,流程控制将被触发.此值可根据RAM的总大小来相对设置 (如.{mem_relative, 1.0}).此值也可以设为整数(单位为bytes)或者使用数字单位(如."50MB").默认情况下.因此,很多外面都设1GB,这个显然是不够的,因为经如果当RABBITMQ的消息dump可用磁盘还剩1GB时,此时留给你的处理时间已经很短了,一般至少设成10GB。10GB
frame_max与客户端协商的允许最大frame大小. 设置为0表示无限制,但在某些QPid客户端会引发bug. 设置较大的值可以提高吞吐量;设置一个较小的值可能会提高延迟.咬合客户端的值
initial_frame_max咬合客户端的值咬合客户端的值
channel_max

与客户端协商的允许最大chanel大小. 设置为0表示无限制.该数值越大,则broker使用的内存就越高.

Default: 0

咬合客户端的值
heartbeat

表示心跳延迟(单位为秒) ,服务器将在connection.tune frame中发送.如果设置为 0, 心跳将被禁用. 客户端可以不用遵循服务器的建议, 查看 AMQP reference 来了解详情. 禁用心跳可以在有大量连接的场景中提高性能,但可能会造成关闭了非活动连接的网络设备上的连接落下.

Default: 60 (3.5.5之前的版本是580)

60
default_vhost

当RabbitMQ从头开始创建数据库时创建的虚拟主机. amq.rabbitmq.log交换器会存在于这个虚拟主机中.

Default: <<"/">>

/
hipe_compile

将此选项设置为true,将会使用HiPE预编译部分RabbitMQ,Erlang的即时编译器.
这可以增加服务器吞吐量,但会增加服务器的启动时间.
你可以看到花费几分钟延迟启动的成本,就可以带来20-50% 更好性能.这些数字与高度依赖于工作负载和硬件.

HiPE 支持可能没有编译进你的Erlang安装中.如果没有的话,启用这个选项,并启动RabbitMQ时,会看到警告消息. 例如, Debian / Ubuntu 用户需要安装erlang-base-hipe 包.

HiPE并非在所有平台上都可用,尤其是Windows.

在 Erlang/OTP 17.5版本之前,HiPE有明显的问题 . 对于HiPE,使用最新的OTP版本是高度推荐的.

Default: false

true

样例-rabbitmq.conf

listeners.tcp.default = 5672
 
num_acceptors.tcp = 20
 
handshake_timeout = 10000
 
vm_memory_high_watermark.relative = 0.4
# vm_memory_high_watermark.absolute = 6GB
 
 
vm_memory_calculation_strategy = rss
 
vm_memory_high_watermark_paging_ratio = 0.5
 
disk_free_limit.absolute = 10GB
 
 
frame_max = 131072
 
initial_frame_max = 4096
 
channel_max = 2047
 
heartbeat = 60
 
default_vhost = /
 
hipe_compile = true

 

以上是关于rabbitmq集群搭建以及万级并发下的性能调优的主要内容,如果未能解决你的问题,请参考以下文章

用 LVS 搭建一个负载均衡集群(转)

IM即时通讯开发千万级并发长连接网关技术

zookeeper集群应对万级并发的调优

rabbitmq3.6.5镜像集群搭建以及haproxy负载均衡

家乐福618保卫战二-零售O2O场景中的万级并发交易情况下的极限性能调优

RabbitMQ——RabbitMQ集群原理