1. 程式人生 > >深入Redis:哨兵

深入Redis:哨兵

前言

在 上一文中曾提到,Redis主從複製的作用有資料熱備、負載均衡、故障恢復等;但主從複製存在的一個問題是故障恢復無法自動化。本文將要介紹的哨兵,它基於Redis主從複製,主要作用便是解決主節點故障恢復的自動化問題,進一步提高系統的高可用性。

文章主要內容如下:首先介紹哨兵的作用和架構;然後講述哨兵系統的部署方法,以及通過客戶端訪問哨兵系統的方法;然後簡要說明哨兵實現的基本原理;最後給出關於哨兵實踐的一些建議。文章內容基於Redis 3.0版本。

一、作用和架構

1.  作用

在介紹哨兵之前,首先從巨集觀角度回顧一下Redis實現高可用相關的技術。它們包括:持久化、複製、哨兵和叢集,其主要作用和解決的問題是:

  • 持久化:持久化是最簡單的高可用方法(有時甚至不被歸為高可用的手段),主要作用是資料備份,即將資料儲存在硬碟,保證資料不會因程序退出而丟失。

  • 複製:複製是高可用Redis的基礎,哨兵和叢集都是在複製基礎上實現高可用的。複製主要實現了資料的多機備份,以及對於讀操作的負載均衡和簡單的故障恢復。缺陷:故障恢復無法自動化;寫操作無法負載均衡;儲存能力受到單機的限制。

  • 哨兵:在複製的基礎上,哨兵實現了自動化的故障恢復。缺陷:寫操作無法負載均衡;儲存能力受到單機的限制。

  • 叢集:通過叢集,Redis解決了寫操作無法負載均衡,以及儲存能力受到單機限制的問題,實現了較為完善的高可用方案。

 

下面說回哨兵。

Redis Sentinel,即Redis哨兵,在Redis 2.8版本開始引入。哨兵的核心功能是主節點的自動故障轉移。下面是Redis官方文件對於哨兵功能的描述:

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

  • 自動故障轉移(Automatic failover):當主節點不能正常工作時,哨兵會開始自動故障轉移操作,它會將失效主節點的其中一個從節點升級為新的主節點,並讓其他從節點改為複製新的主節點。

  • 配置提供者(Configuration provider):客戶端在初始化時,通過連線哨兵來獲得當前Redis服務的主節點地址。

  • 通知(Notification):哨兵可以將故障轉移的結果傳送給客戶端。

其中,監控和自動故障轉移功能,使得哨兵可以及時發現主節點故障並完成轉移;而配置提供者和通知功能,則需要在與客戶端的互動中才能體現。

這裡對“客戶端”一詞在文章中的用法做一個說明:在前面的文章中,只要通過API訪問redis伺服器,都會稱作客戶端,包括redis-cli、Java客戶端Jedis等;為了便於區分說明,本文中的客戶端並不包括redis-cli,而是比redis-cli更加複雜:redis-cli使用的是redis提供的底層介面,而客戶端則對這些介面、功能進行了封裝,以便充分利用哨兵的配置提供者和通知功能。

2.  架構

典型的哨兵架構圖如下所示:

它由兩部分組成,哨兵節點和資料節點:

  • 哨兵節點:哨兵系統由一個或多個哨兵節點組成,哨兵節點是特殊的redis節點,不儲存資料。

  • 資料節點:主節點和從節點都是資料節點。

二、部署

這一部分將部署一個簡單的哨兵系統,包含1個主節點、2個從節點和3個哨兵節點。方便起見:所有這些節點都部署在一臺機器上(區域網IP:192.168.92.128),使用埠號區分;節點的配置儘可能簡化。

1.  部署主從節點

哨兵系統中的主從節點,與普通的主從節點配置是一樣的,並不需要做任何額外配置。下面分別是主節點(port=6379)和2個從節點(port=6380/6381)的配置檔案,配置都比較簡單,不再詳述。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

#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

配置完成後,依次啟動主節點和從節點:

1

2

3

redis-server redis-6379.conf

redis-server redis-6380.conf

redis-server redis-6381.conf

節點啟動後,連線主節點檢視主從狀態是否正常,如下圖所示:

2.  部署哨兵節點

哨兵節點本質上是特殊的Redis節點。

3個哨兵節點的配置幾乎是完全一樣的,主要區別在於埠號的不同(26379/26380/26381),下面以26379節點為例介紹節點的配置和啟動方式;配置部分儘量簡化,更多配置會在後面介紹。

1

2

3

4

5

#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 配置的含義是:該哨兵節點監控192.168.92.128:6379這個主節點,該主節點的名稱是mymaster,最後的2的含義與主節點的故障判定有關:至少需要2個哨兵節點同意,才能判定主節點故障並進行故障轉移。

哨兵節點的啟動有兩種方式,二者作用是完全相同的:

1

2

redis-sentinel sentinel-26379.conf

redis-server sentinel-26379.conf --sentinel

按照上述方式配置和啟動之後,整個哨兵系統就啟動完畢了。可以通過redis-cli連線哨兵節點進行驗證,如下圖所示:可以看出26379哨兵節點已經在監控mymaster主節點(即192.168.92.128:6379),並發現了其2個從節點和另外2個哨兵節點。

此時如果檢視哨兵節點的配置檔案,會發現一些變化,以26379為例:

其中,dir只是顯式聲明瞭資料和日誌所在的目錄(在哨兵語境下只有日誌);known-slave和known-sentinel顯示哨兵已經發現了從節點和其他哨兵;帶有epoch的引數與配置紀元有關(配置紀元是一個從0開始的計數器,每進行一次領導者哨兵選舉,都會+1;領導者哨兵選舉是故障轉移階段的一個操作,在後文原理部分會介紹)。

3.  演示故障轉移

哨兵的4個作用中,配置提供者和通知需要客戶端的配合,本文將在下一章介紹客戶端訪問哨兵系統的方法時詳細介紹。這一小節將演示當主節點發生故障時,哨兵的監控和自動故障轉移功能。

(1)首先,使用kill命令殺掉主節點:

(2)如果此時立即在哨兵節點中使用info Sentinel命令檢視,會發現主節點還沒有切換過來,因為哨兵發現主節點故障並轉移,需要一段時間。

(3)一段時間以後,再次在哨兵節點中執行info Sentinel檢視,發現主節點已經切換成6380節點。

但是同時可以發現,哨兵節點認為新的主節點仍然有2個從節點,這是因為哨兵在將6380切換成主節點的同時,將6379節點置為其從節點;雖然6379從節點已經掛掉,但是由於哨兵並不會對從節點進行客觀下線(其含義將在原理部分介紹),因此認為該從節點一直存在。當6379節點重新啟動後,會自動變成6380節點的從節點。下面驗證一下。在此我向大家推薦一個架構學習交流圈:830478757  幫助突破瓶頸 提升思維能力

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

(5)在故障轉移階段,哨兵和主從節點的配置檔案都會被改寫。

對於主從節點,主要是slaveof配置的變化:新的主節點沒有了slaveof配置,其從節點則slaveof新的主節點。

對於哨兵節點,除了主從節點資訊的變化,紀元(epoch)也會變化,下圖中可以看到紀元相關的引數都+1了。

4.  總結

哨兵系統的搭建過程,有幾點需要注意:

(1)哨兵系統中的主從節點,與普通的主從節點並沒有什麼區別,故障發現和轉移是由哨兵來控制和完成的。

(2)哨兵節點本質上是redis節點。

(3)每個哨兵節點,只需要配置監控主節點,便可以自動發現其他的哨兵節點和從節點。

(4)在哨兵節點啟動和故障轉移階段,各個節點的配置檔案會被重寫(config rewrite)。

(5)本章的例子中,一個哨兵只監控了一個主節點;實際上,一個哨兵可以監控多個主節點,通過配置多條sentinel monitor即可實現。

三、客戶端訪問哨兵系統

上一小節演示了哨兵的兩大作用:監控和自動故障轉移,本小節則結合客戶端演示哨兵的另外兩個作用:配置提供者和通知。

1.  程式碼示例

在介紹客戶端的原理之前,先以Java客戶端Jedis為例,演示一下使用方法:下面程式碼可以連線我們剛剛搭建的哨兵系統,並進行各種讀寫操作(程式碼中只演示如何連線哨兵,異常處理、資源關閉等未考慮)。

1

2

3

4

5

6

7

8

9

10

11

