深入學習Redis高可用架構(gòu):哨兵原理及實踐

Redis 主從復(fù)制的作用有數(shù)據(jù)熱備、負載均衡、故障恢復(fù)等邑狸;但主從復(fù)制存在的一個問題是故障恢復(fù)無法自動化。

本文將要介紹的哨兵涤妒,它基于 Redis 主從復(fù)制轨奄,主要作用便是解決主節(jié)點故障恢復(fù)的自動化問題齿诉,進一步提高系統(tǒng)的高可用性壹若。

文章將首先介紹哨兵的作用和架構(gòu)屿讽;然后講述哨兵系統(tǒng)的部署方法,以及通過客戶端訪問哨兵系統(tǒng)的方法贿讹;然后簡要說明哨兵實現(xiàn)的基本原理渐逃;最后給出關(guān)于哨兵實踐的一些建議。(注:文章內(nèi)容基于 Redis 3.0 版本)

哨兵的作用和架構(gòu)

哨兵的作用

在介紹哨兵之前民褂,首先從宏觀角度回顧一下 Redis 實現(xiàn)高可用相關(guān)的技術(shù)茄菊。

它們包括:持久化、復(fù)制赊堪、哨兵和集群面殖,其主要作用和解決的問題是:

持久化:持久化是最簡單的高可用方法(有時甚至不被歸為高可用的手段),主要作用是數(shù)據(jù)備份哭廉,即將數(shù)據(jù)存儲在硬盤脊僚,保證數(shù)據(jù)不會因進程退出而丟失。

復(fù)制:復(fù)制是高可用 Redis 的基礎(chǔ)群叶,哨兵和集群都是在復(fù)制基礎(chǔ)上實現(xiàn)高可用的吃挑。

復(fù)制主要實現(xiàn)了數(shù)據(jù)的多機備份,以及對于讀操作的負載均衡和簡單的故障恢復(fù)街立。缺陷:故障恢復(fù)無法自動化舶衬;寫操作無法負載均衡;存儲能力受到單機的限制赎离。

哨兵:在復(fù)制的基礎(chǔ)上逛犹,哨兵實現(xiàn)了自動化的故障恢復(fù)。缺陷:寫操作無法負載均衡梁剔;存儲能力受到單機的限制虽画。

集群:通過集群,Redis 解決了寫操作無法負載均衡荣病,以及存儲能力受到單機限制的問題码撰,實現(xiàn)了較為完善的高可用方案。

下面說回哨兵个盆,Redis Sentinel脖岛,即 Redis 哨兵,在 Redis 2.8 版本開始引入颊亮。哨兵的核心功能是主節(jié)點的自動故障轉(zhuǎn)移柴梆。

下面是 Redis 官方文檔對于哨兵功能的描述:

監(jiān)控(Monitoring):哨兵會不斷地檢查主節(jié)點和從節(jié)點是否運作正常。

自動故障轉(zhuǎn)移(Automatic failover):當主節(jié)點不能正常工作時终惑,哨兵會開始自動故障轉(zhuǎn)移操作绍在,它會將失效主節(jié)點的其中一個從節(jié)點升級為新的主節(jié)點,并讓其他從節(jié)點改為復(fù)制新的主節(jié)點雹有。

配置提供者(Configurationprovider):客戶端在初始化時偿渡,通過連接哨兵來獲得當前 Redis 服務(wù)的主節(jié)點地址。

通知(Notification):哨兵可以將故障轉(zhuǎn)移的結(jié)果發(fā)送給客戶端件舵。

其中卸察,監(jiān)控和自動故障轉(zhuǎn)移功能,使得哨兵可以及時發(fā)現(xiàn)主節(jié)點故障并完成轉(zhuǎn)移铅祸;而配置提供者和通知功能坑质,則需要在與客戶端的交互中才能體現(xiàn)。

這里對“客戶端”一詞在本文的用法做一個說明:在前面的文章中临梗,只要通過 API 訪問 Redis 服務(wù)器涡扼,都會稱作客戶端,包括 redis-cli盟庞、Java 客戶端 Jedis 等吃沪。

為了便于區(qū)分說明,本文中的客戶端并不包括 redis-cli什猖,而是比 redis-cli 更加復(fù)雜票彪。

redis-cli 使用的是 Redis 提供的底層接口红淡,而客戶端則對這些接口、功能進行了封裝降铸,以便充分利用哨兵的配置提供者和通知功能在旱。

