【Redis哨兵叢集】
目錄
@
***
在開始之前,我們先來看看Redis的主從複製
主從複製原理:
- 從伺服器向主伺服器傳送
SYNC
命令。- 主伺服器接到
SYNC
命令後,會呼叫BGSAVE
命令,建立一個RDB
檔案,並使用緩衝區記錄接下來執行的所有寫命令。- 當主伺服器執行完
BGSAVE
命令後,會向從伺服器傳送RDB
檔案,而從伺服器則會接收並執行這個檔案。- 主伺服器將緩衝區儲存的所有寫命令傳送給從伺服器執行。
---------
Redis主從複製使用的是RDB備份方式來同步主從伺服器的資料的。
同步開始之後,通過主庫命令傳播的方式,主動複製方式實現。
2.8以後實現PSYNC餓機制,實現斷線重連。
Redis主從複製的背景問題
Reids主從複製可將主節點資料同步給從節點,從節點此時有兩個作用:
- 一旦主節點宕機,從節點作為主節點的備份可以隨時頂上來.
- 擴充套件主節點的讀能力,分擔主節點的讀壓力.
.
一旦主節點宕機,從節點上位,那麼就需要人為修改所有應用方的主節點地址(指定新的master地址),還需要命令所有從節點複製新的主節點.
這個問題很麻煩,而redis-sentinel就可以很好的解決這個問題.
*
Redis-Sentinel**
Redis-Sentinel是redis官方推薦的高可用效能解決方案,當用redis做master-slave的高可用時,如果master本機宕機,redis本身或者客戶端都沒有實現主從切換的功能,而redis-sentinel是一個獨立執行的程序,用於監控多個maser-slave叢集,其自動發現master宕機,進行自動切換:slave > master
Sentinel主要功能
- 不時的監控redis是否良好執行,如果節點不可達就會對節點做下線標示.
- 如果被標示的是主節點,則sentinel就會和其它的sentinel節點“協商”,如果其它節點也認為主節點不可達,就會選舉一個sentinel節點來完成自動故障轉移.
- 在master-slave進行切換後,master_redis.conf、slave_redis.conf和sentinel.conf的內容都會發生改變,即master_redis.conf中會多一行slaveof的配置,sentinel.conf的監控目標會隨之調換.
*
Sentinel工作原理**
每一個Sentinel以每秒鐘一次的頻率向它所知的所有Master、Slave以及其它Sentinel例項傳送一個PING命令.
如果一個例項(Instance)距離最後一次有效回覆PING命令的時間超過down-after-milliseconds
選項所指定的值,則這個例項會被Sentinel標記為主觀下線.
如果一個Master被標記為主觀下線,則正在監視這個Master的所有Sentinel都會以每秒一次的頻率確認這個Master的確進入了主觀下線狀態.
當有足夠數量的Sentinel(大於等於配置檔案中指定的值)在指定的時間範圍內確認這個Master的確進入了主觀下線狀態,那麼這個Master會被標記為客觀下線.
在一般情況下,每個Sentinel會以每10秒一次的頻率向它已知的所有Master、Slave傳送INFO命令.
當有Master被Sentinel標記為客觀下線時,Sentinel向下線的Master的所有Slave傳送INFO命令的頻率會從10秒一次改為每秒一次.
若沒有足夠數量的Sentinel同意Master已經下線,則此Master的客觀下線狀態就會被移除.
主觀下線和客觀下線
主觀下線
Subjectively Down,簡稱SDOWN,指的是當前Sentinel例項對某個redis伺服器做出的下線判斷
客觀下線
Objectively Down,簡稱ODOWN,指的是多個Sentinel例項在對Master Server做出SDOWN判斷,並且通過SENTINEL is-master-down-by-addr命令互相交流之後,得出的Master Server下線判斷,然後開啟failover
.
SDOWN
適合於Master和Slave,只要一個Sentinel發現Master進入了ODOWN,這個Sentinel就可能會被其它Sentinel推選出,並對下線的主伺服器執行自動故障遷移操作.
ODOWN
只適用於Master,對於Slave的Redis例項,Sentinel在將它們判斷為下線前不需要進行協商,所以Slave的Sentinel永遠不會到達ODOWN.
主從複製架構圖
Redis Sentinel架構圖
Sentinel是redis一個程序,不儲存資料,只負責監控redis.
關於Redis的釋出訂閱,詳見此文獻【Redis釋出訂閱】
---
開始配置主從複製
搭建環境:
一臺Redis伺服器(版本redis-5.0.2)
三個Redis例項(一個主節點Master,兩個從節點Slave)
配置檔案
***
主節點 7001.confport 7001 daemonize yes logfile /usr/local/redis-5.0.2/logs/7001.log dbfilename dump-7001.rdb dir /usr/local/redis-5.0.2/db/7001/
從節點 7002.conf
port 7002 daemonize yes logfile /usr/local/redis-5.0.2/logs/7002.log dbfilename dump-7002.rdb dir /usr/local/redis-5.0.2/db/7002/ # 指定主節點 slaveof 127.0.0.1 7001
從節點 7003.conf
port 7003 daemonize yes logfile /usr/local/redis-5.0.2/logs/7003.log dbfilename dump-7003.rdb dir /usr/local/redis-5.0.2/db/7003/ # 指定主節點 slaveof 127.0.0.1 7001
驗證主從關係
***
在主節點上檢視主從通訊關係
在從節點上檢視主從通訊關係
此時,一主雙從已經搭建完畢了,可在Master上寫入些資料,然後在Slave檢視.
***
開始配置Redis Sentinel
搭建環境:
包含上面搭建主從的所有環境
還增加了三個redis-sentinel例項(27001.conf、27002.conf、27003.conf)
配置檔案
***
27001.confport 27001 daemonize yes dir "/usr/local/redis-5.0.2/db/" logfile "/usr/local/redis-5.0.2/logs/27001.conf" sentinel monitor mymaster 127.0.0.1 7001 2 # mymaster:主節點的別名 # 當前Sentinel節點監控 127.0.0.1 7001 這個主節點 # 2:表示主節點失敗至少需要2個Sentinel節點同意 sentinel down-after-milliseconds mymaster 30000 # 每個Sentinel節點都要定期發PING命令來判斷Redis資料節點和其餘Sentinel節點是否可達 # 這裡配置為30000毫秒,即超過30秒未收到某個節點的PING命令且未收到回覆,則判定不可達 sentinel parallel-syncs mymaster 1 # 當Sentinel節點集合對主節點故障判定達成一致時,Sentinel領導者節點會做故障轉移操作,選出新的主節點 # 原來的從節點會向新的主節點發起復制操作,限制每次向新的主節點發起復制操作的從節點個數為1 sentinel failover-timeout mymaster 180000 # 設定故障轉移的超時時間為180000毫秒
27002.conf、27003.conf的配置與上面的配置(27001.conf)差異僅在於埠.
啟動哨兵:redis-sentinel 配置檔案
啟動後,哨兵的配置檔案會被重寫入sentinel myid等資訊.
驗證哨兵叢集
***[[email protected] conf]# redis-cli -p 27001 info sentinel # Sentinel sentinel_masters:1 sentinel_tilt:0 sentinel_running_scripts:0 sentinel_scripts_queue_length:0 sentinel_simulate_failure_flags:0 master0:name=mymaster,status=ok,address=127.0.0.1:7003,slaves=2,sentinels=3 # 看到最後一條資訊即正確配置了哨兵叢集 # name=mymaster -> 哨兵別名 # status=ok -> 狀態OK # address=127.0.0.1:7003 -> 監控的地址 # slaves=2 -> 當前有2個從節點 # sentinels=3 -> 當前共有3個哨兵
到這裡,哨兵叢集已經搭建完畢了.
不用說,此時你肯定是想去幹掉主節點了吧,先別慌,我們來看看下面的監控擴撲圖.
監控擴撲圖
驗證故障轉移的大致思路
- 幹掉主節點的Redis程序7001埠,等待
down-after-milliseconds
配置的時間後,觀察從節點是否會進行新的master選舉,進行切換.- 重新恢復舊的“master”節點,檢視此時的redis身份.