只有光頭才能變強git
好的,今天咱們要上【鉑金二】了,若是尚未上鉑金的,趕忙先去蹭蹭經驗再回來(否則不帶你上分了):github
在上篇中拋出了一個問題:數據庫
拋個問題:若是從服務器掛了,不要緊,咱們通常會有多個從服務器,其餘的請求能夠交由沒有掛的從服務器繼續處理。若是主服務器掛了,怎麼辦?由於咱們的寫請求由主服務器處理,只有一臺主服務器,那就沒法處理寫請求了?服務器
Redis提供了哨兵(Sentinal)機制供咱們解決上面的狀況。若是主服務器掛了,咱們能夠將從服務器升級爲主服務器,等到舊的主服務器(掛掉的那個)重連上來,會將它(掛掉的主服務器)變成從服務器。網絡
在正常的狀況下,主從加哨兵(Sentinal)機制是這樣子的:架構
主服務器掛了,主從複製操做就停止了,而且哨兵系統是能夠察覺出主服務掛了。:app
Redis提供哨兵機制能夠將選舉一臺從服務器變成主服務器異步
而後舊的主服務器若是重連了,會變成從服務器:ide
這篇文章主要講講Redis的哨兵(Sentinal)機制的一些細節。但願看完對你們有所幫助~學習
High Availability: Redis Sentinel is the official high availability solution for Redis.
哨兵(Sentinal)機制主要用於實現Redis的高可用性,主要的功能以下:
下面來具體講講Sentinel是如何將從服務器提高爲主服務器的。
tips:Sentinel可讓咱們的Redis實現高可用,Sentinel做爲這麼一個組件,自身也必然是高可用的(不多是單點的)
首先咱們要知道的是:Sentinel本質上只是一個運行在特殊模式下的Redis服務器。由於Sentinel作的事情和Redis服務器是不同的,因此它們的初始化是有所區別的(好比,Sentinel在初始化的時候並不會載入AOF/RDB文件,由於Sentinel根本就不用數據庫)。
而後,在啓動的時候會將普通Redis服務器的代碼替換成Sentinel專用代碼。(因此Sentinel雖然做爲Redis服務器,可是它不能執行SET、DBSIZE等等命令,由於命令表的代碼被替換了)
接着,初始化Sentinel的狀態,並根據給定的配置文件初始化Sentinel監視的主服務器列表。
最後,Sentinel會建立兩個連向主服務器的網絡鏈接:
_sentinel_:hello
頻道)Sentinel經過主服務器發送INFO命令來得到主服務器屬下全部從服務器的地址信息,併爲這些從服務器建立相應的實例結構。
當發現有新的從服務器出現時,除了建立對應的從服務器實例結構,Sentinel還會建立命令鏈接和訂閱鏈接。
在Sentinel運行的過程當中,經過命令鏈接會以每兩秒一次的頻率向監視的主從服務器的_sentinel_:hello頻道
發送命令(主要發送Sentinel自己的信息,監聽主從服務器的信息),並經過訂閱鏈接接收_sentinel_:hello頻道
的信息。
判斷主服務器是否下線有兩種狀況:
down-after-milliseconds
毫秒內連續向Sentinel發送無效回覆,那麼當前Sentinel就會主觀認爲該主服務器已經下線了。在多少毫秒內無效回覆才認定主服務器是主觀下線的,以及有多少個Sentinel認爲主服務器是下線才認定爲客觀下線。這都是能夠配置的
當一個主服務器認爲爲客觀下線之後,監視這個下線的主服務器的各類Sentinel會進行協商,選舉出一個領頭的Sentinel,領頭的Sentinel會對下線的主服務器執行故障轉移操做。
選舉領頭Sentinel的規則也比較多,總的來講就是先到先得(哪一個快,就選哪一個)
選舉出領頭的Sentinel以後,領頭的Sentinel會對已下線的主服務器執行故障轉移操做,包括三個步驟:
挑選某一個從服務器做爲主服務器也是有策略的,大概以下:
這篇文章主要講解了Sentinel的做用和工做的基本過程(我以爲已經基本OK了),其中也涉及到了不少的細節,這裏我就沒有一一整理出來了。想要深刻學習的同窗最好本身看看書或者文檔~~
tips:目前爲止的主從+哨兵架構能夠說Redis是高可用的,但要清楚的是:Redis仍是會丟失數據的
丟失數據有兩種狀況:
能夠經過如下兩個配置儘可能減小數據丟失的可能:
min-slaves-to-write 1 min-slaves-max-lag 10
從零單排學Redis【鉑金三】,敬請期待~
參考資料:
若是你以爲我寫得還不錯,瞭解一下: