当前位置: 首页 > news >正文

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

Linux系统,RabbitMQ+HAProxy+KeepAlived主备服务搭建

单主机的RabbitMQ 搭建

由于我是把rmp包放到公司的源进行安装,因此这里推荐参考大佬写的安装教程,很详细https://blog.csdn.net/Milogenius/article/details/125224527

开放端口

下面很多地方都需要开放某些指定端口,因此下面放了个开放端口的方法

这里我们需要开放4个端口:15672-查看管理平台,4369,25672-加入集群需要开放,5672-Erlang服务的端口

先启动防火墙

systemctl start firewalld

然后开放指定端口

firewall-cmd --zone=public --add-port=15672/tcp --permanent

命令含义:
–zone #作用域
–add-port=15672/tcp #添加端口,格式为:端口/通讯协议
–permanent #永久生效,没有此参数重启后失效
最后必不可少的一步是重启防火墙

firewall-cmd --reload

RabbitMQ集群搭建

如下步骤主要是搭建主从的RabbitMQ集群

修改主机映射

在从节点上先安装单机RabbitMQ
使用vi编辑/etc/hosts文件,在最后加上每台主机的端口和主机名映射例如172.16.2.134 master-node

vi /etc/hosts

注意这里需要集群中所有节点的端口和名称列表,同时每台机器上的端口和主机名映射需要完全相同(这里纠个错,之前以为hosts文件需要完全相同,实际上只需要这几个主机映射相等即可)

复制cookie文件

需要将所有机器的.erlang.cookie文件与集群主节点进行同步,同步前需要关闭所有机器的rabbitmq服务

# 关闭rabbitmq服务 systemctl stop rabbitmq-server # 远程复制文件 scp -r /var/lib/rabbitmq/.erlang.cookie root@172.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 rabbit@rmq-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 #将 SELINUX=enforcing 改为 SELINUX=disabled #上一个命令需要重启生效,因此需要提前执行以下命令,临时关闭selinux setenforce 0

安装HAProxy

我们用haproxy做负载均衡,在两台虚拟机上都安装。

yum install -y haproxy

配置HAProxy

vi /etc/haproxy/haproxy.cfg

文件内容如下,这里需要两个节点都复制,同时里面的主机需要与我们的虚拟机一致,同时按照配置文件需要开放端口9188,55672,35672,这个配置文件需要修改的只有主备服务器的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-rr,leastconn,first,uri等参数。 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.conf

master节点的配置如下:

! 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 localIP=`ip a|grep inet|grep global|grep brd|head -n 1|awk '{printf $2}'|cut -d "/" -f1` #backup节点ip backupIP="172.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-rule='rule protocol value="vrrp" accept' --permanent firewall-cmd --reload

再来查看一下VIP是否有效,这里需要打开两个节点在配置文件中配置的端口35672和55672,然后进入页面VIP:35672,比如我这里就是172.16.2.250:35672

通过VIP访问HA监控平台,虚拟IP:9188

http://www.cnnetsun.cn/news/3803030.html

相关文章:

  • Android 图形架构 之六——深入分析draw()是如何工作的
  • 3大核心功能:AB Download Manager高效下载管理完全指南
  • 终极指南:如何简单快速实现Riot游戏隐身,告别社交压力
  • Snow隐写术Web化实践:从原理到纯前端实现
  • CWRU轴承数据集:从特征工程到深度学习故障诊断全流程实战
  • Arduino I2C四位数码管驱动指南:从HT16K33原理到温湿度显示器实战
  • 如何提高学习效率
  • UnityWebRequest.Delete方法downloadHandler为null的排查与解决方案
  • AI项目“死亡谷”实录:从立项到上线的12个关键决策点,第6步失误率超91%——现在补救还来得及
  • 如何快速掌握CS2_External:面向新手的终极配置与实战指南
  • 混沌未尽态数学:告别精确执念,拥抱“够用就好”的计算新范式
  • 2500+130字符集:中文NLP与OCR项目的高效工程实践
  • G-Helper终极指南:3分钟告别华硕笔记本的臃肿控制软件
  • 深入解析RE-UE4SS:UE4/UE5游戏模组框架的架构、原理与实战
  • 网络环境规划
  • 百度网盘提取码智能获取工具:5分钟快速上手终极指南
  • NVIDIA Profile Inspector中文界面汉化教程:3步解锁显卡隐藏设置
  • mpweixin 智慧球馆预约微信小程序
  • 通信与接口电路——串口通信的硬件电路
  • 终极跨平台macOS下载指南:gibMacOS完整使用教程
  • VideoDownloadHelper:浏览器视频下载扩展终极指南,三步轻松保存网络视频
  • NVIDIA Vera Rubin 提升每瓦性能,为全球合作伙伴实现最低 Token 成本
  • 终极Neper教程:从零掌握多晶体建模与有限元分析
  • 终极免费激活方案:5分钟搞定Windows和Office永久激活
  • 专业级声音录制实战指南:从环境处理到后期全流程解析
  • AIStarter桌面端AI项目一键部署神器:全新架构即将升级,脚本打包更轻量高效(含使用教程)
  • Leetcode 94. 二叉树的中序遍历
  • 5分钟掌握163MusicLyrics:免费高效的音乐歌词获取解决方案
  • 深入解析TMS320F28335存储器架构与CMD文件配置实战
  • TinyML实战:在Seeed Studio XIAO上部署轻量AI模型的完整指南