说明:对于消息的生产和消费者可以通过HAProxy的软负载将请求分发至RabbitMQ集群中的Node1~Node7节点,其中Node8~Node10的三个节点作为磁盘节点保存集群元数据和配置信息。

环境信息如下:
| 主机IP | 操作系统 | 软件版本 | CPU架构 | 主机名 | 说明 |
|---|---|---|---|---|---|
| 192.168.1.191 | Centos7.6 | 服务名称 | 3.9.16 | x86_64 | rabbit01 |
| 192.168.1.192 | Centos7.6 | rabbitmq | 3.9.16 | x86_64 | rabbit02 |
| 192.168.1.193 | Centos7.6 | rabbitmq | 3.9.16 | x86_64 | rabbit03 |
| 192.168.1.194 | Centos7.6 | haproxy | 1.5.18 | x86_64 | haproxy |
说明:以下操作需分别在Rabbitmq所有节点服务器上操作。
1、修改主机名和/etc/hosts文件
#1、设置主机名(主机192.168.1.191上执行)
[root@localhost ~]# hostnamectl set-hostname rabbit01#2、设置主机名(主机192.168.1.192上执行)
[root@localhost ~]# hostnamectl set-hostname rabbit02#3、设置主机名(主机192.168.1.193上执行)
[root@localhost ~]# hostnamectl set-hostname rabbit03#3、设置主机名(主机192.168.1.194上执行)
[root@localhost ~]# hostnamectl set-hostname haproxy#4、修改hosts文件(主机192.168.1.191、192.168.1.192、192.168.1.193上执行)
[root@localhost ~]# vim /etc/hosts
192.168.1.191 rabbit01
192.168.1.192 rabbit02
192.168.1.193 rabbit03
192.168.1.194 haproxy
2、关闭防护墙和selinux
#主机192.168.1.191、192.168.1.192、192.168.1.193、192.168.1.194上执行,需重启服务器
[root@localhost ~]# systemctl stop firewalld && systemctl disable firewalld
[root@localhost ~]# sed -i 's#enforcing#SELINUX=disabled#g' /etc/selinux/config
[root@localhost ~]# sed -i 's#enforcing#SELINUX=disabled#g' /etc/sysconfig/selinux
3、设置进程数
说明:root账号下ulimit -u出现的max user processes的值默认是/proc/sys/kernel/threads-max的值/2,即系统线程数的一半。普通账号下ulimit -u出现的max user processes的值默认是/etc/security/limits.d/20-nproc.conf文件中定义的大小。
#主机192.168.1.191、192.168.1.192、192.168.1.193上执行
#1.在/etc/security/limits.conf文件里添加如下内容
* soft nproc 65535
* hard nproc 65535
#注意:修改这里,普通用户max user process值是不生效的,需要修改/etc/security/limits.d/20-nproc.conf文件中的值。
4、设置文件描述符数
#主机192.168.1.191、192.168.1.192、192.168.1.193上执行
#1.在/etc/security/limits.conf文件里添加如下内容
* soft nofile 65535
* hard nofile 65535
如下图所示,则表示进程数和文件描述符数设置成功!

