Sentinel(哨兵)是用於監控redis集群中Master狀態的工具.
一、Sentinel作用
1、Master狀態檢測
2、如果Master異常,則會進行Master-Slave切換,將其中一個Slave作為Master,將之前的Master作為Slave;
3、Master-Slave切換后,master_redis.conf、slave_redis.conf和sentinel.conf的內容都會發生改變,即master_redis.conf中會多一行slaveof的配置,sentinel.conf的監控目標會隨之調換;
二、Sentinel工作方式
1、每個Sentinel以每秒鍾一次的頻率向它所知的Master,Slave以及其他 Sentinel 實例發送一個 PING 命令
2、如果一個實例(instance)距離最后一次有效回復 PING 命令的時間超過 down-after-milliseconds 選項所指定的值, 則這個實例會被 Sentinel 標記為主觀下線。
3、如果一個Master被標記為主觀下線,則正在監視這個Master的所有 Sentinel 要以每秒一次的頻率確認Master的確進入了主觀下線狀態。
4、當有足夠數量的 Sentinel(大於等於配置文件指定的值)在指定的時間范圍內確認Master的確進入了主觀下線狀態, 則Master會被標記為客觀下線
5、在一般情況下, 每個 Sentinel 會以每 10 秒一次的頻率向它已知的所有Master,Slave發送 INFO 命令
6、當Master被 Sentinel 標記為客觀下線時,Sentinel 向下線的 Master 的所有 Slave 發送 INFO 命令的頻率會從 10 秒一次改為每秒一次
7、若沒有足夠數量的 Sentinel 同意 Master 已經下線, Master 的客觀下線狀態就會被移除。 若 Master 重新向 Sentinel 的 PING 命令返回有效回復, 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。
三、Sentinel配置實現主備自動切換
Sentinel中只需要在各節點(包括Master節點)中配置sentinel monitor為master的信息即可,不需要再配置slave的信息。在每一個redis節點中的Sentinel.conf文件中。
slave的sentinel.conf配置:
port 26379
#master2
sentinel monitor master2 192.168.15.129 6379 1 ---master地址 名字為哨名的名字,不同服務器上可以取得不一樣
sentinel down-after-milliseconds master2 5000
sentinel failover-timeout master2 900000
#sentinel can-failover master2 yes
sentinel parallel-syncs master2 2
Master機器上sentinel.conf配置
屬性 |
值 |
描述 |
port |
16379 |
監視哨端口 |
daemonize |
yes |
啟動的進程為后台進程 |
logfile |
“/opt/oracle/redis-2.8.19/logs/sentinel.log” |
日志文件 |
sentinel monitor <master-name> <ip> <redis-port> <quorum> |
sentinel monitor mymaster 127.0.0.1 6379 1 |
IP和端口為Master的IP地址和端口,mymaster為集群名稱,可以修改為想要的名稱,客戶端訪問時需要這個名稱 |
sentinel down-after-milliseconds <master-name> 30000 |
sentinel down-after-milliseconds mymaster 30000 |
master-name為一個統一的集群名稱 |
sentinel failover-timeout <master-name> 180000 |
sentinel failover-timeout mymaster 180000 |
|
sentinel parallel-syncs <master-name> <numslaves> |
sentinel parallel-syncs mymaster 1 |
Slave機器上sentinel配置
slave上的sentinel配置與Master上的配置相同,只需要將master-name修改即可
啟動順序如下:
1、redis-server redis.conf 啟動Master主機;
2、redis-server redis.conf 啟動Slave主機 ;
3、redis-sentinel sentinel.conf 啟動Master主機上的監視哨;
4、redis-sentinel sentinel.conf 啟動Slave主機上的監視哨
注意:首次啟動時,必須先啟動Master
若Master已經被判定為下線,Sentinel已經選擇了新的Master,也已經將old Master改成Slave,但是還沒有將其改成new Master。若此時重啟old Master,則Redis集群將處於無Master狀態,此時只能手動修改配置文件,然后重新啟動集群
四、示例如下:
master:192.168.15.129,
slave :192.168.15.128
分別啟動master和slave的redis服務和sentinel服務
[root@localhostsrc]#./redis-server../redis.conf
[root@localhostsrc]#./redis-sentinel../sentinel-test.conf
然后根據以下場景切換主備,切換成功,當測試都通過時,才算是配置完成
測試主備切換場景:
主:129,備:128,sen:128,129
關閉129的redis和sen,看是否能夠切換到128上面,在128上面刪除數據,啟動129的redis和sen,看是否數據會同步,再關閉128的redis和sen,看是否會切換為129
運行如下命令,連接客戶端查看Slave狀態:./redis-cli -h IP -p Port