1. 程式人生 > >三分鐘帶你入門 redis 高可用架構之哨兵

三分鐘帶你入門 redis 高可用架構之哨兵

什麼是哨兵?

哨兵(Sentinel)是 redis 的高可用性解決方案,前面我們講的主從複製它是高可用的基礎,需要人工介入才能完成故障轉移,哨兵可以解決這個問題,在主從複製情況下,當主節點發生故障時,哨兵可以自動的發現故障並且完成故障轉移,實現真正的 redis 高可用。在哨兵叢集中,哨兵會監視所有的 redis 伺服器和其他 sentinel 節點狀態,來保證 redis 的高可用。

哨兵的搭建

哨兵本質也是一個 redis 服務,只是跟普通的 redis 服務提供了不一樣的功能。哨兵是一個分散式架構,因為你要保證 redis 高可用,首先需要保證自己高可用,所以如果我們需要搭建哨兵的話,最少需要部署三個例項,最好是奇數個,因為在後續的故障轉移中會涉及到投票。

哨兵的配置檔案我們可以在 redis 的 GitHub 專案下下載,在專案下有一個叫做 sentinel.conf 的檔案,可以使用它作為我們哨兵的配置模板,當然你也可以使用 redis.conf 配置檔案,只需要新增哨兵相關配置就好了。

哨兵相關的配置項不多,主要有以下幾個配置項:

// 埠號,預設是 redis 例項+20000,所以我們沿用這個規則就好了
port 26379 
// 是否守護程序執行
daemonize yes 
// 日誌存放的位置,這個非常重要,通過日誌可以檢視故障轉移的過程
logfile "26379.log" 
// 監視一個名為 mymaster(自定義) 的 redis 主伺服器, 這個主伺服器的 IP 地址為 127.0.0.1 , 埠號為 6379 , 
// 最後面的 2 代表著至少有兩個哨兵認為主伺服器出現故障才會進行故障轉移,否則認定主服務未失效
sentinel monitor mymaster 127.0.0.1 6379 2 
// 哨兵判斷伺服器失效的響應時間,超過這個時間未接收到伺服器的迴應,就認為該伺服器失效了
sentinel down-after-milliseconds mymaster 30000 
// 完成故障轉移之後,最多多少個從伺服器可以同時發起資料複製,數字越小,說明完成全部從服務資料複製的時間越長
// 數字越大,對主伺服器的壓力就變大了
sentinel parallel-syncs mymaster 1 
// 故障轉移超時時間
sentinel failover-timeout mymaster 180000

對於每個 Sentinel 例項配置除了 port 和 logfile 不同之外,其他配置項都是一樣的。修改好配置後,我們可以使用 ./redis-sentinel sentinel.conf 命令來啟動哨兵,命令跟 redis 例項啟動差不多,因為哨兵也是 redis 例項,所以我們可以使用 ./redis-cli -p 26379 info sentinel 命令檢視當前的哨兵資訊,如下圖所示:

問題:如何在只配置 master 伺服器的情況下,發現從伺服器和其他 Sentinel ?

從伺服器的發現,Sentinel 可以通過詢問主伺服器來獲取從伺服器的資訊,對於發現其他 Sentinel 節點,則通過釋出與訂閱功能實現,通過向頻道 sentinel:hello 傳送資訊來實現的,主要有以下兩步:

1、每個 Sentinel 每 2 秒會通過釋出與訂閱功能向所有的主服務和從伺服器的 sentinel:hello 頻道傳送一條資訊, 資訊中包含了 Sentinel 的 IP 地址、埠號和執行 ID (runid)

2、每個 Sentinel 都訂閱了被它監視的所有主伺服器和從伺服器的 sentinel:hello 頻道, 查詢之前未出現過的 sentinel (looking for unknown sentinels)。 當一個 Sentinel 發現一個新的 Sentinel 時, 它會將新的 Sentinel 新增到一個列表中, 這個列表儲存了 Sentinel 已知的, 監視同一個主伺服器的所有其他 Sentinel

哨兵故障轉移原理