说明:以下操作需分别在Rabbitmq所有节点服务器上操作。
[root@rabbit01~]# curl -s https://packagecloud.io/install/repositories/rabbitmq/erlang/script.rpm.sh | sudo bash
[root@rabbit01~]# yum install erlang-23.3.4.11-1.el7.x86_64 -y
[root@rabbit01~]# yum install socat logrotate -y
[root@rabbit01~]# wget https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.9.16/rabbitmq-server-3.9.16-1.el7.noarch.rpm
[root@rabbit01~]# yum install rabbitmq-server-3.9.16-1.el7.noarch.rpm -y
说明:以下操作需分别在Rabbitmq所有节点服务器上操作。
#1、创建数据及日志目录
[root@rabbit01~]# mkdir /data/basic-data/rabbitmq-server/{data,logs} -pv#2、修改rabbitmq-env.con文件
[root@rabbit01~]# vim /etc/rabbitmq/rabbitmq-env.conf
RABBITMQ_MNESIA_BASE=/data/basic-data/rabbitmq-server/data
RABBITMQ_LOG_BASE=/data/basic-data/rabbitmq-server/logs#3、目录授权
[root@rabbit01~]# chown -R rabbitmq:rabbitmq /data/basic-data/rabbitmq-server -R
注明:默认配置在/etc/rabbitmq目录下,如果不存在直接创建就可以,RabbitMQ应用会自动加载;rabbitmq-env.conf包含重写RabbitMQ脚本和CLI工具中内置的默认值的环境变量。
说明:以下操作需分别在Rabbitmq所有节点服务器上操作。
[root@rabbit01 ~]# vim /usr/lib/rabbitmq/lib/rabbitmq_server-3.9.16/plugins/rabbit-3.9.16/ebin/rabbit.app
{vm_memory_high_watermark, 0.7},
说明:将rabbit01机器的.erlang.cookie文件复制到rabbit02和rabbit03机器(此文件在rabbitmq服务启动时自动生成),因为节点之间需要通过此文件来判断是否允许交流(判断是否属于集群内部节点),如果三台机器的此文件内容不一致则集群无法启动成功。此文件内容一般是由不超过255个数字或字母组成的字符串构成。
#1、启动rabbit01(192.168.1.191)节点的rabbitmq-server服务
[root@rabbit01 ~]# systemctl start rabbitmq-server#2、将rabbit01机器的.erlang.cookie文件复制到rabbit02和rabbit03机器上
[root@rabbit01 ~]# scp /var/lib/rabbitmq/.erlang.cookie root@rabbit02:/var/lib/rabbitmq/
[root@rabbit01 ~]# scp /var/lib/rabbitmq/.erlang.cookie root@rabbit03:/var/lib/rabbitmq/#3、目录授权
[root@rabbit02 ~]# chown rabbitmq:rabbitmq /var/lib/rabbitmq/.erlang.cookie
[root@rabbit03 ~]# chown rabbitmq:rabbitmq /var/lib/rabbitmq/.erlang.cookie#4、分别启动rabbit02节点(192.168.1.192)和rabbit03(192.168.1.193)节点的rabbitm-server服务
[root@rabbit02 ~]# systemctl start rabbitmq-server
[root@rabbit03 ~]# systemctl start rabbitmq-server
说明:分别在rabbit02节点和rabbit03节点上执行。
#1、停止服务
#注:这里的参数stop_app和stop是不一样的,stop是停掉服务,stop_app是停掉这个节点,但是并没有停止rabbitmq依赖的erlang进程
[root@rabbit02 ~]# rabbitmqctl stop_app#2、加入集群,--ram是以内存方式加入
[root@rabbit02 ~]# rabbitmqctl join_cluster --ram rabbit@rabbit01#3、启动服务
[root@rabbit02 ~]# rabbitmqctl start_app
如下图所示:

说明:以下操作只需在其中一个节点上操作即可,这里默认操作在rabbit01节点。
# 所有队列exchangess 或者 queue都为镜像模式
# ^'表示所有匹配所有队列名称
[root@rabbit01 ~]# rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'
Setting policy "ha-all" for pattern "^" to "{"ha-mode":"all"}" with priority "0" for vhost "/" ...
说明:以下操作只需在其中一个节点上操作即可,这里默认操作在rabbit01节点。
# 1、创建用户并设置密码
[root@rabbit01 ~]# rabbitmqctl add_user admin admin123#2、赋予其administrator角色
[root@rabbit01 ~]# rabbitmqctl set_user_tags admin administrator#3、设置权限
[root@rabbit01 ~]# rabbitmqctl set_permissions -p "/" admin '.*' '.*' '.*'
说明:以下操作需分别在Rabbitmq所有节点服务器上操作。
[root@rabbit01 ~]# rabbitmq-plugins enable rabbitmq_management
说明:以下操作只需要在haproxy节点操作即可。
1、安装haproxy
说明:HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。根据官方数据,其最高极限支持10G的并发。HAProxy支持从4层至7层的网络交换,即覆盖所有的TCP协议。就是说,Haproxy 甚至还支持 Mysql 的均衡负载。为了实现RabbitMQ集群的软负载均衡,这里可以选择HAProxy。
[root@haproxy ~]# yum install haproxy -y
2、配置haproxy
说明:在当前rabbitmq镜像集群汇总,rabbit01节点为磁盘节点,rabbit02和rabbit03节点为内存节点,为了更好的提高性能,对于消息的生产和消费者可以通过HAProxy的软负载将请求分发至RabbitMQ集群中的rabbit02和rabbit03节点,其中rabbit01节点作为磁盘节点保存集群元数据和配置信息。
[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
globallog 192.168.1.194 local2 infochroot /var/lib/haproxypidfile /var/run/haproxy.pidmaxconn 5000user haproxygroup haproxydaemonstats socket /var/lib/haproxy/statsdefaultsmode tcplog globaloption tcplogoption dontlognull#打开http协议中服务器端关闭功能,使得支持长连接,使得会话可以被重用,使得每一个日志记录都会被记录option http-server-close# option forwardfor except 127.0.0.0/8#当与上游服务器的会话失败(服务器故障或其他原因)时,把会话重新分发到其他健康的服务器上,当原来故障的服务器恢复时,会话又被定向到已恢复的服务器上。option redispatch#向上游服务器尝试连接的最大次数,超过此值就认为后端服务器不可用retries 3#客户端发送http请求的超时时间timeout http-request 10s#当上游服务器在高负载响应haproxy时,会把haproxy发送来的请求放进一个队列中,timeout queue定义放入这个队列的超时时间timeout queue 1m#haproxy与后端服务器连接超时时间,如果在同一个局域网可设置较小的时间。timeout connect 10s#定义客户端与haproxy连接后,数据传输完毕,不再有数据传输,即非活动连接的超时时间timeout client 1m#定义haproxy与上游服务器非活动连接的超时时间timeout server 1m#设置新的http请求连接建立的最大超时时间,时间较短时可以尽快释放出资源,节约资源timeout http-keep-alive 10s#健康检测的时间的最大超时时间timeout check 10s#最大并发连接数maxconn 3000#监听Rabbitmq业务
listen rabbitmq_clustermode tcpbind 0.0.0.0:5672balance roundrobintimeout server 168hserver 192.168.1.192 192.168.1.192:5672 check inter 1000 fall 3 rise 3server 192.168.1.193 192.168.1.193:5672 check inter 1000 fall 3 rise 3#监听RabbitMQ管理页面
listen rabbitmq_adminmode httpbind 0.0.0.0:15672 #监听端口#check inter 1000 是检测心跳的频率,rise 2 是2次正确认为服务器可用,fall 3 是3次失败认为服务器不可用server 192.168.1.191 192.168.1.191:15672 check inter 1000 rise 2 fall 2server 192.168.1.192 192.168.1.192:15672 check inter 1000 rise 2 fall 2server 192.168.1.193 192.168.1.193:15672 check inter 1000 rise 2 fall 2 #监听HAProxy的管理页面
listen statsmode tcpbind 0.0.0.0:15000 #监听端口stats enable stats realm Haproxy Manager #统计页面密码框上提示文本stats hide-version #隐藏统计页面上HAProxy的版本信息stats uri /rabbitmq-stats #统计页面urlstats refresh 30s #统计页面自动刷新时间stats auth admin:admin@2022 #统计页面用户名和密码设置mode http #配置TCP模式option httplog
3、启动haproxy
[root@haproxy ~]# haproxy -f /etc/haproxy/haproxy.cfg
4、访问haproxy
说明:访问如下地址可以对rabbitmq节点进行监控:http://192.168.1.194:15000/rabbitmq-stats,如下图所示:

总结:客户端连接用192.168.1.194:5672去连接,查看rabbitmq的管理后台192.168.1.194:15672,192.168.1.194:15000/rabbitmq-stats查看haproxy的状态
更多详细内容请参考:《Linux运维篇:Linux系统运维指南》