天天看點

Redis源碼解析:Redis哨兵機制

Redis源碼解析:Redis哨兵機制

手寫一個監控程式

我是個苦逼的運維,最近公司的redis主從服務不太穩定,主節點老是無緣無故挂掉,害得我老是半夜起來手動切換主節點,這樣下去可不行,我得寫個監控腳本幫我幹這個活

Redis源碼解析:Redis哨兵機制

首先我先連上所有的主從節點,每隔1s發送ping指令

redis-cli -h 10.25.0.0 -p 6379
redis-cli -h 10.25.0.1 -p 6379
redis-cli -h 10.25.0.2 -p 6379
redis-cli -h 10.25.0.3 -p 6379      
Redis源碼解析:Redis哨兵機制
Redis源碼解析:Redis哨兵機制

如果主節點沒有響應,我就随便挑一個從節點執行 slaveof no one 指令,就 10.25.0.1 這個節點吧。

10.232.0.3:6379> info
...
role:master      

然後執行info指令,當info指令顯示這個節點的角色為master時,依次對其他從節點執行 slaveof 10.25.0.1 讓其從 10.25.0.1 複制資料

Redis源碼解析:Redis哨兵機制

當然挂掉的主節點不能不管不顧,當它複活的時候,也要對其執行 slaveof 10.25.0.1 讓其從 10.25.0.1 複制資料,不愧是我

于是這個監控就開始愉快的運作了,終于可以踏實的睡幾天覺了。

過了幾天,沒想到主節點挂了之後沒能正常切換,原來是我的監控程式挂了。

又過了幾天,服務又不穩定了,監控程式老是頻繁的切換主節點,但是主節點并沒有問題,原來是我這個監控程式和主節點的網絡不太穩定,讓監控程式誤認為主節點挂了。

面對大家對Redis主從節點自動切換的需求越來越強烈,Redis官方也坐不下去了,索性自己寫了一個監控程式,并且把這個監控程式叫做哨兵!

Redis中的哨兵是如何工作的?

作為一個官方的程式,上面我們遇到的問題肯定都會被解決,我們來看看哨兵是如何解決的

監測流程

首先為了解決哨兵當機不能正常進行切換的問題,我們可以對哨兵搭建一個叢集,每個哨兵都監測主從節點,當主節點不可用時,選一個正常的哨兵進行主從切換

Redis源碼解析:Redis哨兵機制

master端的info資訊

Redis源碼解析:Redis哨兵機制

slave端的info資訊

Redis源碼解析:Redis哨兵機制

故障轉移流程

上面我們自己寫的監測程式與Redis節點網絡不穩定時,會頻繁進行切換。為了解決這個問題,Redis引入了2個概念

主觀下線:目前哨兵程式認為主節點當機了,具有很強的主觀性,有可能是因為網絡的問題

客觀下線:大多數哨兵程式認為主節點當機了,那主節點很大機率當機了,應該進行主從切換了

當有多個哨兵程式時,應該讓哪個哨兵程式來執行主從切換呢?

多個哨兵會根據分布式共識協定,Raft協定,來選出領頭哨兵,讓其執行主從切換

Redis源碼解析:Redis哨兵機制

當選擇主節點的時候,并不是随便選擇一個從節點讓其變成主節點,而是通過一定的政策篩選出來的,篩選政策主要分為2個階段

淘汰階段:去掉網絡狀況不好的從節點,例如斷開連接配接,上一次正常回複ping距目前時間超過5s等

篩選階段:在剩下的從節點中先選優先級小的(在redis.conf給每台機器配置了優先級),優先級相同選複制偏移量大的,複制偏移量相同,選runId小的(每個redis執行個體啟動都會配置設定一個全局唯一的runId)

參考部落格

繼續閱讀