部署Haproxy的高可用

时间:2022-07-24
本文章向大家介绍部署Haproxy的高可用,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

Haproxy与Keepalived VRRP 介绍

软件:haproxy---主要是做负载均衡的7层,也可以做4层负载均衡 apache也可以做7层负载均衡,但是很麻烦。实际工作中没有人用。 负载均衡是通过OSI协议对应的 7层负载均衡:用的7层http协议, 4层负载均衡:用的是tcp协议加端口号做的负载均衡

ha-proxy概述 ha-proxy是一款高性能的负载均衡软件。因为其专注于负载均衡这一些事情,因此与nginx比起来在负载均衡这件事情上做更好,更专业。

ha-proxy的特点 ha-proxy 作为目前流行的负载均衡软件,必须有其出色的一面。下面介绍一下ha-proxy相对LVS,Nginx等负载均衡软件的优点。

支持tcp / http 两种协议层的负载均衡,使得其负载均衡功能非常丰富。 支持8种左右的负载均衡算法,尤其是在http模式时,有许多非常实在的负载均衡算法,适用各种需求。 性能非常优秀,基于单进程处理模式(和Nginx类似)让其性能卓越。 拥有一个功能出色的监控页面,实时了解系统的当前状况。 功能强大的ACL支持,给用户极大的方便。

haproxy算法: 1.roundrobin 基于权重进行轮询,在服务器的处理时间保持均匀分布时,这是最平衡,最公平的算法.此算法是动态的,这表示其权重可以在运行时进行调整. 2.static-rr 基于权重进行轮询,与roundrobin类似,但是为静态方法,在运行时调整其服务器权重不会生效.不过,其在后端服务器连接数上没有限制 3.leastconn 新的连接请求被派发至具有最少连接数目的后端服务器.

keepalived是什么 keepalived是集群管理中保证集群高可用的一个服务软件,用来防止单点故障。

keepalived工作原理 keepalived是以VRRP协议为实现基础的,VRRP全称Virtual Router Redundancy Protocol,即虚拟路由冗余协议。(云服务器不支持VRRP)

虚拟路由冗余协议,可以认为是实现高可用的协议,即将N台提供相同功能的路由器组成一个路由器组,这个组里面有一个master和多个backup,master上面有一个对外提供服务的vip(该路由器所在局域网内其他机器的默认路由为该vip),master会发组播,当backup收不到vrrp包时就认为master宕掉了,这时就需要根据VRRP的优先级来选举一个backup当master。这样的话就可以保证路由器的高可用了。

keepalived主要有三个模块,分别是core、check和vrrp。core模块为keepalived的核心,负责主进程的启动、维护以及全局配置文件的加载和解析。check负责健康检查,包括常见的各种检查方式。vrrp模块是来实现VRRP协议的。

脑裂(裂脑): Keepalived的BACKUP主机在收到不MASTER主机报文后就会切换成为master,如果是它们之间的通信线路出现问题,无法接收到彼此的组播通知,但是两个节点实际都处于正常工作状态,这时两个节点均为master强行绑定虚拟IP,导致不可预料的后果,这就是脑裂。 解决方式: 1、添加更多的检测手段,比如冗余的心跳线(两块网卡做健康监测),ping对方等等。尽量减少"裂脑"发生机会。(指标不治本,只是提高了检测到的概率); 2、做好对裂脑的监控报警(如邮件及手机短信等或值班).在问题发生时人为第一时间介入仲裁,降低损失。 3、爆头,将master停掉。然后检查机器之间的防火墙。网络之间的通信

实验环境

[root@master /]# cat /etc/redhat-release 
CentOS Linux release 7.3.1611 (Core) 

在所有服务器上面进行配置

systemctl stop firewalld  #关闭防火墙
setenforce 0   #关闭selinux,临时生效
vim /etc/hosts
172.16.0.10 master
172.16.0.8  backup
172.16.0.4  server1
172.16.0.5  server2

安装nginx

给两台web服务器配置安装nginx

[root@server1 /]# yum install nginx -y
[root@server2 /]# yum install nginx -y

创建测试文件

