Redis的高可用,哨兵機制Sentinel

上一篇聊了Redis的主從複製以及實現原理,下面會在複製的基礎上來講說Redis的高可用方案:哨兵機制redis

哨兵機制

什麼是哨兵機制

在主從複製的模式下,主服務器宕機後,從服務器是不能自動轉爲主服務器的,只能手動進行故障轉移bash

哨兵機制(Sentinel)就是Redis的高可用解決方案,由一個或多個Sentinel實例組成的Sentinel系統用來管理主服務器以及鏈接的全部從服務器。能夠實現故障發現、故障自動轉移、配置中心和客戶端通知服務器

  • 監控(Monitoring):Sentinel會不斷地檢查你的主服務器和從服務器是否運做正常
  • 提醒(Notification):當被監控的某個Redis服務器出現問題時,Sentinel能夠經過API向管理員或者其餘應用程序發送通知
  • 自動故障遷移(Automatic failover):當一個主服務器不能正常工做時, Sentinel會開始一次自動故障遷移操做,它會將失效主服務器的其中一個從服務器升級爲新的主服務器,並讓失效主服務器的其餘從服務器改成複製新的主服務器;當客戶端試圖鏈接失效的主服務器時,集羣也會向客戶端返回新主服務器的地址,使得集羣能夠使用新主服務器代替失效服務器

看了上圖,咱們能夠理解哨兵機制就是在複製基礎上的一套監管系統,能及時的進行故障轉移。那麼就先了解下,Redis是如何故障斷定和故障轉移的ui

故障斷定

故障斷定,也就是Sentinel在作的任務,當一個Sentinel啓動後會按期的去執行如下的任務spa

  • 每一個Sentinel進程會以每秒一次的頻率向已知的主服務器、從服務器以及其餘的Sentinel實例發送一個PING命令
  • 每一個實例(instance)距離最後一次有效回覆PING命令的時間超過down-after-milliseconds選項所指定的值,那麼該實例會被標記爲主觀下線。一個有效回覆能夠是:+PONG-LOADING或者-MASTERDOWN
  • 若是一個Master主服務器被標記爲主觀下線,那麼監視該主服務器的全部的Sentinel會以每秒一次的頻率確認主服務器的確是進入主線下線狀態
  • 若是有足夠數量的Sentinel(至少達到配置文件指定的數量)在指定時間範圍內確認一個Master主服務器爲主觀下線狀態,那麼該主服務器被標記爲客觀下線
  • 通常狀況下,每一個Sentinel會每10秒一次的頻率向已知的主服務器和從服務器發送INFO命令,當一個主服務器被標記爲客觀下線時,發送INFO命令的頻率會改成每秒一次
  • 沒有足夠數量的Sentinel贊成主服務器下線,主服務器的客觀下線狀態會被移除;當主服務器從新向Sentinel的PING命令返回有效回覆,主服務器的主觀下線狀態就會被移除

主觀下線(Subjectively Down,SDOWN) 指單個Sentinel實例對服務器作出下線判斷debug

客觀下線(Objectively Down,ODOWN) 指多個Sentinel實例對服務器作出SDOWN判斷, 而且經過 SENTINEL is-master-down-by-addr命令互相交流以後,,得出的服務器下線判斷code

搭建哨兵實例

準備

我這裏是準備了3個虛擬機,1主2從的Redis服務器和3個哨兵實例。官網上是推薦至少部署3個Sentinel實例保證健壯性,具體的地址端口以下cdn

服務 ip port
Redis(master) 192.168.249.20 6379
Redis 192.168.249.21 6379
Redis 192.168.249.22 6379
Sentinel 192.168.249.20 26379
Sentinel 192.168.249.21 26379
Sentinel 192.168.249.22 26379

1主2從的Redis服務的配置以下,修改一下redis.conf文件server

# 設置爲後臺運行
daemonize yes
# 綁定的主機地址,這裏註釋掉,開放ip鏈接
#bind 127.0.0.1

# 主服務上能夠設置密碼
requirepass 123456
複製代碼

在從服務器上添加主服務器的地址信息blog

# 設置主服務器的地址
# replicaof <masterip> <masterport>
replicaof 192.168.249.20 6379
# 設置主服務器的密碼
# masterauth <master-password>
masterauth 123456
複製代碼

3個哨兵的配置都是同樣的,能夠從Redis的安裝目錄拷貝一份sentinel.conf,修改內容以下,主要是配置下主服務器的地址