故障轉移是哨兵的主要工作,這背後的實現邏輯也是非常的複雜,具體的實現邏輯還請檢視相關書籍,我對哨兵的故障轉移總結了以下三點:

1、監聽伺服器

每個 Sentinel 節點每隔 1 秒對主節點、從節點、其他 Sentinel 節點發送 ping 命令做心跳檢測,來判斷伺服器的狀態。

節點也會對 Sentinel 進行相應的回覆,在這些回覆中,以下三種回覆是有效回覆:

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

如果節點在哨兵配置檔案設定的 master-down-after-milliseconds 選項的值內,一直沒有哪怕一次有效回覆,那麼 Sentinel 會把該伺服器標記為下線狀態,我們把這種下線稱為主觀下線,也就是說只有這個 sentinel 認為該伺服器是下線狀態。

如果被主觀下線的伺服器是主伺服器時,sentinel 為了確認這個主伺服器是否真的下線,該 Sentinel 會向其他的同樣監聽主伺服器的 Sentinel 進行詢問,看他們是否也認為主伺服器進入下線狀態,當有足夠多的 Sentinel 都認為主伺服器下線時,該 Sentinel 會將主伺服器判斷為客觀下線,這是真正的下線了,並且會對它進行故障轉移操作。

2、選舉 Sentinel 節點完成轉移任務

故障轉移並不是所有的 sentinel 共同完成,而是選舉出一臺 sentinel 節點作為領導者來完成這次故障轉移,所以當主伺服器被標記為客觀下線時,sentinel 之間就會通過 Raft 演算法選舉出一個領導者來完成故障轉移工作。redis 選舉領頭的 sentinel 的規則和方法大致如下:

  • 所有線上的 sentinel 都有資格被選為領導者,也就是說每個 sentinel 都有成為領導者的機會
  • 當 sentinel 標記主伺服器為主觀下線時,會向其他 Sentinel 節點發送 sentinel is-master-down-by-addr 命令, 要求將自己設定為領導者
  • 收到命令的 Sentinel 節點,採用先到先得的規則,如果沒有同意過其他 Sentinel 節點的 sentinel is-master-down-by-addr 命令,將同意該請求,否則拒絕
  • 如果該 Sentinel 節點發現自己的票數已經超過半數,那麼它將成為領導者
  • 如果在規定時間內,沒有選舉出 sentinel 領導者,那麼將在一段時間後再次選舉,知道選出 sentinel 領導者為止。

3、選舉新 master 伺服器完成故障轉移

選舉出來的 sentinel 領導者將完成剩下的故障轉移工作,故障轉移主要有以下三步:

1、挑選出新的主伺服器

在已下線的主伺服器的所有從伺服器中,挑選出一個從伺服器,並將其轉換為主伺服器,選擇新的主伺服器的規則如下:

  • 在失效主伺服器屬下的從伺服器當中, 那些被標記為主觀下線、已斷線、或者最後一次回覆 PING 命令的時間大於五秒鐘的從伺服器都會被淘汰
  • 在失效主伺服器屬下的從伺服器當中, 那些與失效主伺服器連線斷開的時長超過 down-after 選項指定的時長十倍的從伺服器都會被淘汰
  • 在經歷了以上兩輪淘汰之後剩下來的從伺服器中, 選出複製偏移量(replication offset)最大的那個從伺服器作為新的主伺服器; 如果複製偏移量不可用, 或者從伺服器的複製偏移量相同, 那麼帶有最小執行 ID 的那個從伺服器成為新的主伺服器

對挑選出來的從伺服器執行 slaveof no one 命令,使其成為主節點。

2、修改其他從伺服器的複製目標

當新的主伺服器出現後,sentinel 的領導者下一步需要做的就是,讓其他從伺服器去複製新的主伺服器,通過向其他從伺服器傳送 slaveof new_master port 命令來完成,複製規則和配置檔案的 parallel-syncs 引數有關

3、將舊的主伺服器變成從伺服器
故障轉移操作最後要做的就是將已下線的主伺服器設定為新的主服務的從伺服器,並保持對其關注,等它恢復後命令它去複製新的主節點。

上面就是 redis 哨兵的一些知識,希望看完之後你有所收穫。

最後

目前網際網路上很多大佬都有 Redis 系列教程,如有雷同,請多多包涵了。原創不易,碼字不易,還希望大家多多支援。若文中有所錯誤之處,還望提出,謝謝。

歡迎掃碼關注微信公眾號:「平頭哥的技術博文」,和平頭哥一起學習,一起進步。

相關推薦

分鐘入門 redis 可用架構哨兵

什麼是哨兵? 哨兵(Sentinel)是 redis 的高可用性解決方案,前面我們講的主從複製它是高可用的基礎,需要人工介入才能完成故障轉移,哨兵可以解決這個問題,在主從複製情況下,當主節點發生故障時,哨兵可以自動的發現故障並且完成故障轉移,實現真正的 redis 高可用。在哨兵叢集中,哨兵會監視所有的 re

深入學習Redis可用架構哨兵原理及實踐

在進入正文之前,順便在此給大家推薦一個Java架構方面的交流學習群:698581634,裡面會分享一些資深架構師錄製的視訊錄影:有Spring,MyBatis,Netty原始碼分析,高併發、高效能、分散式、微服務架構的原理,JVM效能優化這些成為架構師必備的知識體系,

分鐘快速入門極簡色彩學

相信很多不懂配色星人(尤其是漢子們),收到女朋友的<祕密花園>塗色指令時內心是奔潰的。 “到底要腫麼配色啊……” (╯‵□′)╯︵┴─┴ “辛辛苦苦塗了半天還是土得掉渣腫麼破……” (╯‵□′)╯︵┴─┴ 那就來看一下我們的極簡色彩學教程吧~ 必GET

分鐘入門TensorFlow

本文是《人人都能學人工智慧-TensorFlow系列》文章的第一篇,這個系列會對TensorFlow的基礎使用,SoftMax,交叉熵,Dropout,CNN,LSTM和NLP等內容進行系列介紹,儘量使用通俗的語言,讓更多的人都能瞭解人工智慧,瞭解TensorFlow。 Tenso

分鐘對 Softmax 劃重點

1. 什麼是Softmax Softmax 在機器學習和深度學習中有著非常廣泛的應用。尤其在處理多分類(C > 2)問題,分類器最後的輸出單元需要Softmax 函式進行數值處理。關於Softmax 函式的定義如下所示: Si=eVi∑CieViS

1分鐘入門JVM效能調優