[root@server1 /]# echo "Hello World server1" > /usr/share/nginx/html/index.html
[root@server2 /]# echo "Hello World server2" > /usr/share/nginx/html/index.html

安装Haproxy调度器

master:

[root@master /]# yum -y install haproxy
[root@master /]# cp -rf /etc/haproxy/haproxy.cfg{,.bak}
[root@master /]# vim /etc/haproxy/haproxy.cfg
global
    log         127.0.0.1 local2 info
    pidfile     /var/run/haproxy.pid
    maxconn     4000   #优先级低
    user        haproxy
    group       haproxy
    daemon               #以后台形式运行ha-proxy
    nbproc 1            #工作进程数量  cpu内核是几就写几
defaults
    mode                    http  #工作模式 http ,tcp 是 4 层,http是 7 层   
    log                     global
    retries                 3   #健康检查。3次连接失败就认为服务器不可用,主要通过后面的check检查
    option                  redispatch  #服务不可用后重定向到其他健康服务器。
    maxconn                 4000  #优先级中
    contimeout              5000  #ha服务器与后端服务器连接超时时间,单位毫秒ms
    clitimeout              50000 #客户端超时
    srvtimeout              50000 #后端服务器超时
listen stats
    bind            *:81
    stats                       enable
    stats uri               /haproxy  #使用浏览器访问 http://172.16.0.10:81/haproxy,可以看到服务器状态  
    stats auth              we:123  #用户认证
frontend  web
    mode                    http  
    bind                            *:80   #监听哪个ip和什么端口
    option                  httplog     #日志类别 http 日志格式
    acl html url_reg  -i  .html$  #1.访问控制列表名称html。规则要求访问以html结尾的url(可选)
    use_backend httpservers if  html #2.如果满足acl html规则,则推送给后端服务器httpservers
    default_backend    httpservers   #默认使用的服务器组
backend httpservers    #名字要与上面的名字必须一样
    balance     roundrobin  #负载均衡的方式
    server  http1 172.16.0.4:80 maxconn 2000 weight 1  check inter 1s rise 2 fall 2
    server  http2 172.16.0.5:80 maxconn 2000 weight 1  check inter 1s rise 2 fall 2

backup:

[root@backup /]# yum -y install haproxy
[root@backup /]# cp -rf /etc/haproxy/haproxy.cfg{,.bak}
[root@backup /]# vim /etc/haproxy/haproxy.cfg
global
    log         127.0.0.1 local2 info
    pidfile     /var/run/haproxy.pid
    maxconn     4000   #优先级低
    user        haproxy
    group       haproxy
    daemon               #以后台形式运行ha-proxy
    nbproc 1            #工作进程数量  cpu内核是几就写几
defaults
    mode                    http  #工作模式 http ,tcp 是 4 层,http是 7 层   
    log                     global
    retries                 3   #健康检查。3次连接失败就认为服务器不可用,主要通过后面的check检查
    option                  redispatch  #服务不可用后重定向到其他健康服务器。
    maxconn                 4000  #优先级中
    contimeout              5000  #ha服务器与后端服务器连接超时时间,单位毫秒ms
    clitimeout              50000 #客户端超时
    srvtimeout              50000 #后端服务器超时
listen stats
    bind            *:81
    stats                       enable
    stats uri               /haproxy  #使用浏览器访问 http://172.16.0.8:81/haproxy,可以看到服务器状态  
    stats auth              we:123  #用户认证
frontend  web
    mode                    http  
    bind                            *:80   #监听哪个ip和什么端口
    option                  httplog     #日志类别 http 日志格式
    acl html url_reg  -i  .html$  #1.访问控制列表名称html。规则要求访问以html结尾的url(可选)
    use_backend httpservers if  html #2.如果满足acl html规则,则推送给后端服务器httpservers
    default_backend    httpservers   #默认使用的服务器组
backend httpservers    #名字要与上面的名字必须一样
    balance     roundrobin  #负载均衡的方式
    server  http1 172.16.0.4:80 maxconn 2000 weight 1  check inter 1s rise 2 fall 2
    server  http2 172.16.0.5:80 maxconn 2000 weight 1  check inter 1s rise 2 fall 2