哨兵的架構(gòu)

典型的哨兵架構(gòu)圖如下所示:

它由兩部分組成,哨兵節(jié)點和數(shù)據(jù)節(jié)點:

哨兵節(jié)點:哨兵系統(tǒng)由一個或多個哨兵節(jié)點組成推掸,哨兵節(jié)點是特殊的 Redis 節(jié)點桶蝎,不存儲數(shù)據(jù)。

數(shù)據(jù)節(jié)點:主節(jié)點和從節(jié)點都是數(shù)據(jù)節(jié)點谅畅。

哨兵系統(tǒng)的部署方法

這一部分將部署一個簡單的哨兵系統(tǒng)登渣,包含 1 個主節(jié)點、2 個從節(jié)點和 3 個哨兵節(jié)點毡泻。

方便起見:所有這些節(jié)點都部署在一臺機器上(局域網(wǎng) IP:192.168.92.128)胜茧,使用端口號區(qū)分;節(jié)點的配置盡可能簡化牙捉。

部署主從節(jié)點

哨兵系統(tǒng)中的主從節(jié)點竹揍,與普通的主從節(jié)點配置是一樣的,并不需要做任何額外配置邪铲。

下面分別是主節(jié)點(port=6379)和 2 個從節(jié)點(port=6380/6381)的配置文件芬位,配置都比較簡單,不再詳述带到。

#redis-6379.conf?

port?6379?

daemonize?yes?

logfile"6379.log"

dbfilename"dump-6379.rdb"


#redis-6380.conf?

port?6380?

daemonize?yes?

logfile"6380.log"

dbfilename"dump-6380.rdb"

slaveof?192.168.92.128?6379?


#redis-6381.conf?

port?6381?

daemonize?yes?

logfile"6381.log"

dbfilename"dump-6381.rdb"

slaveof?192.168.92.128?6379?

配置完成后昧碉,依次啟動主節(jié)點和從節(jié)點:? ?

redis-server?redis-6379.conf?

redis-server?redis-6380.conf?

redis-server?redis-6381.conf?

節(jié)點啟動后,連接主節(jié)點查看主從狀態(tài)是否正常揽惹,如下圖所示:

部署哨兵節(jié)點

哨兵節(jié)點本質(zhì)上是特殊的 Redis 節(jié)點被饿。3 個哨兵節(jié)點的配置幾乎是完全一樣的,主要區(qū)別在于端口號的不同(26379/26380/26381)搪搏。

下面以 26379 節(jié)點為例狭握,介紹節(jié)點的配置和啟動方式,配置部分盡量簡化疯溺,更多配置會在后面介紹论颅。

#sentinel-26379.conf?

port?26379?

daemonize?yes?

logfile"26379.log"

sentinel?monitor?mymaster?192.168.92.128?6379?2?

其中,sentinel monitor mymaster 192.168.92.128 6379 2 配置的含義是:該哨兵節(jié)點監(jiān)控 192.168.92.128:6379 這個主節(jié)點囱嫩。

該主節(jié)點的名稱是 mymaster恃疯,最后的 2 的含義與主節(jié)點的故障判定有關(guān):至少需要 2 個哨兵節(jié)點同意,才能判定主節(jié)點故障并進行故障轉(zhuǎn)移墨闲。

哨兵節(jié)點的啟動有兩種方式今妄,二者作用是完全相同的:

redis-sentinel?sentinel-26379.conf?

redis-server?sentinel-26379.conf--sentinel

按照上述方式配置和啟動之后,整個哨兵系統(tǒng)就啟動完畢了,可以通過 redis-cli 連接哨兵節(jié)點進行驗證盾鳞。

如下圖所示:可以看出 26379 哨兵節(jié)點已經(jīng)在監(jiān)控 mymaster 主節(jié)點(即192.168.92.128:6379)犬性,并發(fā)現(xiàn)了其 2 個從節(jié)點和另外 2 個哨兵節(jié)點。

此時如果查看哨兵節(jié)點的配置文件腾仅,會發(fā)現(xiàn)一些變化仔夺,以 26379 為例:

其中,dir 只是顯式聲明了數(shù)據(jù)和日志所在的目錄(在哨兵語境下只有日志)攒砖;known-slave 和 known-sentinel 顯示哨兵已經(jīng)發(fā)現(xiàn)了從節(jié)點和其他哨兵。

