rabbitmq集群搭建以及万级并发下的性能调优
Posted TGITCIC
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了rabbitmq集群搭建以及万级并发下的性能调优相关的知识,希望对你有一定的参考价值。
一、 服务器列表
ROLE | OPERATING SYSTEM | NAME | SIZE | AVAILABILITY SET | PRIVATE IP ADDRESS | DATA DISKS | MOUNT POINT | Environment | version | Listen Port |
RabbitMQ01 | OpenLogic/CentOS/7.4 | aceta022vu11 | Standard_DS2_v2(2 vcpus, 7 GB memory) | ACETA022AS05 | 10.224.28.121 | 32GB | /data | sample | 3.7.17 | 5672,15672,25672 |
RabbitMQ02 | OpenLogic/CentOS/7.4 | aceta022vu12 | Standard_DS2_v2(2 vcpus, 7 GB memory) | ACETA022AS05 | 10.224.28.122 | 32GB | /data | sample | 3.7.17 | 5672,15672,25672 |
RabbitMQ03 | OpenLogic/CentOS/7.4 | aceta022vu13 | Standard_DS2_v2(2 vcpus, 7 GB memory) | ACETA022AS05 | 10.224.28.123 | 32GB | /data | sample | 3.7.17 | 5672,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,[]}]}]
七、 网页访问管理页面查看
八、 配置优化建议(每台保持同样的配置,配置完成后重启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 这个值直接影响到了另一个值即: | 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.absolute | abbitMQ存储数据分区的可用磁盘空间限制.当可用空间值低于阀值时,流程控制将被触发.此值可根据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的即时编译器. 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集群搭建以及万级并发下的性能调优的主要内容,如果未能解决你的问题,请参考以下文章
rabbitmq3.6.5镜像集群搭建以及haproxy负载均衡