keepalived nginx 双机热备图文讲解

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

 

keepalived nginx 双机热备实战精讲

在试验以前先贴张图上来,大体说下具体的需求及环境(注:实验所用到的脚本在文章末尾,若是在过程当中遇到能够先看脚本)linux

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

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

需求:api

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

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

这里写图片描述


下面开始实验:运维

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

一、时间校准 
ntpdate ntp.api.bzssh

二、安装依赖软件 
yum -y install openssl openssl-devel kernel-devel工具

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

四、准备 keepalived 和 nginx 包(keepalived 包能够去 keepalived.org 下载,nginx 包则去 tengine 官方下载)

这里写图片描述

五、解包、编译安装

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

这里写图片描述

六、拷贝配置文件

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/

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

三个脚本,分别为 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

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

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

这里写图片描述

九、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
#    }

}

十、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

十一、启动nginx、启动脚本分别为:nginx_check.sh nginx_rsync.sh(能够看到,nginx 和 两个脚本都已经启动)

这里写图片描述

十二、启动 keepalived

这里写图片描述

1三、查看日志(能够看到,keepalived已经启动,而且成功绑定了 VIP 192.168.1.60和61)

这里写图片描述

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

这里写图片描述

1五、经过VIP访问nginx

这里写图片描述


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

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

二、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
#    }

}

三、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

四、启动nginx、启动 nginx_check.sh(nginx_rsync.sh 没必要启动,由于只需配置一个nginx,则另外一个也会自动同步而且 reload)

这里写图片描述

五、启动 keepalived 并查看日志

这里写图片描述


3、故障及需求演练

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

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

这里写图片描述

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

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

这里写图片描述

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

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

这里写图片描述

这里写图片描述

四、当 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 改动时间彻底相同,而且配置也彻底相同。

这里写图片描述

这里写图片描述


4、实验脚本

一、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

二、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

三、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,继续向用户提供服务。

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

这里写图片描述


下面开始实验:

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

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

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

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

四、准备 keepalived 和 nginx 包(keepalived 包能够去 keepalived.org 下载,nginx 包则去 tengine 官方下载)

这里写图片描述

五、解包、编译安装

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

这里写图片描述

相关文章
相关标签/搜索