Keepalived+Nginx實現前端負載均衡的高可用
一、實驗前準備
時間同步、關閉iptables+selinux、各主機能相互解析
在192.168.0.101和192.168.0.102上安裝Keepalived和Nginx,通過Nginx負載均衡至192.168.0.103及192.168.0.104上,node3和node4上分別用httpd提供網頁node3及node4
該實驗實現的是主從模式
雙機高可用方法目前分為兩種:
1、雙機主從模式:即前端使用兩臺服務器,一臺主服務器和一臺熱備服務器,正常情況下,主服務器綁定一個公網虛擬IP,提供負載均衡服務,熱備服務器處於空閑狀態;當主服務器發生故障時,熱備服務器接管主服務器的公網虛擬IP,提供負載均衡服務;但是熱備服務器在主機器不出現故障的時候,永遠處於浪費狀態,對於服務器不多的網站,該方案不經濟實惠。
2、雙機主主模式:即前端使用兩臺負載均衡服務器,互為主備,且都處於活動狀態(使用DNS達到兩個外網IP地址的輪詢),同時各自綁定一個公網虛擬IP,提供負載均衡服務;當其中一臺發生故障時,另一臺接管發生故障服務器的公網虛擬IP(這時由非故障機器一臺負擔所有的請求)。這種方案,經濟實惠,非常適合於當前架構環境。
二、安裝及配置Keepalived及Nginx
1、配置192.168.0.101上的keepalived,192.168.0.102類似(需調整state為BACKUP,priority為90)
global_defs { notification_email { } notification_email_from root smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id LVS_10 } vrrp_script chk_nginx { //chk_nginx後面有空格,實驗中沒加空格不能導致檢測nginx腳本失敗 script "killall -0 nginx &>/dev/null" //檢測腳本 interval 1 //腳本執行間隔 1s weight -20 //如果腳本檢查結果為非0,則priority -20 fall 2 //失敗需連續檢測2次 rise 1 //成功只需1次,成功不修改優先級 } vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.0.250/24 dev eth0 label eth0:1 } track_script { //執行監控的服務 chk_nginx //引用VRRP腳本 } }
2、配置nginx
192.168.0.101及102 nginx簡單配置了下負載均衡如下
upstream lb { server 192.168.0.103; server 192.168.0.104; } server { listen 80; server_name 192.168.0.250; #charset koi8-r; #access_log /var/log/nginx/host.access.log main; location / { proxy_pass http://lb/; root /usr/share/nginx/html; index index.html index.htm; }3、主備配置差別主要為(建議這麽配置):
- 主機:(state MASTER;priority 100)
- 備機:(state BACKUP;priority 99)
- 非搶占:nopreempt
或者:
- 主機:(state BACKUP;priority 100)
- 備機:(state BACKUP;priority 100)
- 默認搶占
4、nginx的檢查腳本
最簡單的做法是監控NginX進程,更靠譜的做法是檢查NginX端口,最靠譜的做法是檢查多個url能否獲取到頁面。
註意:這裏要提示一下keepalived.conf中vrrp_script配置區的script一般有2種寫法:
1)通過腳本執行的返回結果,改變優先級,keepalived繼續發送通告消息,backup比較優先級再決定。這是直接監控Nginx進程的方式。
2)腳本裏面檢測到異常,直接關閉keepalived進程,backup機器接收不到advertisement會搶占IP。這是檢查NginX端口的方式。
第一種方式如上述實驗中的"killall -0 nginx"
Killall -0
做進程自檢:
如果進程還在使用,通過echo $? 可得返回為0;
如果進程已經死了,返回為1,並伴有error信息。
通過腳本判斷,有異常時exit 1,正常退出exit 0,然後keepalived根據動態調整的 vrrp_instance 優先級選舉決定是否搶占VIP:
如果腳本執行結果為0,並且weight配置的值大於0,則優先級相應的增加
如果腳本執行結果非0,並且weight配置的值小於0,則優先級相應的減少
其他情況,原本配置的優先級不變,即配置文件中priority對應的值。
第二方式檢測nginx後停止keepalived
#!/bin/bash counter=$(ps -C nginx --no-heading|wc -l) if [ "${counter}" = "0" ]; then /usr/local/nginx/sbin/nginx sleep 2 counter=$(ps -C nginx --no-heading|wc -l) if [ "${counter}" = "0" ]; then /etc/init.d/keepalived stop fi fi
三、Keepalive的通知機制
1、實例狀態通知
1) notify_master :節點變為master時執行
2) notify_backup : 節點變為backup時執行
3) notify_fault : 節點變為故障時執行
2、虛擬服務器檢測通知
1) notify_up : 虛擬服務器up時執行
2) notify_down : 虛擬服務器down時執行
notify_master "/etc/keepalived/notify.sh master
#!/bin/bash # description: An example of notify script vip=192.168.1.205 contact=‘[email protected]‘ notify() { mailsubject="`hostname` to be $1: $vip floating" mailbody="`date ‘+%F %H:%M:%S‘`: vrrp transition, `hostname` changed to be $1" echo $mailbody | mail -s "$mailsubject" $contact } case "$1" in master) notify master /etc/rc.d/init.d/nginx start exit 0 ;; backup) notify backup /etc/rc.d/init.d/nginx stop exit 0 ;; fault) notify fault /etc/rc.d/init.d/nginx stop exit 0 ;; *) echo ‘Usage: `basename $0` {master|backup|fault}‘ exit 1 ;; esac
Keepalived+Nginx實現前端負載均衡的高可用