12

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); //初始化過程做了很多工作

         Jedis jedis = pool.getResource();

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

         pool.close();

}

2.  客戶端原理

Jedis客戶端對哨兵提供了很好的支援。如上述程式碼所示,我們只需要向Jedis提供哨兵節點集合和masterName,構造JedisSentinelPool物件;然後便可以像使用普通redis連線池一樣來使用了:通過pool.getResource()獲取連線,執行具體的命令。

在整個過程中,我們的程式碼不需要顯式的指定主節點的地址,就可以連線到主節點;程式碼中對故障轉移沒有任何體現,就可以在哨兵完成故障轉移後自動的切換主節點。之所以可以做到這一點,是因為在JedisSentinelPool的構造器中,進行了相關的工作;主要包括以下兩點:

(1)遍歷哨兵節點,獲取主節點資訊:遍歷哨兵節點,通過其中一個哨兵節點+masterName獲得主節點的資訊;該功能是通過呼叫哨兵節點的sentinel get-master-addr-by-name命令實現,該命令示例如下:

一旦獲得主節點資訊,停止遍歷(因此一般來說遍歷到第一個哨兵節點,迴圈就停止了)。

(2)增加對哨兵的監聽:這樣當發生故障轉移時,客戶端便可以收到哨兵的通知,從而完成主節點的切換。具體做法是:利用redis提供的釋出訂閱功能,為每一個哨兵節點開啟一個單獨的執行緒,訂閱哨兵節點的+switch-master頻道,當收到訊息時,重新初始化連線池。

3.  總結

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

(1)配置提供者:客戶端可以通過哨兵節點+masterName獲取主節點資訊,在這裡哨兵起到的作用就是配置提供者。

需要注意的是,哨兵只是配置提供者,而不是代理。二者的區別在於:如果是配置提供者,客戶端在通過哨兵獲得主節點資訊後,會直接建立到主節點的連線,後續的請求(如set/get)會直接發向主節點;如果是代理,客戶端的每一次請求都會發向哨兵,哨兵再通過主節點處理請求。

舉一個例子可以很好的理解哨兵的作用是配置提供者,而不是代理。在前面部署的哨兵系統中,將哨兵節點的配置檔案進行如下修改:

1

2

3

sentinel monitor mymaster 192.168.92.128 6379 2

改為

sentinel monitor mymaster 127.0.0.1 

相關推薦

深入Redis哨兵

前言 在 上一文中曾提到,Redis主從複製的作用有資料熱備、負載均衡、故障恢復等;但主從複製存在的一個問題是故障恢復無法自動化。本文將要介紹的哨兵,它基於Redis主從複製,主要作用便是解決主節點故障恢復的自動化問題,進一步提高系統的高可用性。 文章主要內容如下:首先介紹哨兵的作用和架構;然後講述哨

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

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

深入學習 Redis(4)哨兵

前言 在 深入學習Redis(3):主從複製 中曾提到,Redis主從複製的作用有資料熱備、負載均衡、故障恢復等;但主從複製存在的一個問題是故障恢復無法自動化。本文將要介紹的哨兵,它基於Redis主從複製,主要作用便是解決主節點故障恢復的自動化問題,進一步提高系統的

redis系列哨兵

daemon -o sel 進行 的區別 monitor 參數 解決 發布 1 簡介 Sentinel(哨兵)是Redis 的高可用性解決方案:通過哨兵可以創建一個當主服務器出現故障時自動將從服務器升級為主服務器的一個分布式系統。解決了主從復制出現故障時需要人為幹預的問題。

深入理解Redis哈希結構內存模型剖析

