只有光頭才能變強
好的,今天咱們要上【鉑金二】了,若是尚未上鉑金的,趕忙先去蹭蹭經驗再回來(否則不帶你上分了):git
在上篇中拋出了一個問題:github
拋個問題:若是從服務器掛了,不要緊,咱們通常會有多個從服務器,其餘的請求能夠交由沒有掛的從服務器繼續處理。若是主服務器掛了,怎麼辦?由於咱們的寫請求由主服務器處理,只有一臺主服務器,那就沒法處理寫請求了?
Redis提供了哨兵(Sentinal)機制供咱們解決上面的狀況。若是主服務器掛了,咱們能夠將從服務器升級爲主服務器,等到舊的主服務器(掛掉的那個)重連上來,會將它(掛掉的主服務器)變成從服務器。數據庫
在正常的狀況下,主從加哨兵(Sentinal)機制是這樣子的:服務器
主服務器掛了,主從複製操做就停止了,而且哨兵系統是能夠察覺出主服務掛了。:網絡
Redis提供哨兵機制能夠將選舉一臺從服務器變成主服務器架構
而後舊的主服務器若是重連了,會變成從服務器:app
這篇文章主要講講Redis的哨兵(Sentinal)機制的一些細節。但願看完對你們有所幫助~異步
High Availability: Redis Sentinel is the official high availability solution for Redis.
哨兵(Sentinal)機制主要用於實現Redis的高可用性,主要的功能以下:ide
Monitoring. Sentinel constantly checks if your master and slave instances are working as expected.學習
Notification. Sentinel can notify the system administrator, another computer programs, via an API, that something is wrong with one of the monitored Redis instances.
Automatic failover. If a master is not working as expected, Sentinel can start a failover process where a slave is promoted to master, the other additional slaves are reconfigured to use the new master, and the applications using the Redis server informed about the new address to use when connecting.
Configuration provider. Sentinel acts as a source of authority for clients service discovery: clients connect to Sentinels in order to ask for the address of the current Redis master responsible for a given service. If a failover occurs, Sentinels will report the new address.
下面來具體講講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【鉑金三】,敬請期待~
參考資料:
若是你以爲我寫得還不錯,瞭解一下: