原文: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