版本:JDK8 一、閱讀前熱身: 1、瞭解jvm啟動流程: 2、瞭解硬體、系統、程序三個層面的記憶體之間的概要記憶體分配,一張圖你就懂: 3、下面是需要背住的重點,敲黑板!!堆記憶體分配,想了解引數的可以到最下面看下備註和建議: 先來個日誌(看

分鐘真正領略非對稱加密(Asymmetric Encryption)

本人學生黨一枚,在複習作業系統概念時想起來一個相對初學者比較難理解的知識點,非對稱加密,現在來給大家分享一下自己的學習經驗,不對的地方請指正。非對稱加密,主要包含兩個祕鑰,一個是公鑰,一個是私鑰。我當時看到過一個解釋不詳細的比喻,現在分享給大家看一下:Bob先發給保險櫃(Bo

數據讓生活更幸福!分鐘了解智慧城市,交通大數據應用!

行業 都是 小型 駕駛員 大數據量 來源 電信 數據類型 不一定 隨著城市交通人腦的出現,大數據在交通管理和交通運輸領域得到了廣泛的應用。大數據已逐漸成為城市交通管理的基礎資源,在交通管理中日益顯示出其關鍵作用和地位。許多公司對交通數據的理解存在偏見。他們認為大數據就是大數

分鐘看懂公有鏈

小王是一個房地產銷售,他每賣一套房子都需要通過李總在上網登記。但是李總跟另一個銷售小花又是情侶關係,時常小王賣了的房子都會被李總登記在小花銷售的業績上。小王向公司說明了這個問題,但是公司需要小王證明“小王賣掉的房子是小王賣掉的,而不是小花賣掉的”,這個時候小王很頭疼,因為並沒

分鐘分清Mysql 和Oracle之間的誤區

摘要:Mysql 和Oracle,別再傻傻分不清。 mysql 和Oracle 在開發中的使用是隨處可見的,那就簡單去了解一下這倆款火的不行的資料庫。 本質區別: Oracle資料庫是一個物件關係資料庫管理系統(收費) MySQL是一個開源的關係資料庫管理系統(免費) 資料庫的安全性: mysql使用三

實現redis可用主從sentinel

redis sentinel redis主從 redis高可用 sentinel作用 監控(Monitoring): Sentinel 會不斷地檢查你的主服務器和從服務器是否運作正常。 提醒(Notification): 當被監控的某個 Redis 服務器出現問題時, Sentinel 可以

如何構建 Redis 可用架構

1 、題記 Redis 是一個開源的使用 ANSI C 語言編寫、支援網路、可基於記憶體亦可持久化的日誌型、Key-Value 資料庫,並提供多種語言的 API。 如今,網際網路業務的資料正以更快的速度在增長,資料型別越來越豐富,這對資料處理的速度和能力提出了更高要求。Redis 是一種開源

Redis 可用特性 “持久化” 詳解

轉載自  Redis 高可用特性之 “持久化” 詳解 在之前的文章中,介紹了《Redis的記憶體模型》,從這篇文章開始,將依次介紹 Redis 高可用相關的知識——持久化、複製(及讀寫分離)、哨兵、以及叢集。 本文將先說明上述幾種技術分別解決了 Redis 高可用的什麼問

Redis可用架構—Keepalive+VIP

master ace tin 圖片 not per 經典 ron ast 最近整理一下Redis高可用架構的文檔,也準備分享出來,雖然這些架構也不是很復雜。Redis的高可用方案目前主要嘗試過5種方式,其中2種方式已經在線上使用。 1)Redis Master-Slave

三七互娛DBA溫國兵:Redis可用架構最佳實踐

作者:溫國兵,曾任職於酷狗音樂,現為三七互娛 DBA。目前主要關注領域:資料庫自動化運維、高可用架構設計、資料庫安全、海量資料解決方案、以及開源技術在網際網路中的應用。 Redis 是一個開源的使用 ANSI C 語言編寫、支援網路、可基於記憶體亦可持久化的日誌型、Key-Value 資料庫,並提供

Redis可用架構的應用及改進經驗談

針對這個HA架構,應用程式該如何使用呢?這裡介紹一個比較簡單可靠的使用方法。在應用程式(APP)配置裡設定如下資訊: 3個Sentinel的連線方式(不是Redis主庫連線方式) Redis密碼 masterName 說明:如果Sentinel上層使用了LVS,那麼配置裡改為VIP。 應用程式通過和Sen

“一盤沙拉”入門Dagger2(二)引數怎麼辦

系列文章 如果被依賴類的建構函式帶有引數,要把這個引數的型別也管理起來 現在要在Salad裡新加入一個水果Orange,但是Orange的建構函式裡需要傳入一個Knife來

Redis可用架構

前言 Redis是一個高效能的key-value資料庫,現時越來越多企業與應用使用Redis作為快取伺服器。樓主是一枚JAVA後端程式設計師,也算是半個運維工程師了。在Linux伺服器上搭建Redis,怎麼可以不會呢?下面樓主就帶著大家從0開始,依次搭建:Redis單機伺服器 -> Redis主從複製

MySQL可用架構MHA

mysql1、關於MHAMHA(Master HA)是一款開源的MySQL的高可用程序,它為MySQL主從復制架構提供了automating master failover功能。MHA在監控到master節點故障時,會提升其中擁有的最新數據的slave節點成為新的master節點,在此期間,MHA會通過其它從

京東618:商城交易平臺的可用架構

資源 系統 定位問題 修復 tle 峰值 網絡 寫入 差異 據騰訊科技報道,6月18日零點,京東全民年中購物節拉開了高潮的序幕。第一個小時的銷售額超過去年同期的250%。從淩晨開始的海量訂單讓6月1日就拉開序幕的京東年中購物節奏出最強音,大量用戶瞬間湧入,峰值訂單被不斷刷新