zoukankan      html  css  js  c++  java
  • keepalived nginx 双机热备图文讲解

    原文:http://blog.csdn.net/wanglei_storage/article/details/51175418

    keepalived nginx 双机热备实战精讲

    在试验之前先贴张图上来,大致说下具体的需求及环境(注:实验所用到的脚本在文章末尾,如果在过程中遇到可以先看脚本)

    环境: 
    VIP(漂移地址):192.168.1.60-192.168.1.61 
    nginx-1:192.168.1.50 
    nginx-2:192.168.1.51

    关闭 iptables、关闭selinux 并且打通ssh配置,使得192.168.1.50和192.168.1.51可以免密码登录(主要同于同步 nginx 配置和 reload, 公钥验证文件:authorized_keys)

    需求:

    两只 nginx web 服务器分别提供相同的访问,当一只主机无法提供服务(keepalived 、nginx 或者说主机宕机)后,另一只马上转换为MASTER状态,并且继承VIP,继续向用户提供服务。

    1、如果 keepalived 状态转换为 MASTER,则发送邮件进行通知运维人员(由下面 keepalived_check.sh 脚本实现) 
    2、需要nginx两台服务器提供的服务是完全一致的,并且当一台 nginx 的配置改变,则另一台立刻变为相同的配置,并且 reload 。(由 rsync+inotify 实时同步脚本 nginx_rsync.sh 脚本实现) 
    3、如果keepalived 挂掉,则检测并且重启keepalived;如果nginx 挂掉,则关闭keepalived,且让VIP转移到 keepalived-slave上面(由 nginx_check.sh脚本实现)

    这里写图片描述


    下面开始实验:

    一、nginx-1(master 主机配置)

    1、时间校准 
    ntpdate ntp.api.bz

    2、安装依赖软件 
    yum -y install openssl openssl-devel kernel-devel

    3、使用inotify机制,还需要安装inotify-tools工具,以便提供inotifywait,inotifywatch辅助工具,用来监控,汇总改动情况 
    yum -y install inotify-tools

    4、准备 keepalived 和 nginx 包(keepalived 包可以去 keepalived.org 下载,nginx 包则去 tengine 官方下载)

    这里写图片描述

    5、解包、编译安装

    tar zxf keepalived-1.2.20.tar.gz -C /usr/local/src/
    cd /usr/local/src/keepalived-1.2.20/
    ./configure --prefix=/usr/local/keepalived --with-kernel-dir=/usr/src/kernels/2.6.32-573.22.1.el6.x86_64/
    make && make install

    这里写图片描述

    6、拷贝配置文件

    mkdir -p /etc/keepalived 
    cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/ 
    cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/ 
    cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/ 
    cp /usr/local/keepalived/sbin/keepalived /usr/sbin/

    7、创建脚本文件及目录(脚本我会在尾部添加)

    三个脚本,分别为 keepalived 脚本脚本、nginx 检测脚本、nginx 同步脚本

    mkdir -p /data/sh
    
    touch /data/sh/keepalived_check.sh
    touch /data/sh/nginx_check.sh
    touch /data/sh/nginx_rsync.sh
    
    chmod +x /data/sh/keepalived_check.sh
    chmod +x /data/sh/nginx_check.sh
    chmod +x /data/sh/nginx_rsync.sh

    8、安装 mailx 包,用于发送邮件 
    yum -y install mailx

    编辑 /etc/mail.rc 文件,在尾部添加两行:

    这里写图片描述

    9、keepalived 配置文件:

    ! Configuration File for keepalived
    
    ############################ 全局配置 #############################
    
    global_defs {
    
    # 定义管理员邮件地址,表示keepalived在发生诸如切换操作时需要发送email通知,以及email发送给哪些邮件地址,可以有多个,每行一个
        notification_email {
            hongxue@showjoy.com
        }
    
    # 表示发送通知的邮件源地址是谁
        notification_email_from keepalived@showjoy.com
    
    # smtp服务器配置
        smtp_server 127.0.0.1
        smtp_connect_timeout 30
    
    # router_id 则为机器标识
        router_id keepalived_1
    
    #   vrrp_skip_check_adv_addr
    #   vrrp_strict
    
    }
    
    ############################ VRRPD配置 #############################
    
    # 定义nginx_check脚本,脚本执行间隔10秒,权重10
    #vrrp_script nginx_check {
    #    script "/data/sh/nginx_check.sh"
    #    interval 10
    #    weight 10
    #}
    
    
    # 定义vrrp实例
    vrrp_instance http {
    
    # state定义instance的初始状态
        state BACKUP
    
    # 实际绑定的网卡,配置虚拟IP的时候必须是在已有的网卡上面添加的
        interface eth0
    
    # 要检测状态的网卡,当其中任意一块出现故障时keepalived都视为故障
        track_interface {
            eth0
    #       eth1
        }
    
    # 当该keepalived切换为MASTER状态时,执行下面的脚本
        notify_master /data/sh/keepalived_check.sh
    
    # 这里设置VRID,相同的VRID为一个组,他将决定多播的MAC地址
        virtual_router_id 51
    
    # 设置本节点优先级,高的为MASTER,如果优先级一样,则IP地址大的是MASTER
        priority 200
    
    # 组播信息发送间隔,两个节点设置必须一样
        advert_int 10
    
    # 验证方式与验证密码
        authentication {
            auth_type PASS
            auth_pass 1111
        }
    
    # 这里设置VIP,它随着state变化而增加删除,当state为master的时候就添加,当state为backup的时候则删除,由优先级决定,可以设置多个地址
        virtual_ipaddress {
            192.168.1.60
            192.168.1.61
        }
    
    # 设置不抢占,这里只能设置在state为backup的节点上,而且这个节点的优先级必须别另外的高
    #    nopreempt
    
    # 执行nginx检测脚本
    #    track_script {
    #        nginx_check weight 10
    #    }
    
    }

    10、nginx 配置

    安装nginx依赖 
    yum -y install pcre-devel pcre openssl-devel openssl

    解包,编译安装 
    tar zxf tengine-2.1.2.tar.gz -C /usr/local/src/ 
    cd /usr/local/src/tengine-2.1.2/

    ./configure –prefix=/usr/local/nginx 
    make && make istall

    11、启动nginx、启动脚本分别为:nginx_check.sh nginx_rsync.sh(可以看到,nginx 和 两个脚本都已经启动)

    这里写图片描述

    12、启动 keepalived

    这里写图片描述

    13、查看日志(可以看到,keepalived已经启动,并且成功绑定了 VIP 192.168.1.60和61)

    这里写图片描述

    14、查看网卡 IP 地址(除了自身IP地址以外、VIP也已经绑定)

    这里写图片描述

    15、通过VIP访问nginx

    这里写图片描述


    二、nginx-2(slave 主机配置)

    1、前1-8步骤 nginx-1 和 nginx-2 是一样的,照着以前做就行,这里主要帖下 nginx-2 的 keepalived.conf 配置

    2、keepalived 配置文件

    ! Configuration File for keepalived
    
    ############################ 全局配置 #############################
    
    global_defs {
    
    # 定义管理员邮件地址,表示keepalived在发生诸如切换操作时需要发送email通知,以及email发送给哪些邮件地址,可以有多个,每行一个
        notification_email {
            hongxue@showjoy.com
        }
    
    # 表示发送通知的邮件源地址是谁
        notification_email_from keepalived@showjoy.com
    
    # smtp服务器配置
        smtp_server 127.0.0.1
        smtp_connect_timeout 30
    
    # router_id 则为机器标识
        router_id keepalived_1
    
    #   vrrp_skip_check_adv_addr
    #   vrrp_strict
    
    }
    
    ############################ VRRPD配置 #############################
    
    # 定义vrrp脚本,脚本执行间隔10秒,权重10
    #vrrp_script nginx_check {
    #    script "/data/sh/nginx_check.sh"
    #    interval 10
    #    weight 10
    #}
    
    
    # 定义vrrp实例
    vrrp_instance http {
    
    # state定义instance的初始状态
        state BACKUP
    
    # 实际绑定的网卡,配置虚拟IP的时候必须是在已有的网卡上面添加的
        interface eth0
    
    # 要检测状态的网卡,当其中任意一块出现故障时keepalived都视为故障
        track_interface {
            eth0
    #       eth1
        }
    
    # 当该keepalived切换为MASTER状态时,执行下面的脚本
        notify_master /data/sh/keepalived_check.sh
    
    
    # 这里设置VRID,相同的VRID为一个组,他将决定多播的MAC地址
        virtual_router_id 51
    
    # 设置本节点优先级,高的为MASTER,如果优先级一样,则IP地址大的是MASTER
        priority 200
    
    # 组播信息发送间隔,两个节点设置必须一样
        advert_int 10
    
    # 验证方式与验证密码
        authentication {
            auth_type PASS
            auth_pass 1111
        }
    
    # 这里设置VIP,它随着state变化而增加删除,当state为master的时候就添加,当state为backup的时候则删除,由优先级决定,可以设置多个地址
        virtual_ipaddress {
            192.168.1.60
            192.168.1.61
        }
    
    # 设置不抢占,这里只能设置在state为backup的节点上,而且这个节点的优先级必须别另外的高
    #   nopreempt
    
    # 执行nginx_check叫测脚本
    #    track_script {
    #        nginx_check weight 10
    #    }
    
    }

    3、nginx 配置

    安装nginx依赖 
    yum -y install pcre-devel pcre openssl-devel openssl

    解包,编译安装 
    tar zxf tengine-2.1.2.tar.gz -C /usr/local/src/ 
    cd /usr/local/src/tengine-2.1.2/

    ./configure –prefix=/usr/local/nginx 
    make && make istall

    4、启动nginx、启动 nginx_check.sh(nginx_rsync.sh 不必启动,因为只需配置一个nginx,则另一个也会自动同步并且 reload)

    这里写图片描述

    5、启动 keepalived 并查看日志

    这里写图片描述


    三、故障及需求演练

    1、当 keepalived 挂掉,那么理论上说 keepalived 服务会重新启动起来(通过nginx_check.sh 脚本实现)

    在下图中可以看到,我第一次 status 之后 keepalived 的状态是 running的,当我执行 stop 之后 keepalived 马上变为 stopped 状态,可过会之后 keepalived 状态又变为 running

    这里写图片描述

    2、当 nginx 挂掉后,那么理论上说 keepalived 服务也会关闭(通过nginx_check.sh 脚本实现)

    在下图中可以看到,第一次我 status 的时候 keepalived 的状态是 running… 的,nginx 进程也在,当我 killall 掉 nginx 之后,前三秒 keepalived 的状态还是 running… 接着马上停止该服务(脚本检测时间为10秒一次)

    这里写图片描述

    3、当 keepalived 状态变为 Master 之后,发送邮件(通过 keepalived_check.sh 脚本实现)

    在第一个问题中,我停止 keepalived 服务,那么这时候 slave 就会将状态转换为 master,则相应的,我也会收到报警邮件或者短信

    这里写图片描述

    这里写图片描述

    4、当 nginx-1 配置改动之后,nginx-2 的配置也会相应的更改,并且 reload (通过 nginx_rsync.sh 脚本实现)

    我在nginx-1上面执行下列命令,接着我们查看nginx-1和nginx-2的 /usr/local/nginx/html/index.html的配置信息和改动时间

    这里写图片描述

    由下图可以发现 nginx-1 的 index.html 和 nginx-2 的 index.html 改动时间完全相同,并且配置也完全相同。

    这里写图片描述

    这里写图片描述


    四、实验脚本

    1、keepalived_check.sh 脚本(执行方式:keepalived.conf 中配置)

    #!/bin/bash
    time=$(date +%Y-%m-%d-%H-%M)
    echo “$time keepalived-1 is a down,keepalived-2 is a MASTER”|mail -s keepalived_down xxx@xxx.com
    echo “$time keepalived-1 is a down,keepalived-2 is a MASTER”|mail -s keepalived_down xxx@xxx.com

    2、nginx_check.sh 脚本(执行方式:后台,nohup sh nginx_check.sh &)

    #!/bin/bash
    
    while  :
    do
    
    # 获取nginx、keepalived的进程数
    nginxcheck=`ps -C nginx --no-header | wc -l`
    keepalivedcheck=`ps -C keepalived --no-header | wc -l`
    
    # 如果检测到(nginx)进程数等于0,并且(keepalived)进程数不等于0,则关闭(keepalived)
    if [ $nginxcheck -eq 0 ];then
        if [ $keepalivedcheck -ne 0 ];then
            killall -TERM keepalived
        else
            echo "keepalived is stoped"
        fi
    
    # 如果检测到(nginx)进程数不等于0,则(keepalived)进程数等于0,那么启动keepalived服务
    else
        if [ $keepalivedcheck -eq 0 ];then
            /etc/init.d/keepalived start
        else
            echo "keepalived is running"
        fi
    fi
    
    sleep 10
    done

    3、nginx_rsync.sh 脚本(执行方式:后台,nohup sh nginx_rsync.sh 该脚本只有一只主机在后台执行)

    #!/bin/bash
    
    ip_address="192.168.1.51"
    
    inotify_cmd="inotifywait -mrq -e modify,create,attrib,move,delete /usr/local/nginx/"
    rsync_cmd="rsync -azH --delete /usr/local/nginx/ root@${ip_address}:/usr/local/nginx/"
    
    $inotify_cmd | while read DIRECTORY EVENT FILE
    do
        if [ $(pgrep rsync | wc -l) -le 0 ];then
            $rsync_cmd
            ssh root@${ip_address} "/usr/local/nginx/sbin/nginx -t"
            if [ $? -eq 0 ];then
                ssh root@${ip_address} "/usr/local/nginx/sbin/nginx -s reload"
            fi        
        fi
    done

    keepalived nginx 双机热备实战精讲

    在试验之前先贴张图上来,大致说下具体的需求及环境(注:实验所用到的脚本在文章末尾,如果在过程中遇到可以先看脚本)

    环境: 
    VIP(漂移地址):192.168.1.60-192.168.1.61 
    nginx-1:192.168.1.50 
    nginx-2:192.168.1.51

    关闭 iptables、关闭selinux 并且打通ssh配置,使得192.168.1.50和192.168.1.51可以免密码登录(主要同于同步 nginx 配置和 reload, 公钥验证文件:authorized_keys)

    需求:

    两只 nginx web 服务器分别提供相同的访问,当一只主机无法提供服务(keepalived 、nginx 或者说主机宕机)后,另一只马上转换为MASTER状态,并且继承VIP,继续向用户提供服务。

    1、如果 keepalived 状态转换为 MASTER,则发送邮件进行通知运维人员(由下面 keepalived_check.sh 脚本实现) 
    2、需要nginx两台服务器提供的服务是完全一致的,并且当一台 nginx 的配置改变,则另一台立刻变为相同的配置,并且 reload 。(由 rsync+inotify 实时同步脚本 nginx_rsync.sh 脚本实现) 
    3、如果keepalived 挂掉,则检测并且重启keepalived;如果nginx 挂掉,则关闭keepalived,且让VIP转移到 keepalived-slave上面(由 nginx_check.sh脚本实现)

    这里写图片描述


    下面开始实验:

    一、nginx-1(master 主机配置)

    1、时间校准 
    ntpdate ntp.api.bz

    2、安装依赖软件 
    yum -y install openssl openssl-devel kernel-devel

    3、使用inotify机制,还需要安装inotify-tools工具,以便提供inotifywait,inotifywatch辅助工具,用来监控,汇总改动情况 
    yum -y install inotify-tools

    4、准备 keepalived 和 nginx 包(keepalived 包可以去 keepalived.org 下载,nginx 包则去 tengine 官方下载)

    这里写图片描述

    5、解包、编译安装

    tar zxf keepalived-1.2.20.tar.gz -C /usr/local/src/
    cd /usr/local/src/keepalived-1.2.20/
    ./configure --prefix=/usr/local/keepalived --with-kernel-dir=/usr/src/kernels/2.6.32-573.22.1.el6.x86_64/
    make && make install
    • 1
    • 2
    • 3
    • 4
    • 1
    • 2
    • 3
    • 4

    这里写图片描述

  • 相关阅读:
    hashMap put的返回值测试
    mysql java 类型对照 int
    crontab
    Caused by: java.lang.IllegalArgumentException: Modifying queries can only use void or int/Integer as return type!
    Unable to start EmbeddedWebApplicationContext due to missing EmbeddedServletContainerFactory bean
    Spring boot ---- java.lang.NoClassDefFoundError: javax/servlet/ServletContext
    蒙特卡罗算法:模拟
    Linux学习笔记:cut命令
    Linux学习笔记:split切分文件并按规律命名及添加拓展名
    Shell学习笔记:awk实现group by分组统计功能
  • 原文地址:https://www.cnblogs.com/shihaiming/p/6868172.html
Copyright © 2011-2022 走看看