Haproxy加持KeepAlived+进程自动检测

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lvshaorong/article/details/81301976

haproxy是一个很常用的反向代理和负载均衡软件,可以把后端的节点分成普通节点和backup节点,支持后端健康检测和自动切换,效果类似与nginx但是我觉得比nginx更加实用一些。有了haproxy,后端的应用可以不以root启用在80端口,可以选择普通用户在随意一个端口启动,然后用haproxy监听在80端口即可。haproxy还可以作为HTTPS前置,只需在haproxy上配置SSL证书,后端的web节点无需再配置https了。另外haproxy还可以根据url进行路由,将静态资源和动态页面分离开,实现更高层次的负载均衡。

但是如果把路由分发和负载均衡的工作都交给haproxy,那么就会形成一个单点故障点,如果haproxy的主机死机,掉电,宕机,网卡接触不良就会导致整个网络全部无法访问的问题,而keepalived就是专门来处理这个问题的。

我是不推荐让keepalived来接管数据库和大型中间件的,反而用keepalived来接管haproxy和nginx这种轻量级的程序是很合适的。而数据库和web服务可以做成集群的模式来实现热备。以数据库为例,如果主库发生宕机,那么切换到备机的时候往往会碰到很多的事务问题和存储问题,数据库起停本身就会消耗很多时间,如果只是由于网络不稳定造成的keepalived切换,那么主备很有可能彻底乱套,产生互相争夺master的情况,然后可能数据会错乱数据库也无法启动。对于WebSphere和weblogic这种中间件,他们的起停也会消耗很多时间,使用keepalived进行自动启动很可能会碰到挂载磁盘失败导致的问题。所以keepalived接管haproxy这种轻量级的前置应用比较合适。

首先我们找出两台机器,分别安装haproxy,配置文件相同,IP地址不同,然后通过编译的方法安装keepalived,安装方法在Keepalived实现NAT+LVS+后端健康检测已经有说明

服务器 真实地址 虚拟地址 网关地址
Keepalived主服务器 10.100.100.89 10.100.100.200 10.100.100.1
Keepalived备服务器 10.100.100.88 10.100.100.200 10.100.100.1
真实HTTP服务1 10.100.100.101   10.100.100.1
真实HTTP服务2 10.100.100.102   10.100.100.1

haproxy配置文件/etc/haproxy/haproxy.cfg内容如下

global
    log         127.0.0.1 local2

    chroot      /var/lib/haproxy
    pidfile     /var/run/haproxy.pid
    maxconn     4000
    user        haproxy
    group       haproxy
    daemon

    # turn on stats unix socket
    stats socket /var/lib/haproxy/stats

#---------------------------------------------------------------------
# common defaults that all the 'listen' and 'backend' sections will
# use if not designated in their block
#---------------------------------------------------------------------
defaults
    mode                    http
    log                     global
    option                  httplog
    option                  dontlognull
    option http-server-close
    option forwardfor       except 127.0.0.0/8
    option                  redispatch
    retries                 3
    timeout http-request    10s
    timeout queue           1m
    timeout connect         10s
    timeout client          1m
    timeout server          1m
    timeout http-keep-alive 10s
    timeout check           10s
    maxconn                 3000

#---------------------------------------------------------------------
# main frontend which proxys to the backends
#---------------------------------------------------------------------
frontend  main *:80
    default_backend             app


#---------------------------------------------------------------------
# round robin balancing between the various backends
#---------------------------------------------------------------------
backend app
    balance     roundrobin
    server  web1 10.100.100.101:8080 check
    server  web2 10.100.100.102:8080 check

安装好keepalived后,我们在/etc/keepalived目录下建立这样几个文件

haproxy_check.sh  定时检查haproxy进程的脚本

to_backup.sh          keepalived切换为backup状态时执行的命令,可做报警使用

to_fault.sh               keepalived进入fault状态时执行的命令,可做报警使用

to_master.sh           keepalived进入master状态时执行的命令,可做报警使用

下面记录一下这几个脚本的内容

haproxy_check.sh:下面使用ps命令来查看进程,如果发现haproxy挂掉就重启,你也可以使用curl直接获取web内容进行更精确的检测

#!/bin/bash
A=`ps -C haproxy --no-header |wc -l`
if [ $A -eq 0 ];then
    echo "`date` haproxy is dead" >> /tmp/lvs.log
	service haproxy start
sleep 2
if [ `ps -C haproxy --no-header |wc -l` -eq 0 ];then
    echo "`date` haproxy cannot start,stop keepalived" >> /tmp/lvs.log
	service keepalived stop
fi

to_backup.sh :如果主节点主动切换为备用节点(在启动的时候会执行一次),那么就输出一条日志,注意,我的网卡名称是ens192

#!/bin/bash
Date=$(date +%F" "%T)
IP=$(ifconfig ens192 |grep -w "inet" |awk '{print $2}')
echo "$Date $IP change to backup." >> /tmp/lvs.log

to_fault.sh :

#!/bin/bash
Date=$(date +%F" "%T)
IP=$(ifconfig ens192 |grep -w "inet" |awk '{print $2}')
echo "$Date $IP change to fault." >> /tmp/lvs.log

to_master.sh:如果备用节点升级成主节点,可以用这个脚本进行报警,及时修补主节点的故障

#!/bin/bash
Date=$(date +%F" "%T)
IP=$(ifconfig ens192 |grep -w "inet" |awk '{print $2}')
echo "$Date $IP change to master." >> /tmp/lvs.log

下面就是keepalived.conf的内容

! Configuration File for keepalived

global_defs {
   router_id LVS_MASTER
   vrrp_skip_check_adv_addr
   #vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}


vrrp_script chk_haproxy {
	script "/etc/keepalived/haproxy_check.sh" ## 检测 haproxy 状态的脚本路径
	interval 5 ## 检测时间间隔
	weight -20 ## 如果条件成立,权重-20
}

vrrp_instance VI_1 {
    state MASTER
    interface ens192
    virtual_router_id 91
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.100.100.200
    }
	track_script {
		chk_haproxy
	}
	notify_master /etc/keepalived/to_master.sh
    notify_backup /etc/keepalived/to_backup.sh
    notify_fault /etc/keepalived/to_fault.sh
}

在上面这个文件里,已经把各个脚本都配置进去了,如果haproxy进程消失且重启失败,或者说该服务器断电宕机,那么备用机会自动接收到虚拟IP并通过脚本报警,下面是备用节点的keepalived.conf

! Configuration File for keepalived
 
global_defs {
   router_id LVS_BACKUP            #BACKUP上修改为LVS_BACKUP
}

vrrp_script chk_haproxy {
	script "/etc/keepalived/haproxy_check.sh" ## 检测 haproxy 状态的脚本路径
	interval 5 ## 检测时间间隔
	#weight -20 ## 如果条件成立,权重-20
}

vrrp_instance VI_1 {
    state BACKUP                   #BACKUP上修改为BACKUP
    interface ens192               #此处是要绑定虚拟IP的网卡名称
    virtual_router_id 91           #此处要与master一致
    priority 80                    #BACKUP上修改为80
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.100.100.200             #此处要与master一致
    }
	track_script {
		chk_haproxy
	}
	notify_master /etc/keepalived/to_master.sh
    notify_backup /etc/keepalived/to_backup.sh
    notify_fault /etc/keepalived/to_fault.sh
}

猜你喜欢

转载自blog.csdn.net/lvshaorong/article/details/81301976
今日推荐