keepalive+lvs,keepalive+nginx配置

lvs容易出现单点故障,keepalive可以很好的解决这个问题,配置好keepalive会自动生成ipvs规则下面让我们来动手试试吧

keepalive+lvs,keepalive+nginx配置
image.png

将所有的地址都配好后我们只需要在两台lvs主机上编辑keepalive的配置文件

vrrp_instance VI_1 {
    state MASTER
    interface ens33 
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 12345678
    }
    virtual_ipaddress {
        192.168.31.66/24 dev ens33 label ens33:0
    }
}

virtual_server 192.168.31.66 80 {
        delay_loop 1 #每隔1秒检测一次
        lb_algo wrr #wrr算法
        lb_kind DR
        protocol TCP
        sorry_server 127.0.0.1 80

        real_server 192.168.31.203 80 {
                weight 1
                HTTP_GET { #获取健康状态的方法
                        url {
                                path /index.html
                                status_code 200
                        }
                        nb_get_retry 3 #失败重试3次
                        delay_before_retry 2 #每一次重试之前延迟2秒
                        connect_timeout 3 #超时时长
                }
        }
        
        real_server 192.168.31.204 80 {
                weight 1
                HTTP_GET {
                        url {
                                path /index.html
                                status_code 200
                        }
                        nb_get_retry 3 #失败重试3次
                        delay_before_retry 2 #每一次重试之前延迟2秒
                        connect_timeout 3 #超时时长
                }
        }
                        
}                                 

与普通的keepalive不同的是需要定义一个虚拟服务器,然后在里面再定义两台真正的服务器
启动keepalive服务


keepalive+lvs,keepalive+nginx配置
image.png

配置好后就会自动生成ipvs规则了


keepalive+lvs,keepalive+nginx配置
image.png

下面我们来测试下


keepalive+lvs,keepalive+nginx配置

可以看到已经成功的负载均衡了,就算我们down掉其中一台主机lvs也能正常的工作,可用性大大的增强了。


keepalive+lvs,keepalive+nginx配置
image.png

就算我们down掉两台服务器也能访问sorry页面

当然这样只有一台lvs主机在服务有点浪费资源,我们可以设置keepalived双主模式,让两台主机都动起来
当然lvs使用起来由诸多的限制性,生产中较为常见的一般都是keepalived+nginx配置,现在让我们动手实验看看吧。
keepalived调用外部的辅助脚本进行资源监控,并根据监控的结果状态能实现优先动态调整;也就是说当地址转移到本主机上就启动nginx,转走就关闭nginx这一切都是通过脚本的执行状态来完成,keepalived本身没有调动nginx的功能。当然如果是双主模式就不需要关闭nginx,只需要启动就行了。

分两步:(1) 先定义一个脚本;(2) 调用此脚本;
注意脚本要先定义在虚拟路由器之外,然后用track_script在虚拟路由器之内调用

vrrp_script <SCRIPT_NAME> {
                script "" #脚本如果很简单可直接写在这
                interval INT #每隔多久脚本执行一次
                weight -INT  #如果失败当前节点的priority减去多少(减去后因当小于备用节点)
                                  fall INT #至少检查几次
                                  rise INT# 如果可用立即加权
            }
            
            track_script {
                SCRIPT_NAME_1
                SCRIPT_NAME_2
                ...
            }

配置示例:

vrrp_script chk_down {
        script "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0"
        weight -10
        interval 1
        fall 1
        rise 1
}

vrrp_script chk_nginx {
    script "killall -0 nginx && exit 0 || exit 1"
    interval 1
    weight -5
    fall 2
    rise 1
            }

vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 12345678
    }
    virtual_ipaddress {
        192.168.31.66/24 dev ens33 label ens33:0
    }


    track_script {
        chk_down
        chk_nginx
    }
        notify_master "/etc/keepalived/notify.sh master"
        notify_backup "/etc/keepalived/notify.sh backup"
        notify_fault "/etc/keepalived/notify.sh fault"
}

在这个脚本我们通过判断目录下是否存在down文件来调整服务的优先级


keepalive+lvs,keepalive+nginx配置
image.png

这个时候如果我们创建一个down文件,则优先级就会被降低,ip地址会被移动到BACKUP上


keepalive+lvs,keepalive+nginx配置
image.png

既然这样我们也可以通过脚本来控制nginx,如果状态是主我们就启动nginx如果状态是备就关掉nginx
在nginx的主配置文件中添加
 upstream webservs {
                server 192.168.0.10:80
                server 192.168.0.11:80
                server 192.168.0.12:80
        {              

 proxy_pass http://webservs;


#通知脚本

notify() {
               local mailsubject="$(hostname) to be $1, vip floating"
               local mailbody="$(date +'%F %T'): vrrp transition, $(hostname) changed to be $1"
               echo "$mailbody" | mail -s "$mailsubject" $contact
              }

 case $1 in
        master)
                 systemctl start nginx
                 notify master
                  ;;
        backup)
                 systemctl restart nginx
                 notify backup
                 ;;
        fault)

                 systemctl stop nginx