帶有 epoch 的參數(shù)與配置紀元有關(guān)(配置紀元是一個從 0 開始的計數(shù)器日裙,每進行一次領(lǐng)導(dǎo)者哨兵選舉吹艇,都會 +1;領(lǐng)導(dǎo)者哨兵選舉是故障轉(zhuǎn)移階段的一個操作昂拂,在后文原理部分會介紹)受神。

演示故障轉(zhuǎn)移

哨兵的四個作用中,配置提供者和通知需要客戶端的配合格侯,本文將在下一章介紹客戶端訪問哨兵系統(tǒng)的方法時再詳細介紹鼻听。

這一小節(jié)將演示當主節(jié)點發(fā)生故障時,哨兵的監(jiān)控和自動故障轉(zhuǎn)移功能联四。

(1)首先撑碴,使用 Kill 命令殺掉主節(jié)點:

(2)如果此時立即在哨兵節(jié)點中使用 info Sentinel 命令查看,會發(fā)現(xiàn)主節(jié)點還沒有切換過來朝墩,因為哨兵發(fā)現(xiàn)主節(jié)點故障并轉(zhuǎn)移醉拓,需要一段時間。

(3)一段時間以后收苏,再次在哨兵節(jié)點中執(zhí)行 info Sentinel 查看亿卤,發(fā)現(xiàn)主節(jié)點已經(jīng)切換成 6380 節(jié)點。

但是同時可以發(fā)現(xiàn)鹿霸,哨兵節(jié)點認為新的主節(jié)點仍然有 2 個從節(jié)點排吴,這是因為哨兵在將 6380 切換成主節(jié)點的同時,將 6379 節(jié)點置為其從節(jié)點懦鼠。

雖然 6379 從節(jié)點已經(jīng)掛掉钻哩,但是由于哨兵并不會對從節(jié)點進行客觀下線(其含義將在原理部分介紹),因此認為該從節(jié)點一直存在葛闷。

當 6379 節(jié)點重新啟動后憋槐,會自動變成 6380 節(jié)點的從節(jié)點,下面驗證一下淑趾。

(4)重啟 6379 節(jié)點:可以看到 6379 節(jié)點成為了 6380 節(jié)點的從節(jié)點阳仔。

(5)在故障轉(zhuǎn)移階段,哨兵和主從節(jié)點的配置文件都會被改寫。

對于主從節(jié)點近范,主要是 slaveof 配置的變化:新的主節(jié)點沒有了 slaveof 配置嘶摊,其從節(jié)點則 slaveof 新的主節(jié)點。

對于哨兵節(jié)點评矩,除了主從節(jié)點信息的變化叶堆,紀元(epoch)也會變化,下圖中可以看到紀元相關(guān)的參數(shù)都 +1 了斥杜。

小結(jié)

哨兵系統(tǒng)的搭建過程虱颗,有幾點需要注意:

哨兵系統(tǒng)中的主從節(jié)點,與普通的主從節(jié)點并沒有什么區(qū)別蔗喂,故障發(fā)現(xiàn)和轉(zhuǎn)移是由哨兵來控制和完成的忘渔。

哨兵節(jié)點本質(zhì)上是 Redis 節(jié)點。

每個哨兵節(jié)點缰儿,只需要配置監(jiān)控主節(jié)點畦粮,便可以自動發(fā)現(xiàn)其他的哨兵節(jié)點和從節(jié)點。

在哨兵節(jié)點啟動和故障轉(zhuǎn)移階段乖阵,各個節(jié)點的配置文件會被重寫(config rewrite)宣赔。

本章的例子中,一個哨兵只監(jiān)控了一個主節(jié)點瞪浸;實際上儒将,一個哨兵可以監(jiān)控多個主節(jié)點,通過配置多條 sentinel monitor 即可實現(xiàn)对蒲。

客戶端訪問哨兵系統(tǒng)

上一小節(jié)演示了哨兵的兩大作用:監(jiān)控和自動故障轉(zhuǎn)移椅棺。本小節(jié)則結(jié)合客戶端演示哨兵的另外兩個作用:配置提供者和通知。

代碼示例

在介紹客戶端的原理之前齐蔽,先以 Java 客戶端 Jedis 為例两疚,演示一下使用方法:下面代碼可以連接我們剛剛搭建的哨兵系統(tǒng),并進行各種讀寫操作(代碼中只演示如何連接哨兵含滴,異常處理诱渤、資源關(guān)閉等未考慮)。

publicstaticvoid?testSentinel()?throws?Exception?{

String?masterName?="mymaster";

Set?sentinels?=?new?HashSet<>();

sentinels.add("192.168.92.128:26379");

sentinels.add("192.168.92.128:26380");

sentinels.add("192.168.92.128:26381");


?????????JedisSentinelPool?pool?=?new?JedisSentinelPool(masterName,?sentinels);?//初始化過程做了很多工作?

?????????Jedis?jedis?=?pool.getResource();?

jedis.set("key1","value1");

pool.close();

}?

客戶端原理

Jedis 客戶端對哨兵提供了很好的支持谈况。如上述代碼所示勺美,我們只需要向 Jedis 提供哨兵節(jié)點集合和 masterName,構(gòu)造 JedisSentinelPool 對象碑韵。

然后便可以像使用普通 Redis 連接池一樣來使用了:通過 pool.getResource() 獲取連接赡茸,執(zhí)行具體的命令。

在整個過程中祝闻,我們的代碼不需要顯式的指定主節(jié)點的地址占卧,就可以連接到主節(jié)點;代碼中對故障轉(zhuǎn)移沒有任何體現(xiàn),就可以在哨兵完成故障轉(zhuǎn)移后自動的切換主節(jié)點华蜒。

之所以可以做到這一點辙纬,是因為在 JedisSentinelPool 的構(gòu)造器中,進行了相關(guān)的工作叭喜;主要包括以下兩點:

遍歷哨兵節(jié)點贺拣,獲取主節(jié)點信息:遍歷哨兵節(jié)點,通過其中一個哨兵節(jié)點 + masterName 獲得主節(jié)點的信息捂蕴。

該功能是通過調(diào)用哨兵節(jié)點的 sentinelget-master-addr-by-name 命令實現(xiàn)譬涡,該命令示例如下:

一旦獲得主節(jié)點信息,停止遍歷(因此一般來說遍歷到第一個哨兵節(jié)點啥辨,循環(huán)就停止了)昂儒。

增加對哨兵的監(jiān)聽:這樣當發(fā)生故障轉(zhuǎn)移時,客戶端便可以收到哨兵的通知委可,從而完成主節(jié)點的切換。

具體做法是:利用 Redis 提供的發(fā)布訂閱功能腊嗡,為每一個哨兵節(jié)點開啟一個單獨的線程着倾,訂閱哨兵節(jié)點的 + switch-master 頻道,當收到消息時燕少,重新初始化連接池卡者。

小結(jié)

通過客戶端原理的介紹,我們可以加深對哨兵功能的理解客们。

配置提供者:客戶端可以通過哨兵節(jié)點 + masterName 獲取主節(jié)點信息崇决,在這里哨兵起到的作用就是配置提供者。

需要注意的是底挫,哨兵只是配置提供者恒傻,而不是代理。二者的區(qū)別在于:

如果是配置提供者建邓,客戶端在通過哨兵獲得主節(jié)點信息后盈厘,會直接建立到主節(jié)點的連接,后續(xù)的請求(如 set/get)會直接發(fā)向主節(jié)點官边。

如果是代理沸手,客戶端的每一次請求都會發(fā)向哨兵,哨兵再通過主節(jié)點處理請求注簿。

舉一個例子可以很好的理解哨兵的作用是配置提供者契吉,而不是代理。在前面部署的哨兵系統(tǒng)中诡渴,將哨兵節(jié)點的配置文件進行如下修改:

sentinel?monitor?mymaster?192.168.92.128?6379?2?

改為?

sentinel?monitor?mymaster?127.0.0.1?6379?2?

然后捐晶,將前述客戶端代碼在局域網(wǎng)的另外一臺機器上運行,會發(fā)現(xiàn)客戶端無法連接主節(jié)點。

這是因為哨兵作為配置提供者租悄,客戶端通過它查詢到主節(jié)點的地址為 127.0.0.1:6379谨究,客戶端會向 127.0.0.1:6379 建立 Redis 連接,自然無法連接泣棋。如果哨兵是代理胶哲,這個問題就不會出現(xiàn)了。

