概述
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
}
最后
以上就是紧张雪糕为你收集整理的Haproxy加持KeepAlived+进程自动检测的全部内容,希望文章能够帮你解决Haproxy加持KeepAlived+进程自动检测所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复