1、概述
前兩遍文章中,我們一直在說(shuō)后文要介紹Nginx + Keepalived的搭建方式。這篇文章開(kāi)始,我們就來(lái)兌現(xiàn)前文的承諾,后續(xù)的兩篇文章我們將介紹Nginx + Keepalived和 LVS + Keepalived搭建高可用的負(fù)載層系統(tǒng)。如果你還不了解Nginx和LVS的相關(guān)知識(shí),請(qǐng)參見(jiàn)我之前的兩篇文章《架構(gòu)設(shè)計(jì):負(fù)載均衡層設(shè)計(jì)方案(2)——Nginx安裝》(http://blog.csdn.net/yinwenjie/article/details/46620711)、《架構(gòu)設(shè)計(jì):負(fù)載均衡層設(shè)計(jì)方案(4)——LVS原理》(http://blog.csdn.net/yinwenjie/article/details/46845997)
2、準(zhǔn)備工作
2.1、準(zhǔn)備兩臺(tái)獨(dú)立工作的Nginx系統(tǒng)
準(zhǔn)備兩臺(tái)Nginx的主機(jī),如果您不知道為什么需要準(zhǔn)備兩臺(tái),沒(méi)關(guān)系,準(zhǔn)備就行。保證兩臺(tái)Nginx主機(jī)能夠被外網(wǎng)訪問(wèn)。在我這里,安裝兩臺(tái)Nginx的虛擬機(jī)IP地址分別是:
- Nginx VM1:192.168.61.129:80
- Nginx VM2:192.168.61.130:80
訪問(wèn)相關(guān)的地址,確保兩臺(tái)Nginx都是可用的:
VM1:
VM2:
Nginx的安裝在我的前文《架構(gòu)設(shè)計(jì):負(fù)載均衡層設(shè)計(jì)方案(2)——Nginx安裝》(http://blog.csdn.net/yinwenjie/article/details/46620711)中已經(jīng)進(jìn)行了詳細(xì)的講解,所以這里的講解就一筆帶過(guò)。
2.2、再分別獨(dú)立安裝Keepalived系統(tǒng)
我們的目標(biāo)是“在一臺(tái)工作的Nginx崩潰的情況下,系統(tǒng)能夠檢測(cè)到,并自動(dòng)將請(qǐng)求切換到另外一臺(tái)備份的Nginx服務(wù)器上”。所以,之前安裝的兩臺(tái)Nginx,一臺(tái)是Master服務(wù)器是主要的工作服務(wù)器,另一臺(tái)是備份服務(wù)器,在Master服務(wù)器出現(xiàn)問(wèn)題后,由后者接替其工作。如下圖所示(外網(wǎng)的請(qǐng)求使用一個(gè)由keepalived控制的虛擬的浮動(dòng)IP進(jìn)行訪問(wèn)):
請(qǐng)到 www.keepalived.org 下載keepalived的穩(wěn)定版本,我下載的是1.2.17版本。
解壓,并且安裝。注意,我在這里制定了perfix參數(shù),指定安裝位置,這是為了我自己便于管理。您在安裝的時(shí)候,可以根據(jù)自己的情況來(lái)決定是不是加這個(gè)參數(shù):
tar -zxvf keepalived-1.2.17.tar.gz
./configure --perfix=/usr/keepalived-1.2.17
make & make install
如果您不是安裝到默認(rèn)路徑,那么為了將keepalived做成系統(tǒng)服務(wù),您需要拷貝一些文件到指定的路徑下,如下:
cp /usr/keepalived-1.2.17/etc/sysconfig/keepalived /etc/sysconfig/keepalived
cp /usr/keepalived-1.2.17/sbin/keepalived /usr/sbin/keepalived
cp /usr/keepalived-1.2.17/etc/rc.d/init.d/keepalived /etc/rc.d/init.d/keepalived
mkdir /etc/keepalived
cp /usr/keepalived-1.2.17/etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf
然后您可以將keepalived做成服務(wù)了:
/etc/rc.d/init.d/keepalived
chkconfig keepalived on
3、檢查Nginx狀態(tài)
在正式介紹Nginx + Keepalived的配置前,我們首先介紹一下如何檢查Nginx的狀態(tài)。是的,這是為下一小節(jié)做準(zhǔn)備。我們只有能夠正確檢查Nginx的狀態(tài),才說(shuō)得上在Nginx節(jié)點(diǎn)出現(xiàn)問(wèn)題的情況下,切換到另一臺(tái)Nginx上接替其工作。
Nginx為什么會(huì)停止響應(yīng)呢?在我的工作經(jīng)驗(yàn)中,無(wú)非有以下幾種情況:
Nginx的所有進(jìn)程被強(qiáng)行終止(或管理進(jìn)程)。
這種情況,是我們需要檢查和切換的。無(wú)論什么情況下進(jìn)程被終止了,如果它不能重啟,我們就要切換到備機(jī)。
Nginx日志盤的掛載點(diǎn)崩潰或者磁盤寫(xiě)滿。
這個(gè)也是我們需要檢查和切換的。
Nginx已經(jīng)達(dá)到設(shè)置的最大連接數(shù),暫時(shí)停止響應(yīng)。
這種情況下,我們不能進(jìn)行備機(jī)切換,因?yàn)橥ㄟ^(guò)VIP:192.168.61.100連接過(guò)來(lái)的用戶請(qǐng)求比較多(在我們優(yōu)化參數(shù)后,可以達(dá)到65535 / 4的數(shù)量),一旦我們進(jìn)行備機(jī)切換,這些用戶請(qǐng)求將全部異常。這個(gè)問(wèn)題的解決需要靠增加負(fù)載機(jī)器,而不是主備切換。
Nginx物理機(jī)異常關(guān)機(jī)。
這個(gè)肯定是需要進(jìn)行檢查和切換的。
我們來(lái)看一段Linux腳本:
#!/bin/sh
if [ $(ps -C nginx --no-header | wc -l) -eq 0 ]; then
/usr/nginx-1.6.2/sbin/nginx
fi
sleep 2
if [ $(ps -C nginx --no-header | wc -l) -eq 0 ]; then
service keepalived stop
fi
我們大致講解一下“ps -C nginx –no-header | wc -l”這個(gè)命令:
- ps 這個(gè)命令用來(lái)進(jìn)行linux中進(jìn)程相關(guān)的查詢,-C 意思是按照進(jìn)程名稱進(jìn)行查詢。查詢出來(lái)后的結(jié)果如下:
[root@vm2 ~]# ps -C nginx
PID TTY TIME CMD
3374 ? 00:00:00 nginx
3375 ? 00:00:01 nginx
如果要去掉統(tǒng)計(jì)出來(lái)的結(jié)果表的頭部,那么要使用 –no-header參數(shù),加上參數(shù)后,查詢結(jié)果如下:
[root@vm2 ~]# ps -C nginx --no-header
3374 ? 00:00:00 nginx
3375 ? 00:00:01 nginx
“|”,這是Linux中的管道流命令,將上一個(gè)命令的輸出結(jié)果作為下一個(gè)命令的輸入。
wc 統(tǒng)計(jì)命令,-l 參數(shù),代表按行數(shù)進(jìn)行統(tǒng)計(jì)。所以整個(gè)命令的輸出結(jié)果為:
[root@vm2 ~]# ps -C nginx --no-header | wc -l
2
清楚了其中最關(guān)鍵的命令,我們?cè)賮?lái)講解一下整個(gè)腳本的含義:
第一個(gè)判斷說(shuō)明的是,如果當(dāng)前nginx的進(jìn)程數(shù)量 == 0,那么執(zhí)行nginx的啟動(dòng)命令,試圖重新啟動(dòng)nginx;接下來(lái)等待2秒(這是為了給nginx一定的啟動(dòng)時(shí)間),然后再次查看Nginx的進(jìn)程數(shù)量,如果仍然 == 0,那么停止這臺(tái)機(jī)器的keepalived服務(wù),以便備用的Keepalived節(jié)點(diǎn)檢查到Keepalived已經(jīng)停止這個(gè)事件,并將浮動(dòng)IP切換到備用服務(wù)器上。
注意,這段腳本是和我機(jī)器上的Nginx安裝路徑、Keepalived服務(wù)的狀態(tài)有關(guān)的,您如果要用的話,請(qǐng)進(jìn)行相應(yīng)的更改。
4、Nginx + Keepalived最簡(jiǎn)配置
4.1、請(qǐng)?jiān)俅未_認(rèn)前提
(首先,為了保證不會(huì)出現(xiàn)額外的問(wèn)題,請(qǐng)首先關(guān)閉防火墻,當(dāng)然正式環(huán)境里面,防火墻不能關(guān)閉)
外網(wǎng)進(jìn)行Nginx訪問(wèn)的浮動(dòng)IP:192.168.61.100
我們將192.168.61.129這臺(tái)服務(wù)器上運(yùn)行的Nginx作為主要的Nginx,其上的keepalived服務(wù)我們?cè)O(shè)置成Master方式。
我們將192.168.61.129這臺(tái)服務(wù)器上運(yùn)行的Nginx作為備用的Nginx服務(wù),其上的keepalived服務(wù)我們?cè)O(shè)置為Backup方式。
4.2、正式開(kāi)始設(shè)置
注意,經(jīng)過(guò)安裝,您的keepalived配置文件的位置在“/etc/keepalived/keepalived.conf”(如果沒(méi)有,請(qǐng)創(chuàng)建一個(gè),但是經(jīng)過(guò)之前的步驟,這個(gè)位置肯定是有文件的,如果沒(méi)有可能是之前您的步驟出現(xiàn)了什么問(wèn)題)。
4.2.1、設(shè)置192.168.61.129上的MASTER
我們先來(lái)看看192.168.61.129上的原始ip信息:
注意,這個(gè)129機(jī)器上的網(wǎng)卡設(shè)備號(hào)是eth1,而不是eth0,這個(gè)參數(shù)我們將在配置keepalived的時(shí)候使用到。
下面是129上keepalived的最簡(jiǎn)配置:
! Configuration File for keepalived
# global setting , notify email setting
global_defs {
#存在于同一個(gè)網(wǎng)段中,一組keepalived的各個(gè)節(jié)點(diǎn)都有不同的名字
#在全局設(shè)置中,我們還可以設(shè)置管理員的email信息等。
router_id LVS_V1
}
#這個(gè)是我們?cè)谏弦恍〗Y(jié)講到的nginx檢查腳本,我們保存在這個(gè)文件中(注意文件權(quán)限)
vrrp_script chknginx {
script "/usr/keepalived-1.2.17/bin/checknginx.sh"
#每10秒鐘,檢查一次
interval 10
}
#keepalived實(shí)例設(shè)置,是最重要的設(shè)置信息
vrrp_instance VI_1 {
#state狀態(tài)MASTER表示是主要工作節(jié)點(diǎn)。
#一個(gè)keepalived組中,最多只有一個(gè)MASTER節(jié)點(diǎn),當(dāng)然也可以沒(méi)有
state MASTER
#實(shí)例所綁定的網(wǎng)卡設(shè)備,我的網(wǎng)卡設(shè)備是eth1。您按照您自己的來(lái)
interface eth1
#同一個(gè)keepalived組,節(jié)點(diǎn)的設(shè)置必須一樣,這樣才會(huì)被識(shí)別
virtual_router_id 52
#節(jié)點(diǎn)優(yōu)先級(jí),BACKUP的優(yōu)先級(jí)一定要比MASTER的優(yōu)先級(jí)低
priority 100
#組播信息發(fā)送間隔,兩個(gè)節(jié)點(diǎn)設(shè)置必須一樣
advert_int 1
#實(shí)際的eth1上的固定ip地址
mcast_src_ip=192.168.61.129
#驗(yàn)證信息,只有驗(yàn)證信息相同,才能被加入到一個(gè)組中。
authentication {
auth_type PASS
auth_pass 1111
}
#虛擬地址和綁定的端口,如果有多個(gè),就綁定多個(gè)
#dev 是指定浮動(dòng)IP要綁定的網(wǎng)卡設(shè)備號(hào)
virtual_ipaddress {
192.168.61.100 dev eth1
}
#設(shè)置的檢查腳本
#關(guān)聯(lián)上方的“vrrp_script chknginx”
track_script {
chknginx
}
}
4.2.2、設(shè)置192.168.61.130上的BACKUP
再來(lái)看看192.168.61.130這個(gè)備用節(jié)點(diǎn)上keepalived的設(shè)置:
! Configuration File for keepalived
# global setting , notify email setting
global_defs {
#這里和master節(jié)點(diǎn)不同
router_id LVS_V2
}
#check nginx
vrrp_script chknginx {
script "/usr/keepalived-1.2.17/bin/checknginx.sh"
interval 10
}
# instance setting
vrrp_instance VI_1 {
# 這里和Master節(jié)點(diǎn)不一樣
state BACKUP
interface eth1
# 這里一定是一樣的
virtual_router_id 52
# 這里的優(yōu)先級(jí)比Master節(jié)點(diǎn)低
priority 99
advert_int 1
# 這里和Master節(jié)點(diǎn)不一樣
mcast_src_ip=192.168.61.130
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.61.100 dev eth1
}
track_script {
chknginx
}
}
4.3、啟動(dòng)主節(jié)點(diǎn)和備用節(jié)點(diǎn)
以上配置中請(qǐng)注意幾個(gè)關(guān)鍵點(diǎn):
- 注意nginx狀態(tài)檢查的腳本的位置,根據(jù)自己創(chuàng)建文件的位置不一樣,腳本檢查的指定位置也不一樣
- 注意優(yōu)先級(jí),MASTER節(jié)點(diǎn)的優(yōu)先級(jí)一定要高于所有的BACKUP節(jié)點(diǎn)。
- 注意局域網(wǎng)的組播地址,一定要可用。局域網(wǎng)內(nèi)所有keepalived節(jié)點(diǎn)都是利用組播方式尋找對(duì)方。
- 誰(shuí)說(shuō)BACKUP節(jié)點(diǎn)只能有一個(gè)?。?/li>
- 最后,keepalived一定要注冊(cè)成服務(wù)形式,您可以想象上面所有腳本、配置、命令如果重啟后再來(lái)一次,會(huì)是什么情況。
接下來(lái),我們要開(kāi)始啟動(dòng)Master節(jié)點(diǎn)和Backup節(jié)點(diǎn)了,為了準(zhǔn)確的查看日志狀態(tài),您需要觀察系統(tǒng)日志。系統(tǒng)日志所在的位置:
tail -f /var/log/messages
先啟動(dòng)Master節(jié)點(diǎn):
service keepalived start
再啟動(dòng)Backup節(jié)點(diǎn):
service keepalived start
如果設(shè)置和啟動(dòng)都是成功的,您不會(huì)在日志信息中收到任何的keepalived報(bào)錯(cuò)信息。接下來(lái)您就可以使用192.168.61.100這個(gè)IP訪問(wèn)Nginx了:
另外,這個(gè)綁定在192.168.61.129上的浮動(dòng)ip:192.168.61.100,您通過(guò)ipconfig命令一般是看不到的,要使用ip addr命令進(jìn)行查看:
為了試驗(yàn),我們主動(dòng)停止Master節(jié)點(diǎn)上的keepalived服務(wù)(注意,殺Nginx進(jìn)程不起作用,因?yàn)槲覀兊臋z查腳本會(huì)試圖重新啟動(dòng)Nginx進(jìn)程),接下來(lái)我們可以看到浮動(dòng)IP漂移到了130備機(jī)上:
5、Nginx + Keepalived非搶占模式
通過(guò)第4節(jié)的詳細(xì)介紹,相信您對(duì)Nginx + Keepalived的安裝方式有了一個(gè)明確的理解。keepalived的切換可以是自動(dòng)的,但是卻做不到毫秒級(jí)別,他怎么都需要幾秒鐘的時(shí)間進(jìn)行切換。
這就有一個(gè)問(wèn)題,雖然在主節(jié)點(diǎn)出現(xiàn)問(wèn)題我們轉(zhuǎn)向備份節(jié)點(diǎn)時(shí),這個(gè)延時(shí)無(wú)可避免,但是在我們修復(fù)主節(jié)點(diǎn)后,實(shí)際上并沒(méi)有必要再馬上做一次切換,所以Keepalived提供了一種非搶占模式,來(lái)滿足這個(gè)要求。
下面我們就來(lái)介紹一下Keepalived的非搶占模式的配置(無(wú)MASTER節(jié)點(diǎn),全部依據(jù)優(yōu)先級(jí)確定哪個(gè)節(jié)點(diǎn)進(jìn)行工作):
5.1、原來(lái)主節(jié)點(diǎn)的配置改動(dòng)
! Configuration File for keepalived
# global setting , notify email setting
global_defs {
router_id LVS_V1
}
vrrp_script chknginx {
script "/usr/keepalived-1.2.17/bin/checknginx.sh"
interval 10
# 一旦節(jié)點(diǎn)失效,節(jié)點(diǎn)的優(yōu)先級(jí)就減少2
# 有多少個(gè)keepalived節(jié)點(diǎn),就填寫(xiě)多少數(shù)量。
# 這樣保證這個(gè)節(jié)點(diǎn)的優(yōu)先級(jí)比其他節(jié)點(diǎn)都低
weight -2
# fall 表示多少次檢查失敗,就算節(jié)點(diǎn)失效。默認(rèn)1
#fall 1
}
vrrp_instance VI_1 {
#state狀態(tài)都是BACKUP表示是主要工作節(jié)點(diǎn)。
state BACKUP
interface eth1
virtual_router_id 52
# 這個(gè)關(guān)鍵配置項(xiàng),設(shè)置為“非搶占”模式
nopreempt
# 每個(gè)節(jié)點(diǎn)的優(yōu)先級(jí)一定要不一樣
priority 100
advert_int 1
mcast_src_ip=192.168.61.129
authentication {
auth_type PASS
auth_pass 1111
}
#虛擬地址和綁定的端口,如果有多個(gè),就綁定多個(gè)
#dev 是指定浮動(dòng)IP要綁定的網(wǎng)卡設(shè)備號(hào)
virtual_ipaddress {
192.168.61.100 dev eth1
}
#設(shè)置的檢查腳本
#關(guān)聯(lián)上方的“vrrp_script chknginx”
track_script {
chknginx
}
}
原來(lái)的主節(jié)點(diǎn)設(shè)置更改完成。
5.2、原來(lái)備份節(jié)點(diǎn)的配置改動(dòng)
加入“非搶占”模式的關(guān)鍵字、更改一個(gè)確定的優(yōu)先級(jí),設(shè)置檢查失敗后優(yōu)先級(jí)的遞減量,就行了。
6、后文介紹
這是我8月份的首篇文章,后文我們將介紹LVS + Keepalived + Nginx的安裝和配置方式。注意,LVS被Keepalived后,就沒(méi)有必要在對(duì)Nginx做Keepalived了。
|