通知:哨兵節(jié)點在故障轉(zhuǎn)移完成后潭辈,會將新的主節(jié)點信息發(fā)送給客戶端鸯屿,以便客戶端及時切換主節(jié)點。

哨兵實現(xiàn)的基本原理

前面介紹了哨兵部署把敢、使用的基本方法寄摆,本部分介紹哨兵實現(xiàn)的基本原理。

哨兵節(jié)點支持的命令

哨兵節(jié)點作為運行在特殊模式下的 Redis 節(jié)點修赞,其支持的命令與普通的 Redis 節(jié)點不同婶恼。

在運維中,我們可以通過這些命令查詢或修改哨兵系統(tǒng)柏副;不過更重要的是勾邦,哨兵系統(tǒng)要實現(xiàn)故障發(fā)現(xiàn)、故障轉(zhuǎn)移等各種功能割择,離不開哨兵節(jié)點之間的通信眷篇。

而通信的很大一部分是通過哨兵節(jié)點支持的命令來實現(xiàn)的。下面介紹哨兵節(jié)點支持的主要命令荔泳。

基礎(chǔ)查詢

通過這些命令蕉饼,可以查詢哨兵系統(tǒng)的拓撲結(jié)構(gòu)、節(jié)點信息玛歌、配置信息等:

info sentinel:獲取監(jiān)控的所有主節(jié)點的基本信息昧港。

sentinel masters:獲取監(jiān)控的所有主節(jié)點的詳細信息。

sentinel master mymaster:獲取監(jiān)控的主節(jié)點 mymaster 的詳細信息支子。

sentinel slaves mymaster:獲取監(jiān)控的主節(jié)點 mymaster 的從節(jié)點的詳細信息慨飘。

sentinel sentinels mymaster:獲取監(jiān)控的主節(jié)點 mymaster 的哨兵節(jié)點的詳細信息。

sentinel get-master-addr-by-name mymaster:獲取監(jiān)控的主節(jié)點 mymaster 的地址信息译荞,前文已有介紹瓤的。

sentinel is-master-down-by-addr:哨兵節(jié)點之間可以通過該命令詢問主節(jié)點是否下線,從而對是否客觀下線做出判斷吞歼。

增加/移除對主節(jié)點的監(jiān)控

sentinel monitor mymaster2 192.168.92.128 16379 2:與部署哨兵節(jié)點時配置文件中的 sentinel monitor 功能完全一樣圈膏,不再詳述。

sentinel remove mymaster2:取消當前哨兵節(jié)點對主節(jié)點 mymaster2 的監(jiān)控篙骡。

強制故障轉(zhuǎn)移

sentinel failover mymaster:該命令可以強制對 mymaster 執(zhí)行故障轉(zhuǎn)移稽坤,即便當前的主節(jié)點運行完好丈甸。

例如,如果當前主節(jié)點所在機器即將報廢尿褪,便可以提前通過failover命令進行故障轉(zhuǎn)移睦擂。

基本原理

關(guān)于哨兵的原理,關(guān)鍵是了解以下幾個概念杖玲。

定時任務(wù)

每個哨兵節(jié)點維護了 3 個定時任務(wù)顿仇,定時任務(wù)的功能分別如下:

通過向主從節(jié)點發(fā)送 info 命令獲取最新的主從結(jié)構(gòu)。

通過發(fā)布訂閱功能獲取其他哨兵節(jié)點的信息摆马。

通過向其他節(jié)點發(fā)送 ping 命令進行心跳檢測臼闻,判斷是否下線。

主觀下線

在心跳檢測的定時任務(wù)中囤采,如果其他節(jié)點超過一定時間沒有回復(fù)述呐,哨兵節(jié)點就會將其進行主觀下線。

顧名思義蕉毯,主觀下線的意思是一個哨兵節(jié)點“主觀地”判斷下線乓搬;與主觀下線相對應(yīng)的是客觀下線。

客觀下線

哨兵節(jié)點在對主節(jié)點進行主觀下線后代虾,會通過 sentinelis-master-down-by-addr 命令詢問其他哨兵節(jié)點該主節(jié)點的狀態(tài)进肯。

如果判斷主節(jié)點下線的哨兵數(shù)量達到一定數(shù)值,則對該主節(jié)點進行客觀下線褐着。

