HAProxy+KeepAlived搭建高可用集群

312 阅读5分钟

HaproxyKeepAlived.png

为了保障集群的高可用,我们可以在集群的基础之上,在添加了2台HAProxy 用于数据的负载均衡和分发。

而为了确保HAProxy负载均衡服务器的高可用性,我们在这HAProxy服务器上在安装KeepAlived 做心跳检测和虚拟IP,其目的是用于检测HAPorxy服务是否正常,确保2台负载均衡服务器的高可用性。

KeepAlived会为2台负载均衡器创建一个VIP(虚拟IP),而我们业务服务器只需要连接到这个VIP上就可以进行消息的发送和消费。

1)搭建HAProxy

官网HAProxy 官方下载地址为:www.haproxy.org/#down

1.解压、编译、设置环境变量
# 下载源码
[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.设置环境变量
# 设置环境变量
[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文件中映射好关系

[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,文件内容如下:

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
4.启动服务
haproxy -f /etc/haproxy/haproxy.cfg

启动成功后,我们可通过IP:8100 (上面的配置文件里面开放的端口号)来查看监控页面:

http://172.17.1.68:8100/stats http://172.17.1.173:8100/stats

image-20230330201338777.png

image-20230330201608161.png

节点绿色代表健康,红色代表出问题了,能成功出现该监控页面代表HAProxy 搭建成功,并已经对RabbitMQ进行监控。

2)KeepAlived 环境搭建

接下来我们搭建KeepAlived 来检测HAProxy服务器,当HAProxy服务器宕机就进行故障转移,确保HAProxy的可用性。

1.安装Keepalived
[root@s4 ~]# yum install -y keepalived
2.配置 主节点 keepalived.conf
[root@s6 keepalived]# vi /etc/keepalived/keepalived.conf 
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
    }
}
3.配置 从节点 keepalived.conf
[root@s6 keepalived]# vi /etc/keepalived/keepalived.conf 
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服务脚本
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

为监控脚本赋予执行权限

chmod +x /etc/keepalived/haproxy_check.sh
5.启动服务

分别在主和从节点上启动keepalived服务:

[root@s4 ~]# systemctl start  keepalived
6.验证keepalived状态

我们在主keepalived服务上通过 ip addr,可以查看到我们的网卡上有一个 虚拟IP(VIP,172.17.1.254)

[root@s4 ~]# systemctl status keepalived
7.验证故障转移

我们理想中的是,当我们其中一台Master HAproxy服务器挂掉后,会自动关闭keepalived服务,并将VIP漂移到 Backup HAProxy服务上。

[root@s4 ~]# systemctl stop keepalived

当我们关闭后,我们查看一下keepalived状态,发现已经变成了未激活状态,并且VIP 虚拟IP已经没了,漂移给了BACKUP服务器。