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

這裏寫圖片描述

相關文章
相關標籤/搜索