1. 程式人生 > >【轉】Keepalived實現redis的高可用

【轉】Keepalived實現redis的高可用

Keepalived實現redis的主從切換高可用原理詳解

具體安裝和配置keepalived和redis的教程,網上很多。

推薦幾個:

keepalived預設只能做到對網路故障和keepalived本身的監控,即當出現網路故障或者keepalived本身出現問題時,進行切換。但我們更關注的是機器上執行的業務,如果業務出問題了VIP沒有變化,整體來說還是失敗的。這時候就需要根據業務程序的執行狀態決定是否需要進行主備切換。還好keepalived提供了這樣一個自定義指令碼監控功能,不過該引數設定在官方預設的文件中並沒有出現。

這裡主要分析如何通過自定義指令碼實現redis的主從切換。

我們需要著重看一下keepalived.conf 1. vrrp_script &&track_script

vrrp_script程式碼塊是用來定義監控指令碼,指令碼執行時間間隔以及指令碼的執行結果導致優先順序變更幅度的。 這裡寫圖片描述

2 notify_stop

keepalived停止執行前執行notify_stop指定的指令碼。

配合官方文件提到的以下三個引數一起使用,功能更強大:

notify_master keepalived切換到master時執行的指令碼

notify_backup keepalived切換到backup時執行的指令碼

notify_fault keepalived出現故障時執行的指令碼

  notify_master/backup/fault分別表示切換為主/備/出錯時所執行的指令碼。

通過keepalived的自定義指令碼功能監控本機的redis服務狀態,當監控指令碼檢測到redis服務出現異常時,則改變本機keepalived的優先順序,同時這會導致master/backup角色的變化,而keepalived在角色變化時也會觸發一些機制執行相關指令碼,這就為我們改變redis的master/slave狀態提供了機會,這樣做的目的是為了是redis的master/slave直接的資料保持一致。

通過編寫指令碼,對返回的值進行判斷

Exit 0:健康檢查正常,keepalived狀態正常

Exit 1:檢查失敗,keepalived狀態異常

Exit 退出值等於其他值時,需要修改值為小於exitstatus的狀態碼

在keepalived+redis的使用過程中有四種情況:

1一種是keepalived掛了,同時redis也掛了,這樣的話直接VIP飄走之後,是不需要進行redis資料同步的,因為redis掛了,你也無法去master上同步,不過會損失已經寫在master上卻還沒同步到slave上面的這部分資料。

2另一種是keepalived掛了,redis沒掛,這時候VIP飄走後,redis的master/slave還是老的對應關係,如果不變化的話會把資料寫入redis slave中,從而不會同步到master上去,這就要藉助監控指令碼反轉redis的master/slave關係。這時候就要預留一點時間進行資料同步,然後反轉master/slave。

3還有一種是keepalived沒掛,redis掛了,這時候根據監控指令碼會檢測到redis掛了,通過返回exit 1,告訴keepalived狀態異常,降低keepalived master的優先順序,同樣會導致VIP飄走,情況和第二種一樣,也是需要進行資料同步,然後反轉當前redis的master/slave關係的。

4 隨後一種是keepalived沒掛,redis也沒掛,大吉大利啊,什麼都不用操作。

  在script下有五個指令碼,一個是檢測redis狀態的redis_check.sh指令碼,其餘四個是keepalived狀態變化時執行的指令碼。keepalived有master/backup/stop/fault四種狀態,因為我們主要是關注系統上的業務,所以在在keepalived進入fault/stop狀態後,也認為是進入了backup狀態,需要對redis的master/slave關係進行反轉,否則即使VIP漂移過去,但是redis的主從關係還沒有改變,會導致資料不一致,所以最終四個指令碼只有兩種內容。

Redis Slaveof 命令

slaveof命令可以將當前伺服器轉變為指定伺服器的從屬伺服器(slave server)。

如果當前伺服器已經是某個主伺服器(master server)的從屬伺服器,那麼執行 SLAVEOF host port 將使當前伺服器停止對舊主伺服器的同步,丟棄舊資料集,轉而開始對新主伺服器進行同步。

另外,對一個從屬伺服器執行命令 SLAVEOF NO ONE 將使得這個從屬伺服器關閉複製功能,並從從屬伺服器轉變回主伺服器,原來同步所得的資料集不會被丟棄。

利用『 SLAVEOF NO ONE 不會丟棄同步所得資料集』這個特性,可以在主伺服器失敗的時候,將從屬伺服器用作新的主伺服器,從而實現無間斷執行。

語法 redis Slaveof 命令基本語法如下:

redis 127.0.0.1:6379> SLAVEOF host port

可用版本 >= 1.0.0

返回值 總是返回 OK 。

例項

redis 127.0.0.1:6379> SLAVEOF 127.0.0.1 6379
OK
redis 127.0.0.1:6379> SLAVEOF NO ONE
OK