bsp 根據 鏈接 name 長度 string 錯誤 編碼 java 本文主要闡述 Redis中使用 最為頻繁的數據類型:哈希(或稱散列),在Redis內部是怎麽存的。 本文內容腦圖如下: 哈希類型內部編碼詳情 對於 Redis的常用 5 種數據類型(S

redis進化四redis哨兵程序

主從複製完成後,無法實現主從的替換,需要引入redis的哨兵技術。 redis的哨兵邏輯       單獨啟動哨兵的程序,監聽某一個主從的結構,單獨連線主節點,利用info命令檢視主從狀態       rpc心跳(heart

redis叢集哨兵配置

最少配置1主2從3哨兵 一、引言             上一篇文章我們詳細的講解了Redis的主從叢集模式,其實這個叢集模式配置很簡單,只需要在Slave的節點上進行配置,Master主

Redis叢集哨兵機制配置

前置redis單例基本搭建參考部落格:redis基礎服務搭建 redis叢集主要修改配置:主從複製 1. 主機配置 複製一份redis.conf成redis-6379.conf。修改配置: ``` #演示方便,開放ip連線 bind 0.0.0.0 #後

Redis(十一)哨兵模式架構設計分析

  業務最初的應用場景中,我們也許使用單機redis就可以應付業務要求,但並非一直可行。   比如單機的讀寫能力問題,單機的可用性問題,單機的資料安全性問題。這些都是許多網際網路應用經常會遇到的問題,也基本上都有一套理論去解決它,只是百花齊放。   哨兵是Redis中解決高可用問題的解決方案之一,我們就一起來

redis主從+哨兵模式

strong img 目錄 .html 主從模式 命令 onf 模擬 -s 主從模式配置分為手動和配置文件兩種方式進行配置,我現在有192.168.238.128(CentOS1)、192.168.238.131(CentOS3)、192.168.238.132(CentO

Redis五種數據類型的簡單增刪改查

war value tro sts class 例子 list集合 ring one Redis簡單增刪改查例子 例一:字符串的增刪改查 #增加一個key為ay_key的值 127.0.0.1:6379> set ay_key "ay" OK #查詢ay_key的值

NoSQL初探之人人都愛Redis(3)使用Redis作為消息隊列服務場景應用案例

public 系統服務 就是 toolbar logfile manager 客戶端連接 狀態信息 朋友 http://www.cnblogs.com/edisonchou/p/3825682.html 一、消息隊列場景簡介   “消息”是在兩臺

redisjava.util.NoSuchElementException: Unable to validate object

cnblogs exception 127.0.0.1 集群 發布 ping通 component redis集群 date redis.clients.jedis.exceptions.JedisException: Could not get a resource f

redis,1】java操作redis 將string、list、map、自己定義的對象保存到redis

n) spa 存儲 div ber sys mil 操作 write 一、操作string 、list 、map 對象 1、引入jar: jedis-2.1.0.jar 2、代碼 /

深入解讀獲Forrester大數據能力高評價的阿裏雲DataWorks思路與能力

安全 架構 雲服務 摘要: Forrester發布了Now Tech: Cloud Data Warehouse Q1 2018報告,報告對雲化數據倉庫(Cloud Data Warehouse, CDW)的主要功能、區域表現、細分市場和典型客戶等進行了全面評估。 1.前言 本文基於Now Tec

Redis-sentinel哨兵模式集群方案配置

系統/運維 Linux 最近研究了redis的集群方案,第一個方案是創建 redis cluster,第二種方案就是用哨兵模式來進行主從替換以及故障恢復。一、sentinel介紹Redis SentinelSentinel(哨兵)是用於監控redis集群中Master狀態的工具,其已經被集成在redi

Redis哨兵(sentinel)(概念)

redis哨兵 redis-sentinel Redis的哨兵(sentinel) redis的sentinel系統用於管理多個redis服務器實例(instance)。 哨兵適用於非集群結構的redis環境,比如:redis主從環境。 在redis集群中,節點擔當了哨

Redis哨兵部署(sentinel)(實驗)

redis哨兵部署 redis哨兵搭建 redis哨兵使用 redis-sentinel部署 redis-sentinel詳解 首先感謝“吧喱公路”的引導,打開了我對哨兵的理解思路,再次謝謝。Redis的哨兵(sentinel) 哨兵適用於非集群結構的redis環境,比如:re

Redis多線程修改同一個Key使用watch+事務(mutil)實現樂觀鎖

width uno ... ack spool 場景 .html 高並發 遇到的問題 本篇文章是通過watch(監控)+mutil(事務)實現應用於在分布式高並發處理等相關場景。下邊先通過redis-cli.exe來測試多個線程修改時,遇到問題及解決問題。 高並發下修改同

Redis按照正則批量刪除key

而且 nbsp detail ont tro color 開始 del tail Redis按照正則批量刪除key redis目前還不支持批量刪除key的命令,但是我們有時需要刪除符合某個規則的keys,有兩種方式: 1.使用redis-cli keys "test*"