Linux系统,RabbitMQ+HAProxy+KeepAlived集群搭建

📅 2026/8/2 19:10:16
Linux系统,RabbitMQ+HAProxy+KeepAlived集群搭建
Linux系统RabbitMQHAProxyKeepAlived主备服务搭建单主机的RabbitMQ 搭建由于我是把rmp包放到公司的源进行安装因此这里推荐参考大佬写的安装教程很详细https://blog.csdn.net/Milogenius/article/details/125224527开放端口下面很多地方都需要开放某些指定端口因此下面放了个开放端口的方法这里我们需要开放4个端口15672-查看管理平台436925672-加入集群需要开放,5672-Erlang服务的端口先启动防火墙systemctl start firewalld然后开放指定端口firewall-cmd --zonepublic --add-port15672/tcp --permanent命令含义–zone #作用域–add-port15672/tcp #添加端口格式为端口/通讯协议–permanent #永久生效没有此参数重启后失效最后必不可少的一步是重启防火墙firewall-cmd --reloadRabbitMQ集群搭建如下步骤主要是搭建主从的RabbitMQ集群修改主机映射在从节点上先安装单机RabbitMQ使用vi编辑/etc/hosts文件在最后加上每台主机的端口和主机名映射例如172.16.2.134 master-nodevi /etc/hosts注意这里需要集群中所有节点的端口和名称列表同时每台机器上的端口和主机名映射需要完全相同这里纠个错之前以为hosts文件需要完全相同实际上只需要这几个主机映射相等即可复制cookie文件需要将所有机器的.erlang.cookie文件与集群主节点进行同步同步前需要关闭所有机器的rabbitmq服务# 关闭rabbitmq服务 systemctl stop rabbitmq-server # 远程复制文件 scp -r /var/lib/rabbitmq/.erlang.cookie root172.16.2.211:/var/lib/rabbitmq/.erlang.cookie修改主机名这里的主机名代表的是在集群中这个节点名称它需要与上面设置的主机映射相对应例如172.16.2.134 maste-rnode就需要将172.16.2.134这个节点的主机名设置为master-node,对每台机器执行如下命令#每台机器都有不同的主机名 hostnamectl set-hostname master-node设置完主机名之后重启生效然后重启需要加入集群的节点的rabbitmq服务。#启动 systemctl start rabbitmq-server #关闭 rabbitmqctl stop_app加入集群先打开集群主节点的rabbitmq服务同时开放主节点4369端口和25672端口#启动服务器 systemctl start rabbitmq-server #打开这个节点 rabbitmqctl start_app先在从节点执行命令#关闭rabbitmq程序 rabbitmqctl stop_app # 加入集群参数为集群主节点的主机名称 rabbitmqctl join_cluster rabbitrmq-master-node如果出现卡死的情况有一种方法就是对非主机节点重启systemctl restart rabbitmq-server在rabbitmq的web管理平台可以看到集群中所有节点设置为镜像节点这一步是将队列进行镜像防止节点挂掉之后消息数据丢失在需要成为镜像节点的机器上执行命令rabbitmqctl start_app rabbitmqctl set_policy ha-all ^ {ha-mode:all,ha-sync-mode:automatic}高可用集群搭建前期准备开启ip转发功能#查看是否开启转发 cat /proc/sys/net/ipv4/ip_forward #返回1代表IP已开启0 未开启 #临时开启 echo 1 /proc/sys/net/ipv4/ip_forward #永久开启 vi /etc/sysctl.conf net.ipv4.ip_forward 1 #立即生效 sysctl -p /etc/sysctl.conf 关闭selinux#查看selinux状态 getenforce #永久关闭selinux vi /etc/selinux/config #将 SELINUXenforcing 改为 SELINUXdisabled #上一个命令需要重启生效因此需要提前执行以下命令临时关闭selinux setenforce 0安装HAProxy我们用haproxy做负载均衡在两台虚拟机上都安装。yum install -y haproxy配置HAProxyvi /etc/haproxy/haproxy.cfg文件内容如下这里需要两个节点都复制,同时里面的主机需要与我们的虚拟机一致同时按照配置文件需要开放端口91885567235672这个配置文件需要修改的只有主备服务器的ip地址#---------------------------------------------------- # Global settings #---------------------------------------------------- global log 127.0.0.1 local2 info #定义全局的syslog服务器。日志服务器需要开启UDP协议最多可以定义两个。基于syslog记录日志到指定设备级别有(err、warning、info、debug) chroot /var/lib/haproxy #锁定haproxy的运行目录把haproxy的进程禁锢在一个文件夹内 pidfile /var/run/haproxy.pid #指定haproxy的pid文件存放路径启动进程的用户必须有权限访问此文件。要和service指定的pid路径一样 maxconn 100000 #每个haproxy进程的最大并发连接数默认4000可以是100000还可以更大一百万 maxconnrate 4000 #每个进程每秒创建的最大连接数量控制瞬间并发 user haproxy #默认用户 group haproxy #默认组 daemon #以后台守护进程的方式运行 stats socket /var/lib/haproxy/stats #创建监控所用的套接字目录 #-------------------------------------------------- # defaults settings #-------------------------------------------------- defaults mode http #默认的模式mode { tcp|http|health }tcp是4层http是7层health只会返回OK。后面listen的优先级比默认高可以单独设置。 log global option dontlognull #启用该项日志中将不会记录空连接。所谓空连接就是在上游的负载均衡器 option http-server-close #每次请求完毕后主动关闭http通道 option http-keep-alive #开启与客户端的会话保持 option redispatch #serverId对应的服务器挂掉后强制定向到其他健康的服务器重新派发。 retries 3 #3次连接失败就认为服务不可用 timeout http-request 10s timeout queue 1m timeout connect 30s #客户端请求从haproxy到后端server最长连接等待时间(TCP连接之前)默认单位ms timeout client 2m #设置haproxy与客户端的最长非活动时间默认单位ms建议和timeout server相同 timeout server 2m #客户端请求从haproxy到后端服务端的请求处理超时时长(TCP连接之后)默认单位ms如果超时会出现502错误此值建议设置较大些访止502错误。 timeout http-keep-alive 30s #session会话保持超时时间此时间段内会转发到相同的后端服务器 timeout check 10s #对后端服务器的默认检测超时时间 maxconn 10000 #最大连接数 #-------------------------------------------------- # haproxy监控统计界面 settings #-------------------------------------------------- listen admin_stats stats enable #自动开启 bind 0.0.0.0:9188 #访问检测界面入口绑定的端口跟地址 mode http #http的七层模型 option httplog #采用http日志格式 log global maxconn 10 #默认最大连接数 stats refresh 30s #统计页面自动刷新时间 stats uri /admin_stats #统计页面url设置haproxy监控地址为http://localhost:9188/admin_stats stats auth admin:dhgate20221012 #设置监控页面的用户和密码认证admin:dhgate20221012可以设置多个用户名 stats hide-version #隐藏统计页面上HAProxy的版本信息 stats realm (Haproxy statistic platform) #统计页面密码框上提示文本 stats admin if TRUE #设置手工启动/禁用后端服务器(haproxy-1.4.9以后版本) #-------------------------------------------------- # 监听rabbimq_server settings #-------------------------------------------------- listen rabbitmq_server bind 0.0.0.0:55672 #指定HAProxy的监听地址可以是IPV4或IPV6可以同时监听多个IP或端口。MQ连接端口避免跟5672端口冲突将rabbitmq的5672端口映射为55672端口 mode tcp #指定负载协议类型 log global balance roundrobin #balance roundrobin 负载轮询balance source 保存session值支持static-rrleastconnfirsturi等参数。 server master 172.16.2.238:5672 maxconn 4000 weight 1 check inter 5s rise 2 fall 2 #需要修改为主节点ip地址 server backup1 172.16.2.223:5672 maxconn 4000 weight 1 check inter 5s rise 2 fall 2 #需要修改为从节点ip地址 #rise 2是2次正确认为服务器可用 #fall 2是2次失败认为服务器不可用 #check inter 5s 表示检查心跳频率 #weight代表权重 #maxconn 4000 当前服务器支持的最大并发连接数超出此值的连接将被放置于请求队列中 #-------------------------------------------------- # 监听rabbitmq_web settings #-------------------------------------------------- listen rabbitmq_web bind 0.0.0.0:35672 #将rabbitmq的15672端口映射为35672端口 mode http log global option httplog option httpclose balance roundrobin server master 172.16.2.238:15672 maxconn 2000 weight 1 check inter 5s rise 2 fall 2 server backup1 172.16.2.223:15672 maxconn 2000 weight 1 check inter 5s rise 2 fall 2 #--------------------------------------------------haproxy rsyslog日志配置vi /etc/rsyslog.conf在最后一行加上local2.* /var/log/haproxy/rabbitmq.log启动haproxy服务#重启日志服务 mkdir -p /var/log/haproxy systemctl restart rsyslog.service #启动haproxy。其中 -f 代表指定配置文件的路径。 haproxy -f /etc/haproxy/haproxy.cfg #重新启动haproxy haproxy -f /etc/haproxy/haproxy.cfg -st cat /var/run/haproxy.pid #停止haproxy kill -9 cat /var/run/haproxy.pid #查看haproxy启动的端口 ss -nplt | grep haproxy通过命令 ss-ntlp | grep haprox 能看到haproxy即为启动成功访问HAProxy监控统计界面我这里是172.16.2.238:9188/admin_stats用配置文件中设置的admin/dhgate20221012登录。如果进不去说明9188端口没有开放按照上文方法开放即可安装Keepalived用keepalived做主备避免单点问题、实现高可用。主要是实现VIP虚拟IP的漂移#安装 yum install -y keepalived #备份原有配置 cp /etc/keepalived/keepalived.conf{,.bak} #配置Keepalived vi /etc/keepalived/keepalived.confmaster节点的配置如下! Configuration File for keepalived #keepalived全局配置 global_defs { #每个keepalived节点的唯一标识不能与备机相同。 router_id keepalived_master_172-22-40-104 } #检测HAProxy脚本 vrrp_script check_haproxy { script /etc/keepalived/haproxy_check.sh #脚本所在的目录 interval 10 #检测 haproxy 心跳频率每隔10秒检测一次 weight 2 #权重 } #虚拟路由器配置 vrrp_instance haproxy { state MASTER #设置虚拟路由器状态为MASTER表示为主。 interface enp0s3 #绑定当前虚拟路由器所使用的物理网卡如eth0、bond0等可通过ifconfig获得。 virtual_router_id 51 #每个虚拟路由器的唯一标识。同属一个虚拟路由器的多个keepalived节点必须相同务必要确保在同一网络中此值唯一。 priority 100 #当前物理节点在此虚拟路由器中的优先级值越大优先级越高。注意主机的优先权要比备机高。 advert_int 1 #心跳检查频率单位秒。 #认证机制 authentication { auth_type PASS #认证类型 auth_pass 1111 #秘钥同一虚拟路由器的多个keepalived节点auth_pass值必须保持一致 } #虚拟路由器的VIP不指定网卡时默认添加在eth0上。在添加VIP地址时需确保将要使用的VIP不存在避免冲突。 virtual_ipaddress { 172.16.2.250 #对外开放的虚拟ip,这个IP前两位需要和虚拟机的ip相同保证在同一网段 } #调用检测HAProxy的脚本 track_script { check_haproxy } }backup节点的配置如下! Configuration File for keepalived #keepalived全局配置 global_defs { #每个keepalived节点的唯一标识不能与备机相同。 router_id keepalived_backup_172-22-40-105 } #检测HAProxy脚本 vrrp_script check_haproxy { script /etc/keepalived/haproxy_check.sh #脚本所在的目录 interval 10 #检测 haproxy 心跳频率每隔10秒检测一次 weight 2 #权重 } #虚拟路由器配置 vrrp_instance haproxy { state BACKUP #设置虚拟路由器状态为BACKUP表示为备。 interface enp0s3 #绑定当前虚拟路由器所使用的物理网卡如eth0、bond0等可通过ifconfig获得。 virtual_router_id 51 #每个虚拟路由器的唯一标识。同属一个虚拟路由器的多个keepalived节点必须相同务必要确保在同一网络中此值唯一。 priority 80 #当前物理节点在此虚拟路由器中的优先级值越大优先级越高。注意主机的优先权要比备机高。 advert_int 1 #心跳检查频率单位秒。 #认证机制 authentication { auth_type PASS #认证类型 auth_pass 1111 #秘钥同一虚拟路由器的多个keepalived节点auth_pass值必须保持一致 } #虚拟路由器的VIP不指定网卡时默认添加在eth0上。在添加VIP地址时需确保将要使用的VIP不存在避免冲突。 virtual_ipaddress { 172.16.2.250 #对外开放的虚拟ip } #调用检测HAProxy的脚本 track_script { check_haproxy } }编写HAProxy检测脚本会在ha挂掉之后会在日志中写入信息并尝试重启ha,重启失败关闭Keepalived并进行vip漂移vi /etc/keepalived/haproxy_check.sh脚本内容如下#!/bin/bash #haproxy存活检测脚本 #当发现haproxy服务挂掉时先自动重启HAProxy的服务如果启动不成功则关闭当前节点的Keepalived服务并将虚拟vip飘到备用节点上。 #-----------全局变量------------start #本机ip localIPip a|grep inet|grep global|grep brd|head -n 1|awk {printf $2}|cut -d / -f1 #backup节点ip backupIP172.16.2.223 #-----------全局变量------------end #haproxy服务存活检测 if [ $(ps -C haproxy --no-header | wc -l) -eq 0 ];then #记录日志 echo -n date %m-%d %H:%M:%S /etc/keepalived/keepalived_master2backup.log echo 检测到节点${localIP}的HAProxy服务挂掉正在尝试重启中... /etc/keepalived/keepalived_master2backup.log #重启haproxy服务 haproxy -f /etc/haproxy/haproxy.cfg sleep 2s if [ $(ps -C haproxy --no-header | wc -l) -eq 1 ];then #写日志 echo -n date %m-%d %H:%M:%S /etc/keepalived/keepalived_master2backup.log echo 检测到节点${localIP}的HAProxy服务挂掉正在尝试重启中...重启成功 /etc/keepalived/keepalived_master2backup.log fi fi #这里最好休眠2s等待haproxy启动成功不然下面的判断有可能还会出现找不到haproxy服务进程的情况 #注意这个sleep时间一定要比keepalived.conf配置里检测 haproxy 心跳频率interval 10设置的时间要短否则将卡在sleep这 sleep 2s if [ $(ps -C haproxy --no-header | wc -l) -eq 0 ];then echo 检测到节点${localIP}的HAProxy服务挂掉尝试重启失败停掉此节点上的keepalived服务虚拟vip将飘到backup节点${backupIP} /etc/keepalived/keepalived_master2backup.log service keepalived stop fi这个脚本需要在两个节点都复制然后启动keepalived服务需要先启动主节点再启动从节点#启动keepalived服务 service keepalived start #查看keepalived状态 service keepalived status #查看keepalived启动日志 journalctl -xe #查看keepalived日志 tail -f /var/log/messages #停掉keepalived服务 service keepalived stop成功启动之后状态如下在主节点查看ip信息ip addr在从节点查看ip信息可以看到主节点上已经多了个虚拟ip地址而从节点上没有,如果两个节点都有这个VIP执行以下命令firewall-cmd --add-rich-rulerule protocol valuevrrp accept --permanent firewall-cmd --reload再来查看一下VIP是否有效这里需要打开两个节点在配置文件中配置的端口35672和55672,然后进入页面VIP:35672比如我这里就是172.16.2.250:35672通过VIP访问HA监控平台虚拟IP:9188