一、集群架构
说明:对于消息的生产和消费者可以通过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
如下图所示,则表示进程数和文件描述符数设置成功!
四、集群部署
4.1、下载安装软件包
说明:以下操作需分别在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
4.2、新增变量文件
说明:以下操作需分别在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工具中内置的默认值的环境变量。
4.3、修改配置文件
说明:以下操作需分别在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},
4.4、同步cookie文件
说明:将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
4.4、将节点加入集群中
说明:分别在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
如下图所示:
4.4、配置镜像队列
说明:以下操作只需在其中一个节点上操作即可,这里默认操作在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 "/" ...
4.5、添加用户授权
说明:以下操作只需在其中一个节点上操作即可,这里默认操作在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 '.*' '.*' '.*'
4.5、开启管理插件
说明:以下操作需分别在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
global
log 192.168.1.194 local2 info
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 5000
user haproxy
group haproxy
daemon
stats socket /var/lib/haproxy/stats
defaults
mode tcp
log global
option tcplog
option 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_cluster
mode tcp
bind 0.0.0.0:5672
balance roundrobin
timeout server 168h
server 192.168.1.192 192.168.1.192:5672 check inter 1000 fall 3 rise 3
server 192.168.1.193 192.168.1.193:5672 check inter 1000 fall 3 rise 3
#监听RabbitMQ管理页面
listen rabbitmq_admin
mode http
bind 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 2
server 192.168.1.192 192.168.1.192:15672 check inter 1000 rise 2 fall 2
server 192.168.1.193 192.168.1.193:15672 check inter 1000 rise 2 fall 2
#监听HAProxy的管理页面
listen stats
mode tcp
bind 0.0.0.0:15000 #监听端口
stats enable
stats realm Haproxy Manager #统计页面密码框上提示文本
stats hide-version #隐藏统计页面上HAProxy的版本信息
stats uri /rabbitmq-stats #统计页面url
stats 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系统运维指南》