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

修改主机映射

使用vi编辑,在最后加上每台主机的端口和主机名映射例如172.16.2.134 master-node

vi /etc/hosts

注意这里需要的是集群中所有机器的端口和名称列表,同时每台机器上这个文件需要相同

请添加图片描述

避免重复操作可以直接把这个文件远程复制到其他机器:Scp -r 源路径 root@172.16.2.211:目标路径,例如

 scp -r /etc/hosts root@172.16.2.211:/etc/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"}'

高可用集群搭建

前期准备

开启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

请添加图片描述

RabbitMQ是一个开源的消息队列软件,可以实现消息的发布和订阅。HAProxy是一个高可用性负载均衡器,可以将请求分发到多个后端服务器上。Keepalived是一个用于实现高可用性的软件,可以监控服务器的状态并在主备切换时进行通知。 在搭建RabbitMQ高可用镜像模式集群时,可以使用HAProxyKeepalived来实现负载均衡和故障切换。具体步骤如下: 1. 配置HAProxy:在HAProxy的配置文件中,可以指定RabbitMQ的节点和端口,并设置负载均衡策略。可以使用命令`haproxy -f /etc/haproxy/haproxy.cfg`启动HAProxy服务。 2. 配置Keepalived:在Keepalived的配置文件中,可以设置虚拟IP和监控脚本。Keepalived会监控RabbitMQ节点的状态,并在主节点故障时切换到备节点。可以使用命令`service keepalived start`启动Keepalived服务。 3. 验证高可用性:可以通过访问RabbitMQ管理平台和HAProxy监控统计平台的虚拟IP来验证高可用性。可以使用命令`curl http://172.22.40.1:35672/#/`访问RabbitMQ管理平台,使用命令`curl http://172.22.40.1:9188/admin_stats#`访问HAProxy监控统计平台。 总结来说,通过配置HAProxyKeepalived,可以实现RabbitMQ的高可用性和负载均衡。HAProxy负责将请求分发到多个RabbitMQ节点上,而Keepalived则负责监控节点的状态并在主备切换时进行通知。这样可以确保RabbitMQ集群的稳定性和可靠性。[1][2][3]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值