redis-09-哨兵模式

[TOC]

1 哨兵模式能做什么?

在上一篇文章中介紹的redis主從復(fù)制(http://blog.csdn.net/hylexus/article/details/69360701)雖然可以達(dá)到主從復(fù)制的目的俐银。

但是并沒(méi)有考慮高可用船响,也就是說(shuō):當(dāng)主機(jī)宕機(jī)后碎浇,備機(jī)不能及時(shí)自動(dòng)頂替主機(jī)讥裤,這當(dāng)然不行的宅静。

這里介紹的redis的哨兵模式能夠在后臺(tái)監(jiān)控主機(jī)是否發(fā)生故障,如果發(fā)生故障了涌乳,可以及時(shí)根據(jù)投票數(shù)自動(dòng)將從庫(kù)轉(zhuǎn)換為主庫(kù)蜻懦。從而在一定意義上達(dá)到高可用

2 哨兵模式相關(guān)的知識(shí)點(diǎn)

2.1 哨兵提供的功能

  • 監(jiān)控(monitoring)
    • 定期檢查監(jiān)控的master和slave的狀態(tài)
  • 通知(notification)
    • 當(dāng)檢測(cè)到故障時(shí)可以發(fā)送通知
  • 自動(dòng)故障轉(zhuǎn)移(auto-failover)
    • 檢測(cè)到master不能工作時(shí),可以將master的下屬slave中的一個(gè)升級(jí)為master
    • 客戶端連接已經(jīng)不可用的master時(shí),想客戶端返回新的master地址
  • 自動(dòng)發(fā)現(xiàn)其他sentinel和從服務(wù)器
    • Sentinel 可以通過(guò)發(fā)布與訂閱功能來(lái)自動(dòng)發(fā)現(xiàn)正在監(jiān)視相同主服務(wù)器的其他 Sentinel
    • Sentinel 可以通過(guò)詢問(wèn)主服務(wù)器來(lái)獲得所有從服務(wù)器的信息
  • sentinel配置自動(dòng)持久化
    • 當(dāng) Sentinel 接收到一個(gè)新的配置夕晓, 或者當(dāng)領(lǐng)頭 Sentinel 為主服務(wù)器創(chuàng)建一個(gè)新的配置時(shí)宛乃, 這個(gè)配置會(huì)與配置紀(jì)元一起被保存到磁盤(pán)里面
    • 停止和重啟 Sentinel 進(jìn)程都是安全的

2.2 主觀下線和客觀下線

sentinel會(huì)定時(shí)向其所監(jiān)控的服務(wù)器發(fā)送ping命令以詢問(wèn)服務(wù)器是否還正常地活著.

如果服務(wù)器的回應(yīng)是有效回復(fù),則認(rèn)為該服務(wù)器還正常地活著.有效回復(fù)有以下三類:

  • 返回+PONG
  • 返回-LOADING
  • 返回-MASTERDOWN

換言之:如果服務(wù)器的回應(yīng)不是以上三種之一,或者在指定的時(shí)間內(nèi)沒(méi)有回復(fù),都將被認(rèn)為是無(wú)效的回復(fù).

另外需要注意的是:

如果 master-down-after-milliseconds 選項(xiàng)的值為 60000 ms60 s)征炼, 那么即使服務(wù)器在第59 s時(shí)返回至少一次有效回復(fù)析既, 這個(gè)服務(wù)器就仍然會(huì)被認(rèn)為是處于正常狀態(tài)的。

主觀下線和客觀下線

  • 主觀下線(Subjectively Down==sdown):?jiǎn)蝹€(gè) Sentinel 實(shí)例對(duì)服務(wù)器做出的下線判斷
  • 客觀下線(Objectively Down==odown):多個(gè) Sentinel 實(shí)例都對(duì)某服務(wù)器得出sdown的判斷

2.3 哨兵配置文件

配置文件中的選項(xiàng)

  • down-after-milliseconds : 多少毫秒內(nèi)得不到服務(wù)器的回應(yīng)時(shí)sentinel可以認(rèn)為該服務(wù)器已經(jīng)下線
  • parallel-syncs : 在完成故障轉(zhuǎn)移時(shí)最多可以有幾個(gè)slave從新的master同步數(shù)據(jù)
  • myid :sentinel自身的ID,和zookeeper集群中的myid類似
  • port :指定sentinel的端口(默認(rèn)是redis示例端口前加個(gè)2比如26379)

一點(diǎn)說(shuō)明

其實(shí)你可以指定一個(gè)最小化的配置,其他的配置項(xiàng)redis會(huì)幫你生成谆奥。

比如渡贾,你可以只指定sentinel monitor <name> <host> <port> <count>.其他項(xiàng)都會(huì)自動(dòng)生成.

當(dāng)然,你最好將保護(hù)模式關(guān)閉雄右。

配置文件示例

# 哨兵自己的id,和zookeeper中的myid類似
sentinel myid 37a94ac96520c311ca2976d56e716e3bbb4e9111
# 關(guān)閉保護(hù)模式(和redis.conf中的配置類似)
protected-mode no
# 監(jiān)控名為master-test的集群
sentinel monitor master-test 192.168.1.131 6379 2
# 多少毫秒內(nèi)sentinel可以認(rèn)為他監(jiān)控的對(duì)象已經(jīng)斷線
sentinel down-after-milliseconds master-test 10000
# 故障轉(zhuǎn)移的超時(shí)時(shí)間
sentinel failover-timeout master-test 10000

2.4 故障轉(zhuǎn)移過(guò)程

  • 檢測(cè)到master已經(jīng)進(jìn)入sdown(客觀下線)狀態(tài)
  • 對(duì)當(dāng)前紀(jì)元進(jìn)行自增,并嘗試成為leader-sentinel
    • 沒(méi)能成為leader-sentinel
      • 在設(shè)定的failover-timeout的兩倍之后纺讲, 重新嘗試
    • 成功成為leader-sentinel
      • 選出一個(gè)slave擂仍,并升級(jí)為master
      • 通過(guò)發(fā)布與訂閱功能, 將更新后的配置傳播給所有其他 Sentinel 熬甚, 其他 Sentinel 對(duì)它們自己的配置進(jìn)行更新
      • 向已下線主服務(wù)器的從服務(wù)器發(fā)送 SLAVEOF 命令逢渔, 讓它們?nèi)?fù)制新的主服務(wù)器
      • 當(dāng)所有從服務(wù)器都已經(jīng)開(kāi)始復(fù)制新的主服務(wù)器時(shí), leader-sentinel 終止這次故障轉(zhuǎn)移操作

3 配置示例

3.1 說(shuō)明

sentinel-preview
  • 為方便操作此處用主機(jī)名代替IP操作
  • 整個(gè)結(jié)構(gòu)還是上一篇文章中的一主二從
  • 三個(gè)redis分別位于三臺(tái)主機(jī)上

3.2 配置

  • 哨兵配置文件(三臺(tái)主機(jī)是一致的)
sentinel monitor master-test h1 6379 2
protected-mode no
# 以下兩項(xiàng)不是必須的(此處只是為了較快的看到變化才縮短了時(shí)間配置)
sentinel down-after-milliseconds master-test 10000
sentinel failover-timeout master-test 10000

3.3 啟動(dòng)

  • 啟動(dòng)redis實(shí)例
# 啟動(dòng)master
[root@h1 redis]$ redis-server redis.conf 
# 啟動(dòng)slave h1
[root@h2 redis]$ redis-server redis.conf --slaveof h1 6379
# 啟動(dòng)slave h2
[root@h3 redis]$ redis-server redis.conf --slaveof h1 6379
  • 啟動(dòng)sentinel實(shí)例(三臺(tái)機(jī)器一樣的命令)
[root@h1 redis]$ redis-sentinel sentinel.conf

此時(shí)可以看看redis自動(dòng)生成的哨兵配置文件內(nèi)容:

[root@h1 redis]$ cat sentinel.conf
port 26379
sentinel myid 37a94ac96520c311ca2976d56e716e3bbb4e9111
protected-mode no
# Generated by CONFIG REWRITE
dir "/data/redis"
sentinel monitor master-test 192.168.1.131 6379 2
sentinel down-after-milliseconds master-test 10000
sentinel failover-timeout master-test 10000
sentinel config-epoch master-test 4
sentinel leader-epoch master-test 4
sentinel known-slave master-test 192.168.1.132 6379
sentinel known-slave master-test 192.168.1.133 6379
sentinel known-sentinel master-test 192.168.1.132 26379 ac72dd0def3cf1ee47bab9dba9d4454693a2c222
sentinel known-sentinel master-test 192.168.1.133 26379 3dcc2ef2b3aff48d61afb0ae041ce08e59e4b333
sentinel current-epoch 4
  • sentinel的日志輸出
# 當(dāng)前sentinel的ID
Sentinel ID is 37a94ac96520c311ca2976d56e716e3bbb4e9111
# 當(dāng)前監(jiān)控的master
+monitor master master-test 192.168.1.133 6379 quorum 2
# 檢測(cè)到了其他的sentinel
+sentinel sentinel ac72dd0def3cf1ee47bab9dba9d4454693a2c222 192.168.1.132 26379 @ master-test 192.168.1.133 6379
# 檢測(cè)到了其他的sentinel
+sentinel sentinel 3dcc2ef2b3aff48d61afb0ae041ce08e59e4b333 192.168.1.133 26379 @ master-test 192.168.1.133 6379
# 檢測(cè)到的master的下屬slave
+slave slave 192.168.1.132:6379 192.168.1.132 6379 @ master-test 192.168.1.131 6379
+slave slave 192.168.1.133:6379 192.168.1.133 6379 @ master-test 192.168.1.131 6379

3.4 測(cè)試

  • 手動(dòng)停止主機(jī)h1
[root@h1 redis]$ redis-cli shutdown

此時(shí)看看h1上哨兵的日志輸出:

# h1主觀下線
+sdown master master-test 192.168.1.131 6379
# h1客觀下線
+odown master master-test 192.168.1.131 6379 #quorum 3/2
# 開(kāi)始嘗試故障轉(zhuǎn)移
+try-failover master master-test 192.168.1.131 6379
………………
# 最終將h2選為新的master
+switch-master master-test 192.168.1.131 6379 192.168.1.132 6379
  • 再次啟動(dòng)h1
[root@h1 redis]$ redis-server redis.conf

此時(shí)可以看到類似如下輸出:

# h1的主觀下線狀態(tài)被取消
-sdown slave 192.168.1.131:6379 192.168.1.131 6379 @ master-test 192.168.1.132 6379
# 原來(lái)的master(h1)回來(lái)后被轉(zhuǎn)成了當(dāng)前master(h2)的slave
+convert-to-slave slave 192.168.1.131:6379 192.168.1.131 6379 @ master-test 192.168.1.132 6379
  • 同時(shí)還有一點(diǎn)更牛逼的是:
# 此時(shí)查看h1上redis的配置文件中關(guān)于slave的配置已經(jīng)被自動(dòng)修改了
[root@h1 redis]$ cat redis.conf | grep slaveof
# Master-Slave replication. Use slaveof to make a Redis instance a copy of
# slaveof <masterip> <masterport>
# slaveof h1 6379
slaveof 192.168.1.132 6379 # *****這個(gè)是自動(dòng)修改過(guò)的****
[root@h1 redis]$  

# h3的配置文件也被修改過(guò)了
[root@h3 redis]$ cat redis.conf | grep slaveof
# Master-Slave replication. Use slaveof to make a Redis instance a copy of
# slaveof <masterip> <masterport>
slaveof 192.168.1.132 6379
[root@h3 redis]$ 

3.5 sentinel日志輸出

以下內(nèi)容來(lái)自:http://www.redis.cn/topics/sentinel.html

  • +reset-master :主服務(wù)器已被重置
  • +slave :一個(gè)新的從服務(wù)器已經(jīng)被 Sentinel 識(shí)別并關(guān)聯(lián)。
  • +failover-state-reconf-slaves :故障轉(zhuǎn)移狀態(tài)切換到了 reconf-slaves 狀態(tài)乡括。
  • +failover-state-select-slave :故障轉(zhuǎn)移操作現(xiàn)在處于 select-slave 狀態(tài) —— Sentinel 正在尋找可以升級(jí)為主服務(wù)器的從服務(wù)器肃廓。
  • failover-state-send-slaveof-noone :Sentinel 正在將指定的從服務(wù)器升級(jí)為主服務(wù)器,等待升級(jí)功能完成诲泌。
  • failover-end-for-timeout :故障轉(zhuǎn)移因?yàn)槌瑫r(shí)而中止
  • failover-end :故障轉(zhuǎn)移操作順利完成盲赊。所有從服務(wù)器都開(kāi)始復(fù)制新的主服務(wù)器了
  • no-good-slave :Sentinel 操作未能找到適合進(jìn)行升級(jí)的從服務(wù)器。Sentinel 會(huì)在一段時(shí)間之后再次嘗試尋找合適的從服務(wù)器來(lái)進(jìn)行升級(jí)敷扫,又或者直接放棄執(zhí)行故障轉(zhuǎn)移操作哀蘑。
  • +sentinel :一個(gè)監(jiān)視給定主服務(wù)器的新 Sentinel 已經(jīng)被識(shí)別并添加。
  • +sdown :給定的實(shí)例現(xiàn)在處于主觀下線狀態(tài)葵第。
  • -sdown :給定的實(shí)例已經(jīng)不再處于主觀下線狀態(tài)绘迁。
  • +odown :給定的實(shí)例現(xiàn)在處于客觀下線狀態(tài)。
  • -odown :給定的實(shí)例已經(jīng)不再處于客觀下線狀態(tài)卒密。

總結(jié)

主從復(fù)制+哨兵可以解決高可用和部分高性能缀台。

之所以說(shuō)是部分高性能是因?yàn)橹鲝膹?fù)制可以提供讀的性能,但是寫(xiě)操作依然是單點(diǎn)master負(fù)責(zé)哮奇。

后續(xù)的有關(guān)redis集群的文章將介紹這方面的內(nèi)容膛腐。

參考資料

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市屏镊,隨后出現(xiàn)的幾起案子依疼,更是在濱河造成了極大的恐慌,老刑警劉巖而芥,帶你破解...
    沈念sama閱讀 221,198評(píng)論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件律罢,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)误辑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門(mén)沧踏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人巾钉,你說(shuō)我怎么就攤上這事翘狱。” “怎么了砰苍?”我有些...
    開(kāi)封第一講書(shū)人閱讀 167,643評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵潦匈,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我赚导,道長(zhǎng)茬缩,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,495評(píng)論 1 296
  • 正文 為了忘掉前任吼旧,我火速辦了婚禮凰锡,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘圈暗。我一直安慰自己掂为,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,502評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布员串。 她就那樣靜靜地躺著勇哗,像睡著了一般。 火紅的嫁衣襯著肌膚如雪寸齐。 梳的紋絲不亂的頭發(fā)上智绸,一...
    開(kāi)封第一講書(shū)人閱讀 52,156評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音访忿,去河邊找鬼瞧栗。 笑死,一個(gè)胖子當(dāng)著我的面吹牛海铆,可吹牛的內(nèi)容都是我干的迹恐。 我是一名探鬼主播,決...
    沈念sama閱讀 40,743評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼卧斟,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼殴边!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起珍语,我...
    開(kāi)封第一講書(shū)人閱讀 39,659評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤锤岸,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后板乙,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體是偷,經(jīng)...
    沈念sama閱讀 46,200評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡拳氢,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,282評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蛋铆。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片馋评。...
    茶點(diǎn)故事閱讀 40,424評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖刺啦,靈堂內(nèi)的尸體忽然破棺而出留特,到底是詐尸還是另有隱情,我是刑警寧澤玛瘸,帶...
    沈念sama閱讀 36,107評(píng)論 5 349
  • 正文 年R本政府宣布蜕青,位于F島的核電站,受9級(jí)特大地震影響糊渊,放射性物質(zhì)發(fā)生泄漏市咆。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,789評(píng)論 3 333
  • 文/蒙蒙 一再来、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧磷瘤,春花似錦芒篷、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,264評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至扳抽,卻和暖如春篡帕,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背贸呢。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,390評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工镰烧, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人楞陷。 一個(gè)月前我還...
    沈念sama閱讀 48,798評(píng)論 3 376
  • 正文 我出身青樓怔鳖,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親固蛾。 傳聞我的和親對(duì)象是個(gè)殘疾皇子结执,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,435評(píng)論 2 359

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