如何理解Redis哨兵技術(shù)

本篇文章給大家分享的是有關(guān)如何理解redis哨兵技術(shù),小編覺(jué)得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說(shuō),跟著小編一起來(lái)看看吧。

創(chuàng)新互聯(lián)建站網(wǎng)站建設(shè)公司一直秉承“誠(chéng)信做人,踏實(shí)做事”的原則,不欺瞞客戶,是我們最起碼的底線! 以服務(wù)為基礎(chǔ),以質(zhì)量求生存,以技術(shù)求發(fā)展,成交一個(gè)客戶多一個(gè)朋友!專注中小微企業(yè)官網(wǎng)定制,做網(wǎng)站、成都網(wǎng)站制作,塑造企業(yè)網(wǎng)絡(luò)形象打造互聯(lián)網(wǎng)企業(yè)效應(yīng)。

小編將要介紹的哨兵,它基于Redis主從復(fù)制,主要作用便是解決主節(jié)點(diǎn)故障恢復(fù)的自動(dòng)化問(wèn)題,進(jìn)一步提高系統(tǒng)的高可用性。

注:內(nèi)容基于Redis 3.0版本。

一、作用和架構(gòu)

1.作用

在介紹哨兵之前,首先從宏觀角度回顧一下Redis實(shí)現(xiàn)高可用相關(guān)的技術(shù)。它們包括:持久化、復(fù)制、哨兵和集群,其主要作用和解決的問(wèn)題是:

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

  • 復(fù)制:復(fù)制是高可用Redis的基礎(chǔ),哨兵和集群都是在復(fù)制基礎(chǔ)上實(shí)現(xiàn)高可用的。復(fù)制主要實(shí)現(xiàn)了數(shù)據(jù)的多機(jī)備份,以及對(duì)于讀操作的負(fù)載均衡和簡(jiǎn)單的故障恢復(fù)。缺陷是故障恢復(fù)無(wú)法自動(dòng)化;寫操作無(wú)法負(fù)載均衡;存儲(chǔ)能力受到單機(jī)的限制。

  • 哨兵:在復(fù)制的基礎(chǔ)上,哨兵實(shí)現(xiàn)了自動(dòng)化的故障恢復(fù)。缺陷是寫操作無(wú)法負(fù)載均衡;存儲(chǔ)能力受到單機(jī)的限制。

  • 集群:通過(guò)集群,Redis解決了寫操作無(wú)法負(fù)載均衡,以及存儲(chǔ)能力受到單機(jī)限制的問(wèn)題,實(shí)現(xiàn)了較為完善的高可用方案。

詳細(xì)內(nèi)容可回顧:

下面說(shuō)回哨兵。

Redis Sentinel,即Redis哨兵,在Redis 2.8版本開(kāi)始引入。哨兵的核心功能是主節(jié)點(diǎn)的自動(dòng)故障轉(zhuǎn)移。下面是Redis官方文檔對(duì)于哨兵功能的描述:

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

  • 自動(dòng)故障轉(zhuǎn)移(Automatic Failover):當(dāng)主節(jié)點(diǎn)不能正常工作時(shí),哨兵會(huì)開(kāi)始自動(dòng)故障轉(zhuǎn)移操作,它會(huì)將失效主節(jié)點(diǎn)的其中一個(gè)從節(jié)點(diǎn)升級(jí)為新的主節(jié)點(diǎn),并讓其他從節(jié)點(diǎn)改為復(fù)制新的主節(jié)點(diǎn)。

  • 配置提供者(Configuration Provider):客戶端在初始化時(shí),通過(guò)連接哨兵來(lái)獲得當(dāng)前Redis服務(wù)的主節(jié)點(diǎn)地址。

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

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

這里對(duì)“客戶端”一詞在文章中的用法做一個(gè)說(shuō)明:在前面的文章中,只要通過(guò)API訪問(wèn)Redis服務(wù)器,都會(huì)稱作客戶端,包括Redis-cli、Java客戶端Jedis等。為了便于區(qū)分說(shuō)明,本文中的客戶端并不包括Redis-cli,而是比Redis-cli更加復(fù)雜:Redis-cli使用的是Redis提供的底層接口,而客戶端則對(duì)這些接口、功能進(jìn)行了封裝,以便充分利用哨兵的配置提供者和通知功能。

2.架構(gòu)

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

如何理解Redis哨兵技術(shù)

它由兩部分組成:

  • 哨兵節(jié)點(diǎn):哨兵系統(tǒng)由一個(gè)或多個(gè)哨兵節(jié)點(diǎn)組成,哨兵節(jié)點(diǎn)是特殊的Redis節(jié)點(diǎn),不存儲(chǔ)數(shù)據(jù)。

  • 數(shù)據(jù)節(jié)點(diǎn):主節(jié)點(diǎn)和從節(jié)點(diǎn)都是數(shù)據(jù)節(jié)點(diǎn)。

二、部署

這一部分將部署一個(gè)簡(jiǎn)單的哨兵系統(tǒng),包含1個(gè)主節(jié)點(diǎn)、2個(gè)從節(jié)點(diǎn)和3個(gè)哨兵節(jié)點(diǎn)。方便起見(jiàn),所有這些節(jié)點(diǎn)都部署在一臺(tái)機(jī)器上(局域網(wǎng)IP:192.168.92.128),使用端口號(hào)區(qū)分;且節(jié)點(diǎn)的配置盡可能簡(jiǎn)化。

1.部署主從節(jié)點(diǎn)

哨兵系統(tǒng)中的主從節(jié)點(diǎn),與普通的主從節(jié)點(diǎn)配置是一樣的,并不需要做任何額外配置。下面分別是主節(jié)點(diǎn)(port=6379)和2個(gè)從節(jié)點(diǎn)(port=6380/6381)的配置文件,配置都比較簡(jiǎn)單,不再詳述:

#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

配置完成后,依次啟動(dòng)主節(jié)點(diǎn)和從節(jié)點(diǎn):

  • redis-server redis-6379.conf

  • redis-server redis-6380.conf

  • redis-server redis-6381.conf

節(jié)點(diǎn)啟動(dòng)后,連接主節(jié)點(diǎn)查看主從狀態(tài)是否正常,如下圖所示:

如何理解Redis哨兵技術(shù)

2.部署哨兵節(jié)點(diǎn)

哨兵節(jié)點(diǎn)本質(zhì)上是特殊的Redis節(jié)點(diǎn)。

3個(gè)哨兵節(jié)點(diǎn)的配置幾乎是完全一樣的,主要區(qū)別在于端口號(hào)的不同(26379 / 26380 / 263 81),下面以26379節(jié)點(diǎn)為例介紹節(jié)點(diǎn)的配置和啟動(dòng)方式;配置部分盡量簡(jiǎn)化,更多配置會(huì)在后面介紹:

#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é)點(diǎn)監(jiān)控192.168.92.128:6379這個(gè)主節(jié)點(diǎn),該主節(jié)點(diǎn)的名稱是mymaster,***的2的含義與主節(jié)點(diǎn)的故障判定有關(guān):至少需要2個(gè)哨兵節(jié)點(diǎn)同意,才能判定主節(jié)點(diǎn)故障并進(jìn)行故障轉(zhuǎn)移。

哨兵節(jié)點(diǎn)的啟動(dòng)有兩種方式,二者作用是完全相同的:

  • redis-sentinel sentinel-26379.conf

  • redis-server sentinel-26379.conf --sentinel

按照上述方式配置和啟動(dòng)之后,整個(gè)哨兵系統(tǒng)就啟動(dòng)完畢了??梢酝ㄟ^(guò)Redis-cli連接哨兵節(jié)點(diǎn)進(jìn)行驗(yàn)證,如下圖所示:可以看出26379哨兵節(jié)點(diǎn)已經(jīng)在監(jiān)控mymaster主節(jié)點(diǎn)(即192.168.92.128:6379),并發(fā)現(xiàn)了其2個(gè)從節(jié)點(diǎn)和另外2個(gè)哨兵節(jié)點(diǎn)。

如何理解Redis哨兵技術(shù)

此時(shí)如果查看哨兵節(jié)點(diǎn)的配置文件,會(huì)發(fā)現(xiàn)一些變化,以26379為例:

如何理解Redis哨兵技術(shù)

其中,dir只是顯式聲明了數(shù)據(jù)和日志所在的目錄(在哨兵語(yǔ)境下只有日志);known-slave和known-sentinel顯示哨兵已經(jīng)發(fā)現(xiàn)了從節(jié)點(diǎn)和其他哨兵;帶有epoch的參數(shù)與配置紀(jì)元有關(guān)(配置紀(jì)元是一個(gè)從0開(kāi)始的計(jì)數(shù)器,每進(jìn)行一次***哨兵選舉,都會(huì)+1;***哨兵選舉是故障轉(zhuǎn)移階段的一個(gè)操作,在后文原理部分會(huì)介紹)。

3.演示故障轉(zhuǎn)移

哨兵的4個(gè)作用中,配置提供者和通知需要客戶端的配合,本文將在下一章介紹客戶端訪問(wèn)哨兵系統(tǒng)的方法時(shí)詳細(xì)介紹。這一小節(jié)將演示當(dāng)主節(jié)點(diǎn)發(fā)生故障時(shí),哨兵的監(jiān)控和自動(dòng)故障轉(zhuǎn)移功能。

Step1:首先,使用kill命令殺掉主節(jié)點(diǎn):

如何理解Redis哨兵技術(shù)

Step2:如果此時(shí)立即在哨兵節(jié)點(diǎn)中使用info Sentinel命令查看,會(huì)發(fā)現(xiàn)主節(jié)點(diǎn)還沒(méi)有切換過(guò)來(lái),因?yàn)樯诒l(fā)現(xiàn)主節(jié)點(diǎn)故障并轉(zhuǎn)移,需要一段時(shí)間。

如何理解Redis哨兵技術(shù)

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

如何理解Redis哨兵技術(shù)

但是同時(shí)可以發(fā)現(xiàn),哨兵節(jié)點(diǎn)認(rèn)為新的主節(jié)點(diǎn)仍然有2個(gè)從節(jié)點(diǎn),這是因?yàn)樯诒趯?380切換成主節(jié)點(diǎn)的同時(shí),將6379節(jié)點(diǎn)置為其從節(jié)點(diǎn);雖然6379從節(jié)點(diǎn)已經(jīng)掛掉,但是由于哨兵并不會(huì)對(duì)從節(jié)點(diǎn)進(jìn)行客觀下線(其含義將在原理部分介紹),因此認(rèn)為該從節(jié)點(diǎn)一直存在。當(dāng)6379節(jié)點(diǎn)重新啟動(dòng)后,會(huì)自動(dòng)變成6380節(jié)點(diǎn)的從節(jié)點(diǎn)。下面驗(yàn)證一下。

Step4:重啟6379節(jié)點(diǎn),可以看到6379節(jié)點(diǎn)成為了6380節(jié)點(diǎn)的從節(jié)點(diǎn)。

如何理解Redis哨兵技術(shù)

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

對(duì)于主從節(jié)點(diǎn),主要是slaveof配置的變化:新的主節(jié)點(diǎn)沒(méi)有了slaveof配置,其從節(jié)點(diǎn)則slaveof新的主節(jié)點(diǎn)。

對(duì)于哨兵節(jié)點(diǎn),除了主從節(jié)點(diǎn)信息的變化,紀(jì)元(epoch)也會(huì)變化,下圖中可以看到紀(jì)元相關(guān)的參數(shù)都+1了。

如何理解Redis哨兵技術(shù)

4.總結(jié)

哨兵系統(tǒng)的搭建過(guò)程,有幾點(diǎn)需要注意:

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

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

  • 每個(gè)哨兵節(jié)點(diǎn),只需要配置監(jiān)控主節(jié)點(diǎn),便可以自動(dòng)發(fā)現(xiàn)其他的哨兵節(jié)點(diǎn)和從節(jié)點(diǎn)。

  • 在哨兵節(jié)點(diǎn)啟動(dòng)和故障轉(zhuǎn)移階段,各個(gè)節(jié)點(diǎn)的配置文件會(huì)被重寫(Config Rewrite)。

  • 本章的例子中,一個(gè)哨兵只監(jiān)控了一個(gè)主節(jié)點(diǎn);實(shí)際上,一個(gè)哨兵可以監(jiān)控多個(gè)主節(jié)點(diǎn),通過(guò)配置多條sentinel monitor即可實(shí)現(xiàn)。

三、客戶端訪問(wèn)哨兵系統(tǒng)

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

1.代碼示例

在介紹客戶端的原理之前,先以Java客戶端Jedis為例,演示一下使用方法:下面代碼可以連接我們剛剛搭建的哨兵系統(tǒng),并進(jìn)行各種讀寫操作:

public static void testSentinel throws Exception {  String masterName = "mymaster";  Set<String> 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); //初始化過(guò)程做了很多工作  Jedis jedis = pool.getResource;  jedis.set("key1", "value1");  pool.close;  }

(注:代碼中只演示如何連接哨兵,異常處理、資源關(guān)閉等未考慮)

2.客戶端原理

Jedis客戶端對(duì)哨兵提供了很好的支持。如上述代碼所示,我們只需要向Jedis提供哨兵節(jié)點(diǎn)集合和masterName,構(gòu)造Jedis  SentinelPool對(duì)象;然后便可以像使用普通Redis連接池一樣來(lái)使用了:通過(guò)pool.getResource獲取連接,執(zhí)行具體的命令。

在整個(gè)過(guò)程中,我們的代碼不需要顯式的指定主節(jié)點(diǎn)的地址,就可以連接到主節(jié)點(diǎn);代碼中對(duì)故障轉(zhuǎn)移沒(méi)有任何體現(xiàn),就可以在哨兵完成故障轉(zhuǎn)移后自動(dòng)的切換主節(jié)點(diǎn)。之所以可以做到這一點(diǎn),是因?yàn)樵贘edisSentinelPool的構(gòu)造器中,進(jìn)行了相關(guān)的工作,主要包括以下兩點(diǎn):

遍歷哨兵節(jié)點(diǎn),獲取主節(jié)點(diǎn)信息:遍歷哨兵節(jié)點(diǎn),通過(guò)其中一個(gè)哨兵節(jié)點(diǎn)+masterName獲得主節(jié)點(diǎn)的信息;該功能是通過(guò)調(diào)用哨兵節(jié)點(diǎn)的sentinel get-master-addr-by-name命令實(shí)現(xiàn),該命令示例如下:

如何理解Redis哨兵技術(shù)

一旦獲得主節(jié)點(diǎn)信息,停止遍歷(因此一般來(lái)說(shuō)遍歷到***個(gè)哨兵節(jié)點(diǎn),循環(huán)就停止了)。

增加對(duì)哨兵的監(jiān)聽(tīng):這樣當(dāng)發(fā)生故障轉(zhuǎn)移時(shí),客戶端便可以收到哨兵的通知,從而完成主節(jié)點(diǎn)的切換。具體做法是:利用Redis提供的發(fā)布訂閱功能,為每一個(gè)哨兵節(jié)點(diǎn)開(kāi)啟一個(gè)單獨(dú)的線程,訂閱哨兵節(jié)點(diǎn)的+switch-master頻道,當(dāng)收到消息時(shí),重新初始化連接池。

3.總結(jié)

通過(guò)客戶端原理的介紹,可以加深對(duì)哨兵功能的理解,如下:

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

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

  • 如果是配置提供者,客戶端在通過(guò)哨兵獲得主節(jié)點(diǎn)信息后,會(huì)直接建立到主節(jié)點(diǎn)的連接,后續(xù)的請(qǐng)求(如set/get)會(huì)直接發(fā)向主節(jié)點(diǎn);

  • 如果是代理,客戶端的每一次請(qǐng)求都會(huì)發(fā)向哨兵,哨兵再通過(guò)主節(jié)點(diǎn)處理請(qǐng)求。

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

sentinel monitor mymaster 192.168.92.128 6379 2

改為

sentinel monitor mymaster 127.0.0.1 6379 2

然后,將前述客戶端代碼在局域網(wǎng)的另外一臺(tái)機(jī)器上運(yùn)行,會(huì)發(fā)現(xiàn)客戶端無(wú)法連接主節(jié)點(diǎn);這是因?yàn)樯诒鳛榕渲锰峁┱?,客戶端通過(guò)它查詢到主節(jié)點(diǎn)的地址為127.0.0.1:6379,客戶端會(huì)向127.0.0.1:6379建立Redis連接,自然無(wú)法連接。如果哨兵是代理,這個(gè)問(wèn)題就不會(huì)出現(xiàn)了。

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

四、基本原理

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

1.哨兵節(jié)點(diǎn)支持的命令

哨兵節(jié)點(diǎn)作為運(yùn)行在特殊模式下的Redis節(jié)點(diǎn),其支持的命令與普通的Redis節(jié)點(diǎn)不同。在運(yùn)維中,我們可以通過(guò)這些命令查詢或修改哨兵系統(tǒng);不過(guò)更重要的是,哨兵系統(tǒng)要實(shí)現(xiàn)故障發(fā)現(xiàn)、故障轉(zhuǎn)移等各種功能,離不開(kāi)哨兵節(jié)點(diǎn)之間的通信,而通信的很大一部分是通過(guò)哨兵節(jié)點(diǎn)支持的命令來(lái)實(shí)現(xiàn)的。下面介紹哨兵節(jié)點(diǎn)支持的主要命令:

基礎(chǔ)查詢:

通過(guò)這些命令,可以查詢哨兵系統(tǒng)的拓?fù)浣Y(jié)構(gòu)、節(jié)點(diǎn)信息、配置信息等。

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

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

  • sentinel master mymaster:獲取監(jiān)控的主節(jié)點(diǎn)mymaster的詳細(xì)信息。

  • sentinel slaves mymaster:獲取監(jiān)控的主節(jié)點(diǎn)mymaster的從節(jié)點(diǎn)的詳細(xì)信息。

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

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

  • sentinel is-master-down-by-addr:哨兵節(jié)點(diǎn)之間可以通過(guò)該命令詢問(wèn)主節(jié)點(diǎn)是否下線,從而對(duì)是否客觀下線做出判斷。

增加/移除對(duì)主節(jié)點(diǎn)的監(jiān)控:

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

sentinel remove mymaster2:取消當(dāng)前哨兵節(jié)點(diǎn)對(duì)主節(jié)點(diǎn)mymaster2的監(jiān)控。

強(qiáng)制故障轉(zhuǎn)移:

sentinel failover mymaster:該命令可以強(qiáng)制對(duì)mymaster執(zhí)行故障轉(zhuǎn)移,即便當(dāng)前的主節(jié)點(diǎn)運(yùn)行完好;例如,如果當(dāng)前主節(jié)點(diǎn)所在機(jī)器即將報(bào)廢,便可以提前通過(guò)failover命令進(jìn)行故障轉(zhuǎn)移。

2.基本原理

關(guān)于哨兵的原理,關(guān)鍵是了解以下幾個(gè)概念:

定時(shí)任務(wù):每個(gè)哨兵節(jié)點(diǎn)維護(hù)了3個(gè)定時(shí)任務(wù)。定時(shí)任務(wù)的功能分別如下:通過(guò)向主從節(jié)點(diǎn)發(fā)送info命令獲取***的主從結(jié)構(gòu);通過(guò)發(fā)布訂閱功能獲取其他哨兵節(jié)點(diǎn)的信息;通過(guò)向其他節(jié)點(diǎn)發(fā)送ping命令進(jìn)行心跳檢測(cè),判斷是否下線。

主觀下線:在心跳檢測(cè)的定時(shí)任務(wù)中,如果其他節(jié)點(diǎn)超過(guò)一定時(shí)間沒(méi)有回復(fù),哨兵節(jié)點(diǎn)就會(huì)將其進(jìn)行主觀下線。顧名思義,主觀下線的意思是一個(gè)哨兵節(jié)點(diǎn)“主觀地”判斷下線;與主觀下線相對(duì)應(yīng)的是客觀下線。

客觀下線:哨兵節(jié)點(diǎn)在對(duì)主節(jié)點(diǎn)進(jìn)行主觀下線后,會(huì)通過(guò)sentinel is-master-down-by-addr命令詢問(wèn)其他哨兵節(jié)點(diǎn)該主節(jié)點(diǎn)的狀態(tài);如果判斷主節(jié)點(diǎn)下線的哨兵數(shù)量達(dá)到一定數(shù)值,則對(duì)該主節(jié)點(diǎn)進(jìn)行客觀下線。

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

選舉哨兵節(jié)點(diǎn):當(dāng)主節(jié)點(diǎn)被判斷客觀下線以后,各個(gè)哨兵節(jié)點(diǎn)會(huì)進(jìn)行協(xié)商,選舉出一個(gè)***哨兵節(jié)點(diǎn),并由該***節(jié)點(diǎn)對(duì)其進(jìn)行故障轉(zhuǎn)移操作。

監(jiān)視該主節(jié)點(diǎn)的所有哨兵都有可能被選為***,選舉使用的算法是Raft算法;Raft算法的基本思路是先到先得:即在一輪選舉中,哨兵A向B發(fā)送成為***的申請(qǐng),如果B沒(méi)有同意過(guò)其他哨兵,則會(huì)同意A成為***。選舉的具體過(guò)程這里不做詳細(xì)描述,一般來(lái)說(shuō),哨兵選擇的過(guò)程很快,誰(shuí)先完成客觀下線,一般就能成為***。

故障轉(zhuǎn)移:選舉出的***哨兵,開(kāi)始進(jìn)行故障轉(zhuǎn)移操作,該操作大體可以分為3個(gè)步驟:

  • 在從節(jié)點(diǎn)中選擇新的主節(jié)點(diǎn):選擇的原則是,首先過(guò)濾掉不健康的從節(jié)點(diǎn);然后選擇優(yōu)先級(jí)***的從節(jié)點(diǎn)(由slave-priority指定);如果優(yōu)先級(jí)無(wú)法區(qū)分,則選擇復(fù)制偏移量***的從節(jié)點(diǎn);如果仍無(wú)法區(qū)分,則選擇runid最小的從節(jié)點(diǎn)。

  • 更新主從狀態(tài):通過(guò)slaveof no one命令,讓選出來(lái)的從節(jié)點(diǎn)成為主節(jié)點(diǎn);并通過(guò)slaveof命令讓其他節(jié)點(diǎn)成為其從節(jié)點(diǎn)。

  • 將已經(jīng)下線的主節(jié)點(diǎn)(即6379)設(shè)置為新的主節(jié)點(diǎn)的從節(jié)點(diǎn),當(dāng)6379重新上線后,它會(huì)成為新的主節(jié)點(diǎn)的從節(jié)點(diǎn)。

通過(guò)上述幾個(gè)關(guān)鍵概念,可以基本了解哨兵的工作原理。為了更形象的說(shuō)明,下圖展示了***哨兵節(jié)點(diǎn)的日志,包括從節(jié)點(diǎn)啟動(dòng)到完成故障轉(zhuǎn)移。

如何理解Redis哨兵技術(shù)

五、配置與實(shí)踐建議

1.配置

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

配置1:sentinel monitor {masterName} {masterIp} {masterPort} {quorum}

sentinel   monitor是哨兵最核心的配置,在前文講述部署哨兵節(jié)點(diǎn)時(shí)已說(shuō)明,其中:masterName指定了主節(jié)點(diǎn)名稱,masterIp和masterPort指定了主節(jié)點(diǎn)地址,quorum是判斷主節(jié)點(diǎn)客觀下線的哨兵數(shù)量閾值:當(dāng)判定主節(jié)點(diǎn)下線的哨兵數(shù)量達(dá)到quorum時(shí),對(duì)主節(jié)點(diǎn)進(jìn)行客觀下線。建議取值為哨兵數(shù)量的一半加1。

配置2:sentinel down-after-milliseconds {masterName} {time}

sentinel   down-after-milliseconds與主觀下線的判斷有關(guān):哨兵使用ping命令對(duì)其他節(jié)點(diǎn)進(jìn)行心跳檢測(cè),如果其他節(jié)點(diǎn)超過(guò)down-after-milliseconds配置的時(shí)間沒(méi)有回復(fù),哨兵就會(huì)將其進(jìn)行主觀下線。該配置對(duì)主節(jié)點(diǎn)、從節(jié)點(diǎn)和哨兵節(jié)點(diǎn)的主觀下線判定都有效。

down-after-milliseconds的默認(rèn)值是30000,即30s;可以根據(jù)不同的網(wǎng)絡(luò)環(huán)境和應(yīng)用要求來(lái)調(diào)整:值越大,對(duì)主觀下線的判定會(huì)越寬松,好處是誤判的可能性小,壞處是故障發(fā)現(xiàn)和故障轉(zhuǎn)移的時(shí)間變長(zhǎng),客戶端等待的時(shí)間也會(huì)變長(zhǎng)。例如,如果應(yīng)用對(duì)可用性要求較高,則可以將值適當(dāng)調(diào)小,當(dāng)故障發(fā)生時(shí)盡快完成轉(zhuǎn)移;如果網(wǎng)絡(luò)環(huán)境相對(duì)較差,可以適當(dāng)提高該閾值,避免頻繁誤判。

配置3:sentinel parallel - syncs {masterName} {number}

sentinel   parallel-syncs與故障轉(zhuǎn)移之后從節(jié)點(diǎn)的復(fù)制有關(guān):它規(guī)定了每次向新的主節(jié)點(diǎn)發(fā)起復(fù)制操作的從節(jié)點(diǎn)個(gè)數(shù)。例如,假設(shè)主節(jié)點(diǎn)切換完成之后,有3個(gè)從節(jié)點(diǎn)要向新的主節(jié)點(diǎn)發(fā)起復(fù)制;如果parallel-syncs=1,則從節(jié)點(diǎn)會(huì)一個(gè)一個(gè)開(kāi)始復(fù)制;如果parallel-syncs=3,則3個(gè)從節(jié)點(diǎn)會(huì)一起開(kāi)始復(fù)制。

parallel-syncs取值越大,從節(jié)點(diǎn)完成復(fù)制的時(shí)間越快,但是對(duì)主節(jié)點(diǎn)的網(wǎng)絡(luò)負(fù)載、硬盤負(fù)載造成的壓力也越大;應(yīng)根據(jù)實(shí)際情況設(shè)置。例如,如果主節(jié)點(diǎn)的負(fù)載較低,而從節(jié)點(diǎn)對(duì)服務(wù)可用的要求較高,可以適量增加parallel-syncs取值。parallel-syncs的默認(rèn)值是1。

配置4:sentinel failover - timeout {masterName} {time}

