前言

此前做了lvs的高可用集群,生产环境中一般还是nginx作为负载均衡用得比较多。所以本次主要学习了如何让多nginx负载均衡器进行高可用

环境

  • 两台后端web服务器(分别提供不一样的主页,方便测试)
  • 两台nginx前端负载均衡服务器

keepalived需要监控nginx的状态,nginx出现故障时自动转移

一、配置前端服务

配置编辑nginx的配置文件,定义集群

upsteam websrvs {
    server 172.16.10.10:80 weight=1;
    server 172.16.10.20:80 weight=2
}
#定义在server外面
#然后再server中设置proxy
server {
    ...
    location / {
        proxy_pass http://websrvs/;
    }
    #访问根,直接代理到后端服务器
    ...
}

便于测试,这里的调度算法为rr
第二台nginx服务器配置文件相同

二、keepalived配置

特别注意nginx的运行状态,nginx故障后要实现自动转移

编辑keepalived配置文件,我直接贴出来

! Configuration File for keepalived

global_defs {
   notification_email {
        root@localhost
   }
   notification_email_from kaadmin@localhost
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id node1
   vrrp_mcast_group4 224.0.0.100
   vrrp_skip_check_adv_addr
   #vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}
vrrp_script chk_nginx {
    script "/usr/bin/killall -0 nginx &> /dev/null"
    interval 1
    weight -10
    #当nginx没有运行,就降低优先级
}
vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        172.16.123.123/16 dev ens33 label ens33:0
        #VIP地址配置
    }
    track_script {
       chk_nginx
    }
    #调用脚本
    notify_master "/etc/keepalived/notify.sh master"
    notify_backup "/etc/keepalived/notify.sh backup"
    notify_fault "/etc/keepalived/notify.sh fault"

}

还有以下脚本,进行keepalived的检测和nginx启动

#!/bin/bash
#
vip=172.16.123.123
contact='root@localhost'
#定义收件人
notify(){
        mailsubject="`hostname` to be $1:$vip floating"
        #主题
        mailbody="`date '+%F %H:%M:%S'`:vrrp transition,`hostname` changed to be $1"
        #主体
        echo ${mailbody} | mail -s "$mailsubject" $contact
}


case "$1" in
        master)
                notify master
                systemctl restart nginx.service
                #不管主备,都要重启nginx服务,保证nginx在线
                exit 0
        ;;
        backup)
                notify backup
                systemctl restart nginx.service
                exit 0
        ;;
        fault)
                notify fault
                exit 0
        ;;
        *)
                echo "Usage:`basename $0` {master|backup|fault}"
                exit 1
        ;;
esac

备用nginx配置相同,脚本和配置文件都直接拷贝到备用主机,只需要修改keepalived的部分配置文件

state BACKUP
#修改为备用主机
priority 98
#优先级降低
#脚本需要定义,这样才能实现高可用

三、扩展,双主模型

双主模型的时候,不要再脚本中加入nginx启动命令,这样会导致很多正常用户的连接丢失

双主模型参考:

需要注意的几个地方是虚拟路由id,主备,网卡,认证字符和优先级;同时双主模型有session保持的问题,这个问题最好的方法是做session服务(生产环境常用)

Hello World

最后修改:2019 年 10 月 18 日 10 : 31 AM
如果觉得我的文章对你有用,请随意赞赏