# 設置爲後臺運行
daemonize yes
logfile "26379.log"
# 設置主服務器的地址,quorum爲2表示當有2個或以上的哨兵認爲主服務器不可用時,才進行故障轉移操做
# sentinel monitor <master-name> <ip> <redis-port> <quorum>
sentinel monitor mymaster 192.168.249.20 6379 2
# 設置服務器密碼
# sentinel auth-pass <master-name> <password>
sentinel auth-pass mymaster 123456

# 指定了 Sentinel 認爲服務器已經斷線所需的毫秒數
# sentinel down-after-milliseconds <master-name> <milliseconds>
sentinel down-after-milliseconds mymaster 30000
# 指定了在執行故障轉移時,最多能夠有多少個從服務器同時對新的主服務器進行同步, 這個數字越小,完成故障轉移所需的時間就越長。可是若是這個數字越大,就意味着越多的slave由於replication而不可用。
# 能夠經過將這個值設爲 1 來保證每次只有一個slave 處於不能處理命令請求的狀態
# sentinel parallel-syncs <master-name> <numreplicas>
sentinel parallel-syncs mymaster 1
# 指定故障轉移超時時間
# sentinel failover-timeout <master-name> <milliseconds>
sentinel failover-timeout mymaster 180000
複製代碼

Sentinel可用經過Redis實例的發佈/訂閱功能自動發現一樣在監控主服務器的其餘Sentinel,以及能夠經過主服務器獲取其餘從服務器的信息,因此咱們只需配置主服務器的地址便可

啓動

啓動順序分別是:主服務器,從服務器,而後是3個哨兵進程

啓動Redis服務

./redis-server ../redis.conf
複製代碼

Sentinel其實也是一個Redis服務,能夠看作一個特殊模式的Redis服務,啓動的命令有兩種

./redis-server ../sentinel.conf --sentinel

./redis-sentinel ../sentinel.conf
複製代碼

這兩種方式啓動哨兵的效果都是同樣的,在啓動運行時必需要使用配置文件,由於系統須要這個文件來保存當前狀態,以便重啓時加載

查看主機狀態

咱們能夠用客戶端鏈接哨兵,使用sentinel master <master-name>查看其監視的主服務器的狀態

$ ./redis-cli -h 192.168.249.20 -p 26379
192.168.249.20:26379> sentinel master mymaster
 1) "name"
 2) "mymaster"
 3) "ip"
 4) "192.168.249.20"
 5) "port"
 6) "6379"
 7) "runid"
 8) "2a58b746fe9c963e69887efbc877aa3143eb6ec6"
 9) "flags"
10) "master"
11) "link-pending-commands"
12) "0"
13) "link-refcount"
14) "1"
15) "last-ping-sent"
16) "0"
17) "last-ok-ping-reply"
18) "167"
19) "last-ping-reply"
20) "167"
21) "down-after-milliseconds"
22) "30000"
23) "info-refresh"
24) "2941"
25) "role-reported"
26) "master"
27) "role-reported-time"
28) "2006632"
29) "config-epoch"
30) "0"
31) "num-slaves"
32) "2"
33) "num-other-sentinels"
34) "2"
35) "quorum"
36) "2"
37) "failover-timeout"
38) "180000"
39) "parallel-syncs"
40) "1"
複製代碼

咱們看到關於主服務器的一些監控信息

num-slaves爲從服務器的數量;num-other-sentinels其餘哨兵的數量;flags標記爲master,當主機掉線了,會變爲s_down或o_down

另外,想查看其餘從服務器和其餘哨兵的狀態,能夠用如下的命令

sentinel slaves <master-name>
sentinel sentinels <master-name>
複製代碼

故障轉移

咱們能夠手動模擬一下,當主服務器掛了,故障故障轉移狀況。

想要獲取當前主服務器的地址信息,客戶端能夠使用sentinel get-master-addr-by-name <master-name>命令

192.168.249.20:26379> sentinel get-master-addr-by-name mymaster
1) "192.168.249.20"
2) "6379"
複製代碼

能夠看到當前的主服務地址爲192.168.249.20,這時咱們手動關閉該服務,或者使用如下命令讓服務器睡眠40秒

$ ./redis-cli -h 192.168.249.20  -p 6379
192.168.249.20:6379> auth 123456
OK
192.168.249.20:6379> debug sleep 40
OK
(40.01s)
複製代碼

這個時候咱們再次查看主服務的地址時,應該是能夠看到不一樣信息

192.168.249.20:26379> sentinel get-master-addr-by-name mymaster
1) "192.168.249.22"
2) "6379"
複製代碼
相關文章
相關標籤/搜索