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