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 --reloadRabbitMQ集群搭建
如下步骤主要是搭建主从的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.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 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