需要特別注意的是,客觀下線是主節(jié)點才有的概念托呕;如果從節(jié)點和哨兵節(jié)點發(fā)生故障含蓉,被哨兵主觀下線后,不會再有后續(xù)的客觀下線和故障轉(zhuǎn)移操作项郊。

選舉領(lǐng)導(dǎo)者哨兵節(jié)點

當主節(jié)點被判斷客觀下線以后馅扣,各個哨兵節(jié)點會進行協(xié)商,選舉出一個領(lǐng)導(dǎo)者哨兵節(jié)點着降,并由該領(lǐng)導(dǎo)者節(jié)點對其進行故障轉(zhuǎn)移操作差油。

監(jiān)視該主節(jié)點的所有哨兵都有可能被選為領(lǐng)導(dǎo)者,選舉使用的算法是 Raft 算法任洞。

Raft 算法的基本思路是先到先得:即在一輪選舉中蓄喇,哨兵 A 向 B 發(fā)送成為領(lǐng)導(dǎo)者的申請,如果 B 沒有同意過其他哨兵交掏,則會同意 A 成為領(lǐng)導(dǎo)者妆偏。

選舉的具體過程這里不做詳細描述,一般來說盅弛,哨兵選擇的過程很快钱骂,誰先完成客觀下線叔锐,一般就能成為領(lǐng)導(dǎo)者。

故障轉(zhuǎn)移

選舉出的領(lǐng)導(dǎo)者哨兵见秽,開始進行故障轉(zhuǎn)移操作愉烙,該操作大體可以分為 3 個步驟:

在從節(jié)點中選擇新的主節(jié)點:選擇的原則是,首先過濾掉不健康的從節(jié)點解取,然后選擇優(yōu)先級最高的從節(jié)點(由 slave-priority 指定)步责。

如果優(yōu)先級無法區(qū)分,則選擇復(fù)制偏移量最大的從節(jié)點肮蛹;如果仍無法區(qū)分勺择,則選擇 runid 最小的從節(jié)點。

更新主從狀態(tài):通過 slaveof no one 命令伦忠,讓選出來的從節(jié)點成為主節(jié)點省核;并通過 slaveof 命令讓其他節(jié)點成為其從節(jié)點。

將已經(jīng)下線的主節(jié)點(即 6379)設(shè)置為新的主節(jié)點的從節(jié)點昆码,當 6379 重新上線后气忠,它會成為新的主節(jié)點的從節(jié)點。

通過上述幾個關(guān)鍵概念赋咽,可以基本了解哨兵的工作原理旧噪。為了更形象的說明,下圖展示了領(lǐng)導(dǎo)者哨兵節(jié)點的日志脓匿,包括從節(jié)點啟動到完成故障轉(zhuǎn)移淘钟。

哨兵配置與實踐建議

哨兵配置

下面介紹與哨兵相關(guān)的幾個配置。

sentinel monitor {masterName} {masterIp} {masterPort}{quorum}

sentinel monitor 是哨兵最核心的配置陪毡,在前文講述部署哨兵節(jié)點時已說明米母,其中:masterName 指定了主節(jié)點名稱,masterIp 和 masterPort 指定了主節(jié)點地址毡琉,quorum 是判斷主節(jié)點客觀下線的哨兵數(shù)量閾值铁瞒。

當判定主節(jié)點下線的哨兵數(shù)量達到 quorum 時,對主節(jié)點進行客觀下線桅滋。建議取值為哨兵數(shù)量的一半加 1慧耍。

sentinel down-after-milliseconds {masterName} {time}

sentinel down-after-milliseconds 與主觀下線的判斷有關(guān):哨兵使用 ping 命令對其他節(jié)點進行心跳檢測。

如果其他節(jié)點超過 down-after-milliseconds 配置的時間沒有回復(fù)丐谋,哨兵就會將其進行主觀下線芍碧,該配置對主節(jié)點、從節(jié)點和哨兵節(jié)點的主觀下線判定都有效号俐。

down-after-milliseconds 的默認值是 30000师枣,即 30s;可以根據(jù)不同的網(wǎng)絡(luò)環(huán)境和應(yīng)用要求來調(diào)整萧落。

值越大践美,對主觀下線的判定會越寬松洗贰,好處是誤判的可能性小,壞處是故障發(fā)現(xiàn)和故障轉(zhuǎn)移的時間變長陨倡,客戶端等待的時間也會變長敛滋。

