• keepalived实现nginx反向代理的高可用


    keepalived实现nginx反向代理的高可用

     

    实现keepalived调用脚本进行资源监控

    keepalived调用外部的辅助脚本进行资源监控,并根据监控的结果状态能实现优先动态调整

    vrrp_script:自定义资源监控脚本,vrrp实例根据脚本返回值,公共定义,可被多个实例调用,定义在vrrp实例之外

    track_script:调用vrrp_script定义的脚本去监控资源,定义在实例之内,调用事先定义的vrrp_script
    分两步:(1) 先定义一个脚本;(2) 调用此脚本

    1
    2
    3
    4
    5
    6
    7
    8
    9
    vrrp_script <SCRIPT_NAME> {
      script ""
      interval INT
      weight -INT
    }<br>
    track_script {
      SCRIPT_NAME_1
      SCRIPT_NAME_2
    }

    1、环境搭建:

    类型

    机器名称

    IP配置

    服务角色

    A

    client

    192.168.37.7

    客户端访问(桥接模式)

    C

    lvs-server1

    VIP:192.168.37.100

    DIP:192.168.37.17

    负载均衡调度器(NAT模式)

    D

    lvs-server2

    VIP:192.168.37.100

    DIP:192.168.37.27

    负载均衡调度器(NAT模式)

    E

    rs1

    RIP:192.168.37.37

    后端服务器(NAT模式)

    F

    rs2

    RIP:192.168.37.47

    后端服务器(NAT模式)

    2、在keepalived主服务器配置

     配置keepalived服务

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    [root@centos17~]#yum install keepalived
    [root@centos17~]#vim /etc/keepalived/keepalived.conf
    global_defs {
        notification_email {
        974212253@qq.com  接收邮箱地址
       }
        notification_email_from www.magedu.net   从哪个邮箱发送
        smtp_server 127.0.0.1   本地IP地址
        smtp_connect_timeout 30
        router_id ka1    本地的主机名
        vrrp_skip_check_adv_addr
        vrrp_garp_interval 0
        vrrp_gna_interval 0
    }
    vrrp_script chk_down {
        script "/etc/keepalived/test.sh"   调用本地脚本test.sh
        interval 1
        weight -30    权重减30
    }
     
    vrrp_script chk_nginx {
        script "/etc/keepalived/check_nginx.sh"  调用本地脚本check_nginx.sh
        interval 1
        weight -30    权重减30
    }
     
    vrrp_instance VI_1 {
        state MASTER   本机的主节点
        interface ens33  本机的网卡名称
        virtual_router_id 66  本机路由ID号
        priority 100   本机keepalived优先级
        unicast_src_ip 192.168.37.17  # 配置源地址的IP地址,绑定单播地址的目的是为了防止与其他主机的IP地址存在冲突问题。
        unicast_peer {
           192.168.37.27   # 配置从节点的目标IP地址
        }  
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 123456  密码
        }
        virtual_ipaddress {
            192.168.37.100/24 dev ens33 label ens33:1  添加一个VIP地址
        }
        track_script {
            chk_down  对宕机进行检查
        }
        track_script {
            chk_nginx 对nginx进行检查
        }
        notify_master "/etc/keepalived/notify.sh master"  调用脚本,返回当前keepalived状态信息:master
        notify_backup "/etc/keepalived/notify.sh backup"  返回backup信息
        notify_fault "/etc/keepalived/notify.sh fault"    返回fault信息
    }                    
     
    [root@centos17~]#systemctl start keepalived

     配置主节点nginx服务,配置完成之后启动nginx服务:nginx

      yum install nginx -y  安装nginx服务包

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    [root@centos17~]#vim /etc/nginx/nginx.conf
        upstream websrvs{
            server 192.168.37.37:80;
            server 192.168.37.47:80;
    }
     
    server  {
        listen 80;                                                                                                                                  
        server_name www.magedu.net;
        root /data/site1;
        index index.html;
        location /  {
            proxy_pass http://websrvs;
        }

     

    在keepalived主节点创建脚本

    在keepalived主节点创建一个检查nginx状态脚本

    1
    2
    3
    4
    [root@centos17keepalived]#vim check_nginx.sh
    #!/bin/bash
    killall -0 nginx &> /dev/null || exit 1  检查此时的nginx服务进程是否正常,如果非0(死机),就会执行退出显示1。
    [root@centos17]#chmod +x check_nginx.sh   添加执行权限

    当keepalived服务器宕机时,在keepalived主节点创建一个降优先级脚本。

    1
    2
    3
    4
    5
    [root@centos17keepalived]#vim test.sh
    #!/bin/bash
    [ -f /etc/keepalived/down ] && exit 1 || exit 0   判断/etc/keepalived/目录下是否有down文件,如果有就返回1,没有就返回0
     
    [root@centos17keepalived]#chmod +x test.sh    加上执行权限

     当nginx停止服务或者死机时,此时nginx服务器变成从节点,检测到主节点变成从节点后,此脚本就会提示主节点变为从节点,返回backup,就会重新启动nginx服务,又会抢占从节点nginx服务,变成主节点。

      实现脚本如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    [root@centos17keepalived]#vim notify.sh
    #!/bin/bash
    contact='root@localhost'
    notify() {
            mailsubject="$(hostname) to be $1, vip floating"
            mailbody="$(date +'%F %T'): vrrp transition, $(hostname) changed to be $1"
            echo "$mailbody" | mail -s "$mailsubject" $contact
    }
    case $1 in
    master)
            notify master
            ;;
    backup)
            notify backup
            systemctl restart nginx   当主节点的nginx宕机之后,返回backup,就会有重启nginx,又抢回主节点位置,继续为客户端提供服务。
            ;;
    fault)
            notify fault
            ;;
    *)
            echo "Usage: $(basename $0) {master|backup|fault}"
            exit 1
            ;;
    esac

    3、在keepalived从服务器配置

    在keepalived从服务器上配置相关文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    [root@centos27~]#vim /etc/keepalived/keepalived.conf
    global_defs {
       notification_email {
         974212253@qq.com
       }
       notification_email_from ka1@magedu.net
       smtp_server 127.0.0.1
       smtp_connect_timeout 30
       router_id ka2
       vrrp_skip_check_adv_addr
       vrrp_garp_interval 0
       vrrp_gna_interval 0
    }
    vrrp_script chk_down {
        script "/etc/keepalived/test.sh"
        interval 1
        weight -30
    }
    vrrp_script chk_nginx {
        script "/etc/keepalived/check_nginx.sh"
        interval 1
        weight -30   
    }
     
    vrrp_instance VI_1 {
        state BACKUP
        interface ens33
        virtual_router_id 66
        priority 80
        unicast_src_ip 192.168.37.27  配置从节点的IP地址
        unicast_peer {
           192.168.37.17  配置主节点的目标IP地址
        }
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 123456
        }
        virtual_ipaddress {
            192.168.37.100/24 dev ens33 label ens33:1
        }
        track_script {
            chk_down
        }
        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"
    }

     配置从节点的nginx服务,配置完成之后启动nginx服务:nginx 

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    [root@centos17~]#vim /etc/nginx/nginx.conf
        upstream websrvs{
            server 192.168.37.37:80;
            server 192.168.37.47:80;
    }
     
    server  {
        listen 80;                                                                                                                                  
        server_name www.magedu.net;
        root /data/site1;
        index index.html;
        location /  {
            proxy_pass http://websrvs;
        }

    在keepalived从节点创建脚本

    在keepalived从节点创建一个检查nginx状态脚本

    1
    2
    3
    4
    [root@centos17keepalived]#vim check_nginx.sh
    #!/bin/bash
    killall -0 nginx &> /dev/null || exit 1  检查此时的nginx服务进程是否正常,如果非0(死机),就会执行退出显示1。
    [root@centos17]#chmod +x check_nginx.sh   添加执行权限

    当keepalived服务器宕机时,在keepalived从节点创建一个降优先级脚本。

    1
    2
    3
    4
    5
    [root@centos17keepalived]#vim test.sh
    #!/bin/bash
    [ -f /etc/keepalived/down ] && exit 1 || exit 0   判断/etc/keepalived/目录下是否有down文件,如果有就返回1,没有就返回0
     
    [root@centos17keepalived]#chmod +x test.sh    加上执行权限

      此时nginx从节点服务器变成主节点。

      创建完成之后加上执行权限,实现脚本如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    [root@centos17keepalived]#vim notify.sh
    #!/bin/bash
    contact='root@localhost'
    notify() {
            mailsubject="$(hostname) to be $1, vip floating"
            mailbody="$(date +'%F %T'): vrrp transition, $(hostname) changed to be $1"
            echo "$mailbody" | mail -s "$mailsubject" $contact
    }
    case $1 in
    master)
            notify master
            ;;
    backup)
            notify backup
            systemctl restart nginx  
            ;;
    fault)
            notify fault
            ;;
    *)
            echo "Usage: $(basename $0) {master|backup|fault}"
            exit 1
            ;;
    esac

    后端http服务器上创建网页

    在两个后端服务器上创建网页,作为测试效果使用。

    1
    2
    3
    4
    5
    6
    [root@cenots47~]#yum install httpd  -y
    [root@cenots47~]#echo 192.168.37.47 > /var/www/html/index.html
    [root@cenots47~]#systemctl start httpd
    [root@cenots37~]#yum install httpd  -y
    [root@cenots37~]#echo 192.168.37.37 > /var/www/html/index.html
    [root@cenots37~]#systemctl start httpd

    客户端验证效果

    在客户端修改hosts配置文件,并测试效果,如果主keepalived服务器宕机了,VIP地址就会漂移到从节点上去,继续运行nginx服务,不会影响用户访问效果。

     vim /etc/hosts

     

    1
    2
    3
    4
    5
    6
    [root@centos7network-scripts]#while true;do  curl 192.168.37.100;sleep 0.5;done
    192.168.37.47
    192.168.37.47
    192.168.37.37
    192.168.37.47
    192.168.37.37

      当主节点的nginx服务器死机了,此时的VIP地址会临时漂移到从节点上,当脚本检测到主节点的nginx服务死机后,就会重新启动nginx服务,将VIP地址就会从从节点服务器抢过来,继续作为主节点为客户端进行服务。

     测试如下:

    1、杀掉主节点的nginx服务

    1
    [root@centos17keepalived]#killall nginx

     2、在http后端服务器上监控多播地址,此时可以看到主节点的优先级由100降到70,然后从节点的优先级80进行为客户端提供服务,由于有脚本检测主节点返回了backup,就会重新启动nginx,此时主节点就又会将优先级变回100,将从节点的服务抢占回来。

     3、在客户端进行查看效果,当主节点的nginx死机后,重启nginx后就会又为客户端进行服务。

     
  • 相关阅读:
    题目:输入一个链表,从尾到头打印链表每个节点的值
    【转】 文档与笔记利器 reStructuredText 和 Sphinx
    自动化selenium开发
    Sublime 3 打造成 Python/Django IDE开发利器
    python中的StringIO模块
    python检查IP地址正确性
    python2.7 使用super关键词 报错 TypeError: must be type, not&n
    【转】python time模块详解
    [黑群晖经典教程] 一步一步建立自己的黑群晖
    【转】NAS群晖DSM 5.0-4458安装教程
  • 原文地址:https://www.cnblogs.com/yaoyangding/p/15573147.html
Copyright © 2020-2023  润新知