Hroxy+KeepAlived搭建高可用集群
为了保障集群的高可用,我们可以在集群的基础之上,在添加了2台HAProxy 用于数据的负载均衡和分发。
而为了确保HAProxy负载均衡服务器的高可用性,我们在这HAProxy服务器上在安装KeepAlived 做心跳检测和虚拟IP,其目的是用于检测HAPorxy服务是否正常,确保2台负载均衡服务器的高可用性。
KeepAlived会为2台负载均衡器创建一个VIP(虚拟IP),而我们业务服务器只需要连接到这个VIP上就可以进行消息的发送和消费。
RabbitMQ集群+HAproxy+Keepalived视频教程:https://video.javaxing.com/RabbitMQ%20HAProxy%2BKeepalived%E6%90%AD%E5%BB%BA%E9%AB%98%E5%8F%AF%E7%94%A8%E9%9B%86%E7%BE%A4.mp4
1)搭建HAProxy
官网HAProxy 官方下载地址为:https://www.haproxy.org/#down
本文章用到的版本:https://files.javaxing.com/haproxy-ss-LATEST.tar.gz
1.解压、编译、设置环境变量
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| # 下载源码 [root@s4 ~]# wget https://files.javaxing.com/haproxy-ss-LATEST.tar.gz
# 安装C++,为了编译环境使用 [root@s4 ~]# yum install -y c++
# 解压 [root@s4 ~]# tar -xvf haproxy-ss-LATEST.tar.gz
# 进入目录 [root@s4 ~]# cd haproxy-ss-20230329/
# 编译 [root@s4 haproxy-ss-20230329]# make TARGET=linux-glibc PREFIX=/usr/local/haproxy [root@s4 haproxy-ss-20230329]# make install PREFIX=/usr/local/haproxy
|
2.设置环境变量
1 2 3 4 5 6 7 8
| # 设置环境变量 [root@s4 haproxy-ss-20230329]# vim /etc/profile
export HAPROXY_HOME=/usr/local/haproxy export PATH=$PATH:$HAPROXY_HOME/sbin
# 保存后 使profile生效 [root@s4 haproxy-ss-20230329]# source /etc/profile
|
配置hosts
在HAProxy配置中,我们会以名称的形式指定rabbitMQ节点,所以我们还需要提前在hosts文件中映射好关系。
1 2 3 4 5
| [root@s4 haproxy-ss-20230329]# vi /etc/hosts
172.17.1.104 rabbit1 172.17.1.84 rabbit2 172.17.1.30 rabbit3
|
3.负载均衡配置
新建配置文件 haproxy.cfg
,位置为:/etc/haproxy/haproxy.cfg,文件内容如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
| global # 日志输出配置、所有日志都记录在本机,通过 local0 进行输出 log 127.0.0.1 local0 info # 最大连接数 maxconn 4096 # 改变当前的工作目录 chroot /usr/local/haproxy # 以指定的 UID 运行 haproxy 进程 uid 99 # 以指定的 GID 运行 haproxy 进程 gid 99 # 以守护进行的方式运行 daemon # 当前进程的 pid 文件存放位置 pidfile /usr/local/haproxy/haproxy.pid
# 默认配置 defaults # 应用全局的日志配置 log global # 使用4层代理模式,7层代理模式则为"http" mode tcp # 日志类别 option tcplog # 不记录健康检查的日志信息 option dontlognull # 3次失败则认为服务不可用 retries 3 # 每个进程可用的最大连接数 maxconn 2000 # 连接超时 timeout connect 5s # 客户端超时 timeout client 120s # 服务端超时 timeout server 120s
# 绑定配置 listen rabbitmq_cluster # 对外开放端口 5671 bind :5671 # 配置TCP模式 mode tcp # 采用加权轮询的机制进行负载均衡 balance roundrobin # RabbitMQ 集群节点配置 server node1 rabbit1:5672 check inter 5000 rise 2 fall 3 weight 1 server node2 rabbit2:5672 check inter 5000 rise 2 fall 3 weight 1 server node3 rabbit3:5672 check inter 5000 rise 2 fall 3 weight 1
# 配置监控页面 listen monitor bind :8100 mode http option httplog stats enable stats uri /stats stats refresh 5s
|
集群配置:server node1 rabbit1:5672 check inter 5000 rise 2 fall 3 weight 1
解释:HAProxy node1 节点每隔 5 秒进行一次健康检查,如果连续两次的检查结果都是正常,则认为该节点可用,此时可以将客户端的请求轮询到该节点上;如果连续 3 次的检查结果都不正常,则认为该节点不可用。weight 用于指定节点在轮询过程中的权重,这里我们默认都为1.
4.启动服务
1
| haproxy -f /etc/haproxy/haproxy.cfg
|
启动成功后,我们可通过IP:8100 (上面的配置文件里面开放的端口号)来查看监控页面:
http://172.17.1.68:8100/stats http://172.17.1.173:8100/stats
节点绿色代表健康,红色代表出问题了,能成功出现该监控页面代表HAProxy 搭建成功,并已经对RabbitMQ进行监控。
2)KeepAlived 环境搭建
接下来我们搭建KeepAlived 来检测HAProxy服务器,当HAProxy服务器宕机就进行故障转移,确保HAProxy的可用性。
1.安装Keepalived
1
| [root@s4 ~]# yum install -y keepalived
|
2.配置 主节点 keepalived.conf
编辑keepalived.conf:
1
| [root@s6 keepalived]# vi /etc/keepalived/keepalived.conf
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| global_defs { # 路由id,主备节点不能相同 router_id node1 }
# 自定义监控脚本 vrrp_script chk_haproxy { # 脚本位置 script "/etc/keepalived/haproxy_check.sh" # 脚本执行的时间间隔 interval 5 weight 10 }
vrrp_instance VI_1 { # Keepalived的角色,MASTER 表示主节点,BACKUP 表示备份节点 state MASTER # 指定监测的网卡,可以使用 ifconfig 进行查看 interface enp0s3 # 虚拟路由的id,主备节点需要设置为相同 virtual_router_id 1 # 优先级,主节点的优先级需要设置比备份节点高 priority 100 # 设置主备之间的检查时间,单位为秒 advert_int 1 # 定义验证类型和密码 authentication { auth_type PASS auth_pass 123456 }
# 调用上面自定义的监控脚本 track_script { # 这里不使用监控脚本,我们自己写一个 #chk_haproxy }
virtual_ipaddress { # 虚拟IP地址,可以设置多个 172.17.1.254 } }
|
注意:
1、主KeepAlived服务器要设置成MASTER,而从KeepAlived服务器设置成BACKUP
2、为2台服务器设置一个虚拟IP地址,该IP地址只需要和服务器在同一个网卡就可以了,用于对外提供服务
3、主节点的priority一定要比从节点高
3.配置 从节点 keepalived.conf
编辑keepalived.conf:
1
| [root@s6 keepalived]# vi /etc/keepalived/keepalived.conf
|
keepalived.conf:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| global_defs { # 路由id,主备节点不能相同 router_id node2
}
vrrp_script chk_haproxy { script "/etc/keepalived/haproxy_check.sh" interval 5 weight 10 }
vrrp_instance VI_1 { # BACKUP 表示备份节点 state BACKUP interface enp0s3 virtual_router_id 1 # 优先级,备份节点要比主节点低 priority 80 advert_int 1 authentication { auth_type PASS auth_pass 123456 } track_script { chk_haproxy }
virtual_ipaddress { 172.17.1.254 } }
|
4.创建监控HAProxy服务脚本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| while true do # 判断haproxy是否已经启动 if [ `ps -C haproxy --no-heading | wc -l` -eq 0 ] ; then #如果没有启动,则启动 haproxy -f /etc/haproxy/haproxy.cfg; systemctl start keepalived fi
#睡眠3秒以便haproxy完全启动 sleep 3
#如果haproxy还是没有启动,此时需要将本机的keepalived服务停掉,以便让VIP自动漂移到另外一台haproxy if [ `ps -C haproxy --no-header | wc -l` -eq 0 ]; then systemctl stop keepalived fi
done
|
每3秒就监控HAProxy服务,进入无限循环,如果服务关闭了就尝试启动服务,如果3秒后还启动不起来,就关闭本机keepalived服务,那么VIP就会切换到另外一台keepalived服务器上。
为监控脚本赋予执行权限
1
| chmod +x /etc/keepalived/haproxy_check.sh
|
5.启动服务
分别在主和从节点上启动keepalived服务:
1
| [root@s4 ~]# systemctl start keepalived
|
6.验证keepalived状态
我们在主keepalived服务上通过 ip addr,可以查看到我们的网卡上有一个 虚拟IP(VIP,172.17.1.254)
1
| [root@s4 ~]# systemctl status keepalived
|
7.验证故障转移
我们理想中的是,当我们其中一台Master HAproxy服务器挂掉后,会自动关闭keepalived服务,并将VIP漂移到 Backup HAProxy服务上。
1
| [root@s4 ~]# systemctl stop keepalived
|
当我们关闭后,我们查看一下keepalived状态,发现已经变成了未激活状态,并且VIP 虚拟IP已经没了,漂移给了BACKUP服务器。
查看BACKUP服务器
8.发送消息到VIP
HAProxy 对外提供的端口号是5671,所以这里我们的端口号依旧是5671,只是IP变成了VIP,这样数据请求到VIP后,就会转发给HAProxy,HAProxy收到后根据负载均衡策略 进行数据转发。
执行方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| @GetMapping(value = "/directSend") public Object directSend() throws AmqpException, UnsupportedEncodingException {
User user = new User(); user.setUsername("admin"); user.setPassword("123456"); user.setAge(12); for (int i = 0; i < 50000; i++) { rabbitTemplate.setMessageConverter(new Jackson2JsonMessageConverter()); rabbitTemplate.convertAndSend("", "directqueue", user); } return "message sended : " + user; }
|
开始执行
即便在Master HAProxy服务挂掉后,Backup HAProxy服务依旧可以对外提供服务,我们成功发送了5W条消息并成功消费消息。