基于keepalived实现Director、ipvs、Nginx的高可用以及Nginx的双主模型

      Keepalived的作用是检测web服务器的状态,如果有一台web服务器死机,或工作出现故障,Keepalived将检测到,并将有故障的web服务器从系统中剔除,当web服务器工作正常后Keepalived自动将web服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的web服务器。

主要用作RealServer的健康状态检查以及LoadBalance主机和BackUP主机之间failover的实现。

      keepalived的安装:

yum -y install keepalived

keepalived的配置文件分三段:

# vim/etc/keepalived/keepalived.conf

  全局配置:


global_defs {
   notification_email {      
   root@localhost  ----->邮件通知给谁
   }
   notification_email_from [email protected]
   smtp_server 172.16.249.224  ---->从那个服务器上发出的邮件
   smtp_connect_timeout 30     ---->连接超时时间
   router_id LVS_DEVEL         ---->路由器的标识
}

   VRRP实例配置

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51  ---虚拟路由ID号,来源于Vmack的最后一段。不能大于255 ID定义号mack就定义好了
    priority 100          ---优先级
    advert_int 1          ---通告时间间隔
    authentication {      ---认证
        auth_type PASS
        auth_pass 1111
    }
   virtual_ipaddress {   ---虚拟地址VIP
       IPADDR/MASK[vip及其子网掩码] brd <IPADDR>[广播地址] dev[配置在那个网卡接口]
       scope [网卡的生效范围] label [网卡别名ip addr配置,ip addr show 查看]
      示例: 192.168.2.110/24 255.255.255.255 dev eth0 label eth0:0
    }
}

    ipvs规则的配置:


virtual_server 192.168.200.100 443 {  --->Director ip 和端口
    delay_loop 6
    lb_algo rr   --->调度方法
    lb_kind NAT  --->NAT模式
    nat_mask 255.255.255.0
    persistence_timeout 50
    protocol TCP ---协议
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             
    real_server 192.168.201.100 443 {  --->Real Server ip 和端口
        weight 1  --->权重
        SSL_GET { ---获取方法
            url {
              path /
              digest ff20ad2481f97b1754ef3e12ecd3a9cc --->针对那个页面做摘要检测
            }
            url {
              path /mrtg/
              digest 9b3a0c85a887a256d6939da88aabd8cd
            }
            connect_timeout 3 --->连接超时时间
            nb_get_retry 3    --->连接次数
            delay_before_retry 3  --->到下一次连接的延迟时长
        }
    }
}

   一:Director Server 高可用的配置:

    主节点的配置:


global_defs {
   notification_email {
   root@localhost
   }
   notification_email_from admin@localhost
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       
vrrp_instance VI_1 {
    state MASTER
    interface eth1
    virtual_router_id 35
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
   192.168.2.100

    从节点配置:

global_defs {
   notification_email {
   root@localhost
   }
   notification_email_from admin@localhost
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                
vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 35
    priority 99
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.2.100

    主节点启动keepalive  

# service keepalived start

   查看日志信息  

# tail -f /var/log/messages

wKioL1NectrzQx8RAAOs-Wxlncc261.jpgwKiom1Necz6xFJdZAAJcbaOKXII973.jpg

   查看网卡配置信息:

# ip addr show

wKiom1Nec4nRm612AAP-ZS8IvC8060.jpg

   启动从节点:查看日志信息:    wKiom1NedEmQhGW8AAcDwAOIGMY196.jpg

   我们停止掉主节点服务查看VIP是否会转移到从节点,以及从节点BACKUP-MASTER的转换。

# service keepalived stop

   查看从节点的日志信息:

wKiom1NedSLB0qRLAANo3TzQj9M415.jpg

   查看从节点的IP配置信息:

wKioL1NedcOCP2xaAARUnG__t4Y549.jpg

   当我们开启主节点keepalived服务的时候,VIP会转换回主节点,并提升为MASTER模式,从节点会降为BACKUP,因为主节点的优先级比从节点的优先级高,keepalived默认工作模式是抢占模式。

   主节点的健康状态检测,我们可以基于脚本以及脚本追踪机制来实现,并完成资源转移

   在globle添加如下项:


vrrp_script chk_keepalived_down {
   script "[[ -e /etc/keepalived/down ]] && exit 1 || exit 0"
   interval 1
   weight -2
   }

   在配置实例添加脚本追踪:


track_script {
        chk_keepalived_down
    }

   当我们在/etc/keepalived/目录下创建down文件的时候主节点就会降低优先级,这样就会被从节点强占MASTER并转移VIP资源。

   注意:从节点也是相同的配置


wKiom1NefIqjZRgyAATJHLyhp3A637.jpg

wKioL1NefGDQlR0tAAMfWTzBJhA302.jpg

    keepalived状态转换时的通知机制的实现:  

    通常在vrrp_instance VI_1 {

    }中使用脚本实现

    也可以用在vrrp_sync_group{

    }中

    第一种方法:

    # to MASTER transition

    notify_master /path/to_master.sh

    # to BACKUP transition

    notify_backup /path/to_backup.sh

    # FAULT transition

    notify_fault "/path/fault.sh VG_1"

   可以分别写三个状态模式的脚本,并在track_script {

   }脚本中定义追踪。

   第二种方法:一个脚本接受3个参数:

   # $1 = "GROUP"|"INSTANCE"

   # $2 = name of group or instance

   # $3 = target state of transition

   #     ("MASTER"|"BACKUP"|"FAULT")

   notify /path/notify.sh


 $1 引用当前的组或实例,明确说明这是那一个实例。对那一个实例中的节点状态转换进行监控。要定义你是选择的是group还是instance

 $2:组或实例的名称

 $3:说明是转换成什么状态通知的。

 脚本示例: 两个节点都需要配置:

vip=192.168.2.100
contact='root@localhost'
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             
notify() {
    mailsubject="`hostname`became $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
        exit 0
    ;;
    backup)
        notify backup
        exit 0
    ;;
    fault)
        notify fault
        exit 0
    ;;
esac

   别忘了给脚本一个执行权限:

# chmod +x notify.sh

  执行脚本./notify.sh

  查看邮件mail

wKiom1Nehw_wivVLAATB9YhBxGY335.jpg   接着我们把写好的脚本定义实例配置中:


vrrp_instance VI_1 {
    state MASTER
    interface eth1
    virtual_router_id 35
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
 track_script {
        chk_keepalived_down
    }
    notify_master "/etc/keepalived/notify.sh master"
    notify_backup "/etc/keepalived/notify.sh backup"
    notify_fault "/etc/keepalived/notify.sh fault"
    virtual_ipaddress {
   192.168.2.100
}

   检测是否会有通知:  

# touch down
# mail

wKioL1NejLGwExxGAARdAfoPWbY392.jpg

   二:N基于keepalived实现ipvs的配置实现:

   配置文档简介:

1:virtual_server的相关配置:
# virtual_server IP port        ---基于ip
# virtual_server fwmark int     ---基于防火墙标记,实现用iptables 写好规则,打好标记
# virtual_server group string   ---多个虚拟机定义一个组,把一个组定义成一个虚拟服务需要一同转移。
# lb_algo rr|wrr|lc|wlc|sh|dh   ---负载均衡的调度方法
# lb_kind NAT|DR|TUN            ---LVS的模式
# persistence_timeout           ---持久连接的时间
# protocol TCP                  ---协议
# sorry_server ipaddr port      ---所有Real Server全挂掉以后提供网页的Server
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    
 2:Real Server的相关配置:
#    weight 1                   ---权重
#    notify_up
#    nptify_down                ---当这个Real Server UP或者DOWN了发送的通知脚本
#   SSL_GET|HTTP_GET|TCP_CHECK|SMTP_CHECK|MISC_CHECK   ---健康状态检测机制
# connect_timeout 3            ---连接超时时间
# nb_get_retry 3               ---连接尝试次数
# delay_before_retry 3         ---到下一次连接时的延迟时间

    配置思路:

    1:定义virtual_server的VIP 端口,子网掩码,协议。

    2:Real Server的real ip,端口,健康检查机制。

    3:别的选项可以默人,也可以根据实际情况进行修改。

    配置实例:

virtual_server 192.168.2.100 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    nat_mask 255.255.0.0
    persistence_timeout 50
    protocol TCP
    real_server 192.168.2.120 80 {
        weight 1
        HTTP_GET {
            url {
              path /
            status_code 200
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

    安装ipvsadm查看效果

# yum -y install ipvsadm
# ipvsadm -L -n

wKioL1NfqQngZKCfAAGlEVU8IxM324.jpg  三:Nginx的高可用

     基于通知脚本实现:

     让脚本中状态转换的时候顺便执行nginx服务的启动脚本即可

#!/bin/bash
# Author: MageEdu <[email protected]>
# description: An example of notify script
#
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             
vip=192.168.2.100
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
        /etc/rc.d/init.d/nginx start
        exit 0
    ;;
    backup)
        notify backup
        /etc/rc.d/init.d/nginx stop
        exit 0
    ;;
    fault)
        notify fault
        /etc/rc.d/init.d/nginx stop
        exit 0
    ;;
    *)
     echo 'Usage:`basename $0` {master|backup|fault}'
       exit 1
    ;;
esac

   测试:

   1:提供两个不同的Nginx测试页面:

   从节点:192.168.2.115的测试页面

wKiom1NfzrmimV0vAABdTq07ya4261.jpg

   主节点:192.168.2.113的测试页面

wKioL1Nfzsqj3rCeAABn5TBwZ_s907.jpg

   2:启动双节点的keepalived,并在主节点启动Nginx服务,访问页面

wKiom1Nfz8WjTAHRAABZWnAhLZI206.jpg


   3:在主节点/etc/keepalived/创建down文件,让主节点的keepalived停止服务,在访问页面

wKioL1Nf0DzyOj1RAAYakYGifuM307.jpg   可以看到主节点的VIP和80端口都不在了。在看从节点:

wKiom1Nf0Qaip-cCAAVPQFXEXL0479.jpg    可以看到VIP已转移,80端口已启用,我们访问网页测试:

wKiom1Nf0WThCT6aAABXO34kDrA116.jpg

  基于服务的健康检测监控,当Nginx服务停止以后实现的转移

  监控脚本:通过访问站点主页面获取相应码来实现服务健康检测。

  第一个节点

#!/bin/bash
url="http://192.168.2.100/index.html"
status=$(/usr/bin/curl -s --head "$url" | awk '/HTTP/ {print $2}')
if [ "$status" != "200" ]; then
/etc/init.d/keepalived stop
fi

   keepalived.conf的配置信息:

vrrp_script chk_nginx {
   script "/etc/keepalived/check_nginx.sh"
   interval 1
   weight -2
}
vrrp_instance Nginx_1 {
    state MASTER
    interface eth0
    virtual_router_id 35
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
track_script {
        chk_nginx
        chk_keepalived
    }
    virtual_ipaddress {
      192.168.2.200
    }
}
                                                                                                                                             
vrrp_instance Nginx_2 {
    state BACKUP
    interface eth0
    virtual_router_id 36
    priority 50
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
                                                                                                                                             
    virtual_ipaddress {
      192.168.2.222
    }
}

    第二个节点:

    脚本配置:  

#!/bin/bash
url="http://192.168.2.115/index.html"
status=$(/usr/bin/curl -s --head "$url" | awk '/HTTP/ {print $2}')
if [ "$status" != "200" ]; then
/etc/init.d/keepalived stop
fi

   第二节点keepalived。conf的配置信息:


vrrp_script chk_nginx {
   script "/etc/keepalived/check_nginx.sh"
   interval 1
   weight -2
}
vrrp_instance Nginx_1 {
    state BACKUP
    interface eth0
    virtual_router_id 35
    priority 50
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.2.200
                                                                                                            
                                                                                                            
    }
}
                                                                                                            
vrrp_instance Nginx_2 {
    state MASTER
    interface eth0
    virtual_router_id 36
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
track_script {
       chk_nginx
       chk_keepalived
}
    virtual_ipaddress {
        192.168.2.222
   }
    }
track_script {
       chk_nginx
       chk_keepalived
}
    virtual_ipaddress {
        192.168.2.222
   }
}


wKiom1NgwVvx9piGAARV-5_n6KU705.jpg

wKioL1NgwTHQxMtCAARSIgo70fs924.jpg

   我们kill掉一个节点的Nginx务:查看转移情况:


wKiom1NgwiGBCNpzAASpQeEFyHo637.jpg

wKioL1NgwffyCjcXAASYs7Ek3Zk491.jpg

   双主模式其实就是配置两个vrrp_instance 互为主备,需要提醒大家的是基于服务脚本的访问ip一定是本机的真实ip而不是virtual ip。OK,基于keepalive 实现的lvs nginx 以及双主模式nginx的高可用已全部实现。












你可能感兴趣的:(nginx,nginx高可用,ipvsHA,Drictor,ipvs高可用,Nginx双主,NginxHA)