昨天學(xué)習了 Redis 簡單的集群架構(gòu). 但是有一些缺點, 就是在主節(jié)點掛了后, 需要手動的配置從節(jié)點將其變?yōu)橹鞴?jié)點. 那么今天學(xué)的這個, 就可以解決這個手動配置的過程. 也就是哨兵架構(gòu). 它是一種用于管理多個 Redis服務(wù)器的系統(tǒng), 它提供了一種機制, 可以自動切換主節(jié)點. 當主節(jié)點出現(xiàn)故障時, 可以自動從從節(jié)點中選擇一個作為新的主節(jié)點.
1. 什么是哨兵架構(gòu)
哨兵架構(gòu)sentinel 是一種高可用性解決方案. 當主節(jié)點出現(xiàn)故障時, 哨兵架構(gòu)sentinel可以自動將系統(tǒng)切換到從節(jié)點, 從而保證系統(tǒng)的持續(xù)運行. 此外, 哨兵架構(gòu)sentinel還可以幫助開發(fā)者監(jiān)控Redis服務(wù)器的運行狀態(tài), 發(fā)送通知, 記錄事件等.
哨兵架構(gòu)sentinel的工作原理是通過哨兵進程來實現(xiàn)的.
哨兵進程是一個獨立的進程, 它定期檢查主節(jié)點和從節(jié)點的狀態(tài). 當主節(jié)點出現(xiàn)故障時,哨兵進程會從從節(jié)點中選擇一個作為新的主節(jié)點, 并更新配置信息.
哨兵不提供讀寫服務(wù), 主要就是為了監(jiān)控 Redis 節(jié)點. 哨兵架構(gòu)下的 client 端第一次從哨兵找出 Redis 主節(jié)點, 后續(xù)就直接訪問 Redis 的主節(jié)點, 不會每次都通過哨兵代理訪問 Redis 的主節(jié)點. 當主節(jié)點發(fā)生變化, 哨兵會第一時間感知到. 并且將新的 Redis 主節(jié)點通知給 client 端.(這里面 Redis 和 client 端一般都實現(xiàn)了訂閱功能. 訂閱哨兵 sentinel 發(fā)布的節(jié)點變動消息)
2. 哨兵架構(gòu)的簡單搭建
1、復(fù)制一份sentinel.conf文件
cp sentinel.conf sentinel‐26379.conf
2、將相關(guān)配置修改為如下值:
port 26379
daemonize yes
pidfile "/var/run/redis‐sentinel‐26379.pid"
logfile "26379.log"
dir "/usr/local/redis‐5.0.3/data"
# sentinel monitor <master‐redis‐name> <master‐redis‐ip> <master‐redis‐port> <quorum>
# quorum是一個數(shù)字,指明當有多少個sentinel認為一個master失效時(值一般為:sentinel總數(shù)/2 + 1),master才算真正失效
sentinel monitor mymaster 192.168.0.60 6379 2 # mymaster這個名字隨便取,客戶端訪問時會用到
3、啟動sentinel哨兵實例
src/redis‐sentinel sentinel‐26379.conf
4、查看sentinel的info信息
src/redis‐cli ‐p 26379
127.0.0.1:26379>info
可以看到Sentinel的info里已經(jīng)識別出了redis的主從
5、可以自己再配置兩個sentinel,端口26380和26381,注意上述配置文件里的對應(yīng)數(shù)字都要修改
sentinel 集群都啟動完畢后, 會將哨兵集群的元數(shù)據(jù)信息寫入所有的 sentinel 的配置文件里去(追加在文件的最下面).查看如下配置文件 sentinel-26379.conf.
1 sentinel known‐replica mymaster 192.168.0.60 6380 #代表redis主節(jié)點的從節(jié)點信息
2 sentinel known‐replica mymaster 192.168.0.60 6381 #代表redis主節(jié)點的從節(jié)點信息
3 sentinel known‐sentinel mymaster 192.168.0.60 26380 52d0a5d70c1f90475b4fc03b6ce7c3c56935760f #代表感知到的其它哨兵節(jié)點
4 sentinel known‐sentinel mymaster 192.168.0.60 26381 e9f530d3882f8043f76ebb8e1686438ba8bd5ca6 #代表感知到的其它哨兵節(jié)點
當Redis主節(jié)點如果掛了, 哨兵集群會重新選舉出新的Redis主節(jié)點, 同時會修改所有sentinel節(jié)點配置文件 的集群元數(shù)據(jù)信息, 比如6379的Redis如果掛了, 假設(shè)選舉出的新主節(jié)點是6380, 則sentinel文件里的集 群元數(shù)據(jù)信息會變成如下所示:
1 sentinel known‐replica mymaster 192.168.0.60 6379 #代表主節(jié)點的從節(jié)點信息
2 sentinel known‐replica mymaster 192.168.0.60 6381 #代表主節(jié)點的從節(jié)點信息
3 sentinel known‐sentinel mymaster 192.168.0.60 26380 52d0a5d70c1f90475b4fc03b6ce7c3c56935760f #代表感知到的其它哨兵節(jié)點
4 sentinel known‐sentinel mymaster 192.168.0.60 26381 e9f530d3882f8043f76ebb8e1686438ba8bd5ca6 #代表感知到的其它哨兵節(jié)點
同時還會修改sentinel 文件里之前配置的 mymaster對應(yīng)的6379端口,改為6380
1 sentinel monitor mymaster 192.168.0.60 6380 2
3. 總結(jié)
簡單的來說 Redis 的哨兵架構(gòu)工作流程可以分為以下幾個步驟
-
啟動
當Redis服務(wù)器啟動時, 哨兵進程也會被啟動. 哨兵進程是一個獨立的進程, 它負責監(jiān)控Redis主節(jié)點和從節(jié)點的運行狀態(tài). -
監(jiān)控
哨兵進程定期檢查主節(jié)點和從節(jié)點的狀態(tài), 它會檢查服務(wù)器是否正常運行, 是否能夠正常響應(yīng)請求. -
故障檢測
如果哨兵進程檢測到主節(jié)點無法正常運行, 它會將這個信息廣播給其他的哨兵進程. 當大多數(shù)哨兵進程都確認主進程出現(xiàn)故障后, 哨兵進程會開始故障恢復(fù)流程. -
選擇新的主節(jié)點
哨兵進程會從從節(jié)點中選擇一個作為新的主節(jié)點, 選擇的標準包括節(jié)點的運行狀態(tài), 數(shù)據(jù)的更新程序等. -
切換主節(jié)點
當新的主節(jié)點被選定后,哨兵進程會更新配置信息, 將所有的請求重定向到新的主節(jié)點. -
通知client
哨兵進程通知應(yīng)用程序主節(jié)點已經(jīng)改變, 應(yīng)用程序需要更新自己的配置信息,以便將請求發(fā)送到新的主節(jié)點.
