nopreempt通常情況下,利用keepalived做熱備,其中一臺(tái)設(shè)置為master,一臺(tái)設(shè)置為backup。當(dāng)master出現(xiàn)異常后,backup自動(dòng)切換為master。當(dāng)backup成為master后,master恢復(fù)正常后會(huì)再次搶占成為master,導(dǎo)致不必要的主備切換。因此可以將兩臺(tái)keepalived初始狀態(tài)均配置為backup,設(shè)置不同的優(yōu)先級(jí),優(yōu)先級(jí)高的設(shè)置nopreempt解決異常恢復(fù)后再次搶占的問(wèn)題。
然而keepalived只能做到對(duì)網(wǎng)絡(luò)故障和keepalived本身的監(jiān)控,即當(dāng)出現(xiàn)網(wǎng)絡(luò)故障或者keepalived本身出現(xiàn)問(wèn)題時(shí),進(jìn)行切換。但是這些還不夠,我們還需要監(jiān)控keepalived所在服務(wù)器上的其他業(yè)務(wù)進(jìn)程,根據(jù)業(yè)務(wù)進(jìn)程的運(yùn)行狀態(tài)決定是否需要進(jìn)行主備切換。這個(gè)時(shí)候,我們可以通過(guò)編寫(xiě)腳本對(duì)業(yè)務(wù)進(jìn)程進(jìn)行檢測(cè)監(jiān)控。 例如編寫(xiě)個(gè)簡(jiǎn)單腳本查看haproxy進(jìn)程是否存活
在keepalived的配置文件中增加相應(yīng)配置項(xiàng)
keepalived會(huì)定時(shí)執(zhí)行腳本并對(duì)腳本執(zhí)行的結(jié)果進(jìn)行分析,動(dòng)態(tài)調(diào)整vrrp_instance的優(yōu)先級(jí)。 如果腳本執(zhí)行結(jié)果為0,并且weight配置的值大于0,則優(yōu)先級(jí)相應(yīng)的增加 如果腳本執(zhí)行結(jié)果非0,并且weight配置的值小于0,則優(yōu)先級(jí)相應(yīng)的減少 其他情況,維持原本配置的優(yōu)先級(jí),即配置文件中priority對(duì)應(yīng)的值。 這里需要注意的是: 1) 優(yōu)先級(jí)不會(huì)不斷的提高或者降低 2) 可以編寫(xiě)多個(gè)檢測(cè)腳本并為每個(gè)檢測(cè)腳本設(shè)置不同的weight 3) 不管提高優(yōu)先級(jí)還是降低優(yōu)先級(jí),最終優(yōu)先級(jí)的范圍是在[1,254],不會(huì)出現(xiàn)優(yōu)先級(jí)小于等于0或者優(yōu)先級(jí)大于等于255的情況 這樣可以做到利用腳本檢測(cè)業(yè)務(wù)進(jìn)程的狀態(tài),并動(dòng)態(tài)調(diào)整優(yōu)先級(jí)從而實(shí)現(xiàn)主備切換。 但是利用該方式會(huì)存在一個(gè)問(wèn)題,例如:A,B兩臺(tái)keepalived A的配置大概為:
B的配置大概為:
A,B同時(shí)啟動(dòng)后,由于A(yíng)的優(yōu)先級(jí)較高,因此通過(guò)選舉會(huì)成為master。當(dāng)A上的業(yè)務(wù)進(jìn)程出現(xiàn)問(wèn)題時(shí),優(yōu)先級(jí)會(huì)降低到60。此時(shí)B收到優(yōu)先級(jí)比自己低的vrrp廣播包時(shí),將切換為master狀態(tài)。那么當(dāng)B上的業(yè)務(wù)出現(xiàn)問(wèn)題時(shí),優(yōu)先級(jí)降低到50,盡管A的優(yōu)先級(jí)比B的要高,但是由于設(shè)置了nopreempt,A不會(huì)再搶占成為master狀態(tài)。
所以,可以在檢測(cè)腳本中增加殺掉keepalived進(jìn)程(或者停用keepalived服務(wù))的方式,做到業(yè)務(wù)進(jìn)程出現(xiàn)問(wèn)題時(shí)完成主備切換。 |
|