启动Haproxy服务

[root@master /]# systemctl start haproxy
[root@backup /]# systemctl start haproxy

使用客户机测试

Keepalived实现调度器HA高可用

安装keepalived

[root@master /]# yum install -y keepalived
[root@backup /]# yum install -y keepalived

编辑配置文件 master:

[root@master /]# cp /etc/keepalived/keepalived.conf{,.bak}
[root@master /]# vim /etc/keepalived/keepalived.conf
global_defs {
   router_id directory1   #调度器的名称,备调度器改为directory2(两个名字一定不能一样)
}

vrrp_instance VI_1 {
    state MASTER        #定义主还是备,备用的话写backup
    interface ens33     #VIP绑定接口
    virtual_router_id 80  #整个集群的调度器一致(在同一个集群)
    priority 100         #主调度器优先级  备调度器改为50
    advert_int 1         #发包
    authentication {
        auth_type PASS      #主备节点认证信息
        auth_pass 1111
    }
    virtual_ipaddress {
        172.16.0.100/24    #VIP  设置为自己网段
    }
}

backup:

[root@backup /]# cp /etc/keepalived/keepalived.conf{,.bak}
[root@backup /]# vim /etc/keepalived/keepalived.conf
global_defs {
   router_id directory2   #调度器的名称,备调度器改为directory2(两个名字一定不能一样)
}

vrrp_instance VI_1 {
    state backup        #定义主还是备,备用的话写backup
    interface ens33     #VIP绑定接口
    nopreempt        #设置到backup上面,不抢占资源
    virtual_router_id 80  #整个集群的调度器一致(在同一个集群)
    priority 50
    advert_int 1         #发包
    authentication {
        auth_type PASS      #主备节点认证信息
        auth_pass 1111
    }
    virtual_ipaddress {
        172.16.0.100/24    #VIP  设置为自己网段
    }
}

启动keepalived

[root@master /]# systemctl start keepalived
[root@backup /]# systemctl start keepalived

查看VIP IP绑定成功了没

[root@master /]# ip add |grep 172.16.0.
inet 172.16.0.10/24 brd 172.16.0.255 scope global dynamic ens33
inet 172.16.0.100/24 scope global secondary ens33

[root@backup /]# ip add |grep 172.16.0.
inet 172.16.0.8/24 brd 172.16.0.255 scope global dynamic ens33

可以看到VIP地址在主调度器上 如果这个时候keepaliedv主节点服务器宕机了,VIP会自己漂移到备用节点上。

5>浏览器访问VIP地址

基于nginx的高可用性

以上我们只是实现了高可用,基于Haproxy的前提是Haproxy服务是正常。如果有突发情况使得nginx服务不能启动,但是我们的keepalived服务是正常,这个时候用户是访问不到的,VIP也不会自动漂移到备用的节点服务器上。所以我们需要写一些代码来判断一下Haproxy服务是不是正常,如果不正常的话我们就将Haproxy服务关掉,然后实现VIP的漂移,这个时候用户就不会出现无法访问的情况了。

思路: 让Keepalived以一定时间间隔执行一个外部脚本,脚本的功能是当Haproxy失败,则关闭本机的Keepalived

[root@master /]# vim /etc/keepalived/check_haproxy_status.sh
#!/bin/bash
/usr/bin/curl -I http://localhost &>/dev/null   
if [ $? -ne 0 ];then                                                                     
#       /etc/init.d/keepalived stop
        systemctl stop keepalived
fi     

[root@master /]# chmod a+x /etc/keepalived/check_haproxy_status.sh  

2>keepalived使用script

master:
[root@master /]# vim /etc/keepalived/keepalived.conf
global_defs {
   router_id directory1
}
vrrp_script check_haproxy {
   script "/etc/keepalived/check_haproxy_status.sh"
   interval 5  #每5秒执行一次
}
vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 80
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        172.16.0.100/24
    }
 track_script {
        check_haproxy
    }
}

测试

将keepalived的主节点的haproxy服务关闭,查看vip是否漂移,如果漂移,即成功