Nginx+Keepalived高可用負載均衡雙機熱備

標題:Nginx+Keepalived高可用負載均衡雙機熱備


 

Nginx進程基於於Master+Slave(worker)多進程模型,自身具有非常穩定的子進程管理功能。在Master進程分配模式下,Master進程永遠不進行業務處理,只是進行任務分發,從而達到Master進程的存活高可靠性,Slave(worker)進程所有的業務信號都 由主進程發出,Slave(worker)進程所有的超時任務都會被Master中止,屬於非阻塞式任務模型。
 
Keepalived是Linux下面實現VRRP 備份路由的高可靠性運行件。基於Keepalived設計的服務模式能夠真正做到主服務器和備份服務器故障時IP瞬間無縫交接,作用:主要用作RealServer的健康狀態檢查以及LoadBalance主機和BackUP主機之間failover的實現
 
 Nginx有很強代理功能,但是一臺nginx就形成了單點,現在使用keepalived來解決這個問題,keepalived的故障轉移時間很短.Nginx+keepalived雙機實現nginx反向代理服務的高可用,一臺nginx掛掉之後不影響應用也不影響內網訪問外網.
 

 

(圖畫的有點難看....

一、環境:
rhel5、nginx-0.7.51、keepalived-1.1.15
master:192.168.126.173
slave:192.168.126.176
vip:192.168.200.16

 
二:安裝nginx(兩臺安裝配置都一樣!)
 
  1. #添加運行nginx的用戶和組www 
  2. groupadd www  
  3. useradd -g www www
  4. wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-7.8.tar.gz 
  5. tar zxvf pcre-7.8.tar.gz 
  6. cd pcre-7.8/ 
  7. ./configure 
  8. make && make install 
  9. wget http://sysoev.ru/nginx/nginx-0.7.51.tar.gz 
  10. tar zxvf nginx-0.7.51.tar.gz 
  11. cd nginx-0.7.51/ 
  12. ./configure --user=www --group=www --prefix=/usr/local/webserver/nginx --with-http_stub_status_module --with-http_ssl_module 
  13. make && make install

三:安裝keepalived

  1. wget http://www.keepalived.org/software/keepalived-1.1.15.tar.gz 
  2. tar zxvf keepalived-1.1.15.tar.gz 
  3. cd keepalived-1.1.15 
  4. ln -s /usr/src/kernels/2.6.18-164.el5-i686/ /usr/src/linux(這裏爲什麼做軟鏈接後面說!)
  5. ./configure --prefix=/usr --exec-prefix=/usr \
    --bindir=/usr/bin --sbindir=/usr/sbin --sysconfdir=/etc --datadir=/usr/share \
    --includedir=/usr/include --libdir=/usr/lib64 --libexecdir=/usr/libexec \
    --localstatedir=/var --mandir=/usr/share/man --infodir=/usr/share/info \
    --sharedstatedir=/usr/com \
    --with-kernel-dir=/usr/src/linux(這裏指定的是軟鏈接路徑!!)
  6. make
  7. make install
  8. 啓動nginx!/usr/local/nginx/sbin/nginx

四:配置keepalived.conf

1,MASTER 的keepalived.conf

! Configuration File for keepalived

global_defs {
   notification_email {           #發送email 的地址
   [email protected]
   }
   notification_email_from [email protected]
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}
vrrp_script chk_http_port {     #執行監控的服務 
    script "/tmp/dd.sh"              #監控的腳本(腳本在下文寫,詳情見下文)
    interval 2                            #監控的時間
    weight 2
}

vrrp_instance VI_1 {
    state MASTER                    #設置爲主
    interface eth0                       #監控的網卡
    virtual_router_id 51i             #暫時不知道什麼,但是這個兩臺服務器必須一樣!!!
    mcast_src_ip 192.168.126.173           #主nginx地址
    priority 150       #優先級,優先級MASTRE一定要高於BAUCKUP(其實叫權重值)
    advert_int 1
    authentication {
        auth_type PASS               #加密
        auth_pass 1111                 #加密的密碼,兩臺服務器一定要一樣!!! 
    }
    virtual_ipaddress {
        192.168.200.16     #VIP地址,就是本對應的虛擬IP,ip addr可以查看到
    }
}

2,BACKUP keepalived.conf(這裏我就不解釋參數了!)

! Configuration File for keepalived

global_defs {
   notification_email {
[email protected]  

}
   notification_email_from [email protected]
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}
vrrp_script chk_http_port {
    script "/tmp/dd.sh"
    interval 2
    weight 2
}

vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 51
    mcast_src_ip 192.168.126.176   
    priority 100      # 記住keepalived是根據這裏來判斷MASTER還是BACKUP!
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.200.16
    }
}

/etc/init.d/keepalived start !


 爲什麼我編譯keepalived之前要做一個內核的軟鏈接呢?因爲之前我編譯的時候指定系統默認的內核文件,結果最後安裝完畢之後ps -ef | grep keepalived ,顯示只有兩個進程,但是正常情況下應該有3個keepalived的進程纔對!

查閱相關資料,是因爲當前linux系統未指定內核文件,可是我係統有啊,我就做了一個軟鏈接,ln -s /usr/src/kernels/2.6.18-164.el5-i686/ /usr/src/linux,重新編譯一下。有3個進程在跑了!

[root@localhost tmp]# ps -ef | grep keepalived
root     17708     1  0 12:18 ?        00:00:00 keepalived -D
root     17709 17708  0 12:18 ?        00:00:00 keepalived -D
root     17710 17708  0 12:18 ?        00:00:00 keepalived -D
root     17756  2490  0 15:51 pts/2    00:00:00 grep keepalived


關鍵:

!爲什麼這裏要 指定監控的腳本呢?script "/tmp/dd.sh" !! 監控的腳本非常的關鍵!!!

keepalived本身的不足,只有服務器當keepalived  down了的時候,BACKUP纔會去接管,但是當nginx死了之後,keepalived是不知道nginx死了,所以寫一個腳本讓keepalived去檢測nginx的存活狀態然後去停掉自己的主keepalived!這樣BACKUP纔會去接管!

cat /tmp/dd.sh

#!/bin/bash
A=`ps -C nginx --no-header |wc -l`
if [ $A -eq 0 ]
 then
        /usr/local/nginx/sbin/nginx
        sleep 1
        if [ `ps -C nginx --no-header |wc -l` -eq 0 ]
          then
                killall keepalived
        fi
fi


五,監控一下Nginx Mastaer 的日誌

 

 

監控一下Nginx Backup 正常,就不貼出來了。

 


六。測試

現在停掉Nginx Mastaer上的nginx...Nginx Backup腳本檢測到nginx死了,就接管了Nginx Mastaer。我們來看一看日誌~ tail -f /var/log/messages

 

很顯然可以看出backup已經變成master!!

現在再啓動原來master的nginx,再查看backup的日誌

 

 

很顯然可以看出backup 自動叫交出了老大的權利,重現變爲backup了!

 


 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章