sentinel   failover-timeout與故障轉(zhuǎn)移超時(shí)的判斷有關(guān),但是該參數(shù)不是用來(lái)判斷整個(gè)故障轉(zhuǎn)移階段的超時(shí),而是其幾個(gè)子階段的超時(shí),例如如果主節(jié)點(diǎn)晉升從節(jié)點(diǎn)時(shí)間超過(guò)timeout,或從節(jié)點(diǎn)向新的主節(jié)點(diǎn)發(fā)起復(fù)制操作的時(shí)間(不包括復(fù)制數(shù)據(jù)的時(shí)間)超過(guò)timeout,都會(huì)導(dǎo)致故障轉(zhuǎn)移超時(shí)失敗。

failover-timeout的默認(rèn)值是180000,即180s;如果超時(shí),則下一次該值會(huì)變?yōu)樵瓉?lái)的2倍。

配置5:除上述幾個(gè)參數(shù)外,還有一些其他參數(shù),如安全驗(yàn)證相關(guān)的參數(shù),這里不做介紹。

2.實(shí)踐建議

  • 哨兵節(jié)點(diǎn)的數(shù)量應(yīng)不止一個(gè)。一方面增加哨兵節(jié)點(diǎn)的冗余,避免哨兵本身成為高可用的瓶頸;另一方面減少對(duì)下線的誤判。此外,這些不同的哨兵節(jié)點(diǎn)應(yīng)部署在不同的物理機(jī)上。

  • 哨兵節(jié)點(diǎn)的數(shù)量應(yīng)該是奇數(shù),便于哨兵通過(guò)投票做出“決策”:***選舉的決策、客觀下線的決策等。

  • 各個(gè)哨兵節(jié)點(diǎn)的配置應(yīng)一致,包括硬件、參數(shù)等;此外,所有節(jié)點(diǎn)都應(yīng)該使用ntp或類似服務(wù),保證時(shí)間準(zhǔn)確、一致。

  • 哨兵的配置提供者和通知客戶端功能,需要客戶端的支持才能實(shí)現(xiàn),如前文所說(shuō)的Jedis;如果開(kāi)發(fā)者使用的庫(kù)未提供相應(yīng)支持,則可能需要開(kāi)發(fā)者自己實(shí)現(xiàn)。

  • 當(dāng)哨兵系統(tǒng)中的節(jié)點(diǎn)在Docker(或其他可能進(jìn)行端口映射的軟件)中部署時(shí),應(yīng)特別注意端口映射可能會(huì)導(dǎo)致哨兵系統(tǒng)無(wú)法正常工作,因?yàn)樯诒墓ぷ骰谂c其他節(jié)點(diǎn)的通信,而Docker的端口映射可能導(dǎo)致哨兵無(wú)法連接到其他節(jié)點(diǎn)。例如,哨兵之間互相發(fā)現(xiàn),依賴于它們對(duì)外宣稱的IP和port,如果某個(gè)哨兵A部署在做了端口映射的Docker中,那么其他哨兵使用A宣稱的port無(wú)法連接到A。

在主從復(fù)制的基礎(chǔ)上,哨兵引入了主節(jié)點(diǎn)的自動(dòng)故障轉(zhuǎn)移,進(jìn)一步提高了Redis的高可用性;但是哨兵的缺陷同樣很明顯:哨兵無(wú)法對(duì)從節(jié)點(diǎn)進(jìn)行自動(dòng)故障轉(zhuǎn)移,在讀寫分離場(chǎng)景下,從節(jié)點(diǎn)故障會(huì)導(dǎo)致讀服務(wù)不可用,需要我們對(duì)從節(jié)點(diǎn)做額外的監(jiān)控、切換操作。

以上就是如何理解Redis哨兵技術(shù),小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見(jiàn)到或用到的。希望你能通過(guò)這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

當(dāng)前文章:如何理解Redis哨兵技術(shù)
文章路徑:http://www.muchs.cn/article0/phddio.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供搜索引擎優(yōu)化、云服務(wù)器、、外貿(mào)建站微信公眾號(hào)、企業(yè)網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

綿陽(yáng)服務(wù)器托管