例如,如果應(yīng)用對可用性要求較高兴革,則可以將值適當調(diào)小绎晃,當故障發(fā)生時盡快完成轉(zhuǎn)移;如果網(wǎng)絡(luò)環(huán)境相對較差杂曲,可以適當提高該閾值庶艾,避免頻繁誤判。

sentinel parallel-syncs {masterName} {number}

sentinel parallel-syncs 與故障轉(zhuǎn)移之后從節(jié)點的復(fù)制有關(guān):它規(guī)定了每次向新的主節(jié)點發(fā)起復(fù)制操作的從節(jié)點個數(shù)擎勘。

例如咱揍,假設(shè)主節(jié)點切換完成之后,有 3 個從節(jié)點要向新的主節(jié)點發(fā)起復(fù)制棚饵;如果 parallel-syncs=1覆履,則從節(jié)點會一個一個開始復(fù)制预吆;如果 parallel-syncs=3,則 3 個從節(jié)點會一起開始復(fù)制输涕。

parallel-syncs 取值越大账胧,從節(jié)點完成復(fù)制的時間越快荐吵,但是對主節(jié)點的網(wǎng)絡(luò)負載锅棕、硬盤負載造成的壓力也越大映穗;應(yīng)根據(jù)實際情況設(shè)置。

例如诈胜,如果主節(jié)點的負載較低豹障,而從節(jié)點對服務(wù)可用的要求較高,可以適量增加 parallel-syncs 取值耘斩。parallel-syncs 的默認值是 1沼填。

sentinel failover-timeout {masterName} {time}

sentinel failover-timeout 與故障轉(zhuǎn)移超時的判斷有關(guān)桅咆,但是該參數(shù)不是用來判斷整個故障轉(zhuǎn)移階段的超時括授,而是其幾個子階段的超時。

例如如果主節(jié)點晉升從節(jié)點時間超過 timeout岩饼,或從節(jié)點向新的主節(jié)點發(fā)起復(fù)制操作的時間(不包括復(fù)制數(shù)據(jù)的時間)超過 timeout荚虚,都會導(dǎo)致故障轉(zhuǎn)移超時失敗。

failover-timeout 的默認值是 180000籍茧,即 180s版述;如果超時,則下一次該值會變?yōu)樵瓉淼?2 倍寞冯。

除上述幾個參數(shù)外渴析,還有一些其他參數(shù)晚伙,如安全驗證相關(guān)的參數(shù),這里不做介紹俭茧。

實踐建議

哨兵節(jié)點的數(shù)量應(yīng)不止一個咆疗,一方面增加哨兵節(jié)點的冗余,避免哨兵本身成為高可用的瓶頸母债;另一方面減少對下線的誤判午磁。此外,這些不同的哨兵節(jié)點應(yīng)部署在不同的物理機上毡们。

哨兵節(jié)點的數(shù)量應(yīng)該是奇數(shù)迅皇,便于哨兵通過投票做出“決策”:領(lǐng)導(dǎo)者選舉的決策、客觀下線的決策等衙熔。

各個哨兵節(jié)點的配置應(yīng)一致登颓,包括硬件、參數(shù)等青责;此外挺据,所有節(jié)點都應(yīng)該使用 ntp 或類似服務(wù),保證時間準確脖隶、一致扁耐。

哨兵的配置提供者和通知客戶端功能,需要客戶端的支持才能實現(xiàn)产阱,如前文所說的 Jedis婉称;如果開發(fā)者使用的庫未提供相應(yīng)支持,則可能需要開發(fā)者自己實現(xiàn)构蹬。

當哨兵系統(tǒng)中的節(jié)點在 Docker(或其他可能進行端口映射的軟件)中部署時王暗,應(yīng)特別注意端口映射可能會導(dǎo)致哨兵系統(tǒng)無法正常工作。

因為哨兵的工作基于與其他節(jié)點的通信庄敛,而 Docker 的端口映射可能導(dǎo)致哨兵無法連接到其他節(jié)點俗壹。

例如,哨兵之間互相發(fā)現(xiàn)藻烤,依賴于它們對外宣稱的 IP 和 port绷雏,如果某個哨兵 A 部署在做了端口映射的 Docker 中,那么其他哨兵使用 A 宣稱的 port 無法連接到 A怖亭。

總結(jié)

