您好,登錄后才能下訂單哦!
這篇文章主要介紹“Redis哨兵機制Sentinel的原理和應用”,在日常操作中,相信很多人在Redis哨兵機制Sentinel的原理和應用問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Redis哨兵機制Sentinel的原理和應用”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
在主從復制的模式下,主服務器宕機后,從服務器是不能自動轉為主服務器的,只能手動進行故障轉移
而哨兵機制(Sentinel)就是Redis的高可用解決方案,由一個或多個Sentinel實例組成的Sentinel系統用來管理主服務器以及連接的所有從服務器。可以實現故障發現、故障自動轉移、配置中心和客戶端通知
監控(Monitoring):Sentinel會不斷地檢查你的主服務器和從服務器是否運作正常
提醒(Notification):當被監控的某個Redis服務器出現問題時,Sentinel可以通過API向管理員或者其他應用程序發送通知
自動故障遷移(Automatic failover):當一個主服務器不能正常工作時, Sentinel會開始一次自動故障遷移操作,它會將失效主服務器的其中一個從服務器升級為新的主服務器,并讓失效主服務器的其他從服務器改為復制新的主服務器;當客戶端試圖連接失效的主服務器時,集群也會向客戶端返回新主服務器的地址,使得集群可以使用新主服務器代替失效服務器
看了上圖,我們可以理解哨兵機制就是在復制基礎上的一套監管系統,能及時的進行故障轉移。那么就先了解下,Redis是如何故障判定和故障轉移的
故障判定,也就是Sentinel在做的任務,當一個Sentinel啟動后會定期的去執行以下的任務
每個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實例對服務器做出下線判斷
客觀下線(Objectively Down,ODOWN) 指多個Sentinel實例對服務器做出SDOWN判斷, 并且通過 SENTINEL
is-master-down-by-addr
命令互相交流之后,,得出的服務器下線判斷
我這里是準備了3個虛擬機,1主2從的Redis服務器和3個哨兵實例。官網上是推薦至少部署3個Sentinel實例保證健壯性,具體的地址端口如下
服務 | 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
文件
# 設置為后臺運行 daemonize yes # 綁定的主機地址,這里注釋掉,開放ip連接 #bind 127.0.0.1 # 主服務上可以設置密碼 requirepass 123456
在從服務器上添加主服務器的地址信息
# 設置主服務器的地址 # 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"
到此,關于“Redis哨兵機制Sentinel的原理和應用”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。