本文首先介紹了哨兵的作用:監(jiān)控涎显、故障轉(zhuǎn)移、配置提供者和通知兴猩;然后講述了哨兵系統(tǒng)的部署方法期吓,以及通過客戶端訪問哨兵系統(tǒng)的方法;再然后簡要說明了哨兵實現(xiàn)的基本原理倾芝;最后給出了關(guān)于哨兵實踐的一些建議讨勤。

在主從復(fù)制的基礎(chǔ)上箭跳,哨兵引入了主節(jié)點的自動故障轉(zhuǎn)移,進一步提高了 Redis 的高可用性潭千。

但是哨兵的缺陷同樣很明顯:哨兵無法對從節(jié)點進行自動故障轉(zhuǎn)移衅码,在讀寫分離場景下,從節(jié)點故障會導(dǎo)致讀服務(wù)不可用脊岳,需要我們對從節(jié)點做額外的監(jiān)控逝段、切換操作。

此外割捅,哨兵仍然沒有解決寫操作無法負載均衡奶躯、及存儲能力受到單機限制的問題;這些問題的解決需要使用集群亿驾,我將在后面的文章中介紹嘹黔,歡迎關(guān)注。

感興趣的可以自己來我的Java架構(gòu)群莫瞬,可以獲取免費的學習資料儡蔓,群號:855801563對Java技術(shù),架構(gòu)技術(shù)感興趣的同學疼邀,歡迎加群喂江,一起學習,相互討論旁振。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末获询,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子拐袜,更是在濱河造成了極大的恐慌吉嚣,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,639評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蹬铺,死亡現(xiàn)場離奇詭異尝哆,居然都是意外死亡,警方通過查閱死者的電腦和手機甜攀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評論 3 385
  • 文/潘曉璐 我一進店門秋泄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人赴邻,你說我怎么就攤上這事印衔》却罚” “怎么了姥敛?”我有些...
    開封第一講書人閱讀 157,221評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長瞎暑。 經(jīng)常有香客問我彤敛,道長与帆,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,474評論 1 283
  • 正文 為了忘掉前任墨榄,我火速辦了婚禮玄糟,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘袄秩。我一直安慰自己阵翎,他們只是感情好,可當我...
    茶點故事閱讀 65,570評論 6 386
  • 文/花漫 我一把揭開白布之剧。 她就那樣靜靜地躺著郭卫,像睡著了一般。 火紅的嫁衣襯著肌膚如雪背稼。 梳的紋絲不亂的頭發(fā)上贰军,一...
    開封第一講書人閱讀 49,816評論 1 290
  • 那天,我揣著相機與錄音蟹肘,去河邊找鬼词疼。 笑死,一個胖子當著我的面吹牛帘腹,可吹牛的內(nèi)容都是我干的贰盗。 我是一名探鬼主播,決...
    沈念sama閱讀 38,957評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼阳欲,長吁一口氣:“原來是場噩夢啊……” “哼童太!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起胸完,我...
    開封第一講書人閱讀 37,718評論 0 266
  • 序言:老撾萬榮一對情侶失蹤书释,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后赊窥,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體爆惧,經(jīng)...
    沈念sama閱讀 44,176評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,511評論 2 327
  • 正文 我和宋清朗相戀三年锨能,在試婚紗的時候發(fā)現(xiàn)自己被綠了扯再。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,646評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡址遇,死狀恐怖熄阻,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情倔约,我是刑警寧澤秃殉,帶...
    沈念sama閱讀 34,322評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響钾军,放射性物質(zhì)發(fā)生泄漏鳄袍。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,934評論 3 313
  • 文/蒙蒙 一吏恭、第九天 我趴在偏房一處隱蔽的房頂上張望拗小。 院中可真熱鬧,春花似錦樱哼、人聲如沸哀九。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽勾栗。三九已至,卻和暖如春盏筐,著一層夾襖步出監(jiān)牢的瞬間围俘,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評論 1 266
  • 我被黑心中介騙來泰國打工琢融, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留界牡,地道東北人。 一個月前我還...
    沈念sama閱讀 46,358評論 2 360
  • 正文 我出身青樓漾抬,卻偏偏與公主長得像宿亡,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子纳令,可洞房花燭夜當晚...
    茶點故事閱讀 43,514評論 2 348

推薦閱讀更多精彩內(nèi)容