- Redis哨兵模式(Redis Sentinel)
-
- Redis Sentinel的主要功能:
- 哨兵模式的配置
-
- 環境說明:
- 分别修改每台伺服器的Sentinel.conf配置檔案
- 啟動Sentinel
- Sentinel操作
- 模拟停止master上的Redis,檢視Redis的主從變化
- 哨兵模式總結
-
- Sentinel的作用:
- Sentinel的工作方式:
- Redis主從模式
Redis哨兵模式(Redis Sentinel)
Redis Sentinel是Redis高可用的實作方案。Sentinel是一個管理多個Redis執行個體的工具,它可以實作對Redis的監控、通知、自動故障轉移。
Redis Sentinel的主要功能:
- 監控:Sentinel會不斷的檢查主伺服器和從伺服器是否正常運作。
- 通知:當被監控的某個Redis伺服器出現問題,Sentinel通過API腳本向管理者或者其他的應用程式發送通知。
- 自動故障轉移:當主節點不能正常工作時,Sentinel會開始一次自動的故障轉移操作,它會将與失效主節點是主從關系的其中一個從節點更新為新的主節點, 并且将其他的從節點指向新的主節點。
- 配置提供:在Redis Sentinel模式下,用戶端應用在初始化時連接配接的是Sentinel節點集合,從中擷取主節點的資訊。
哨兵模式的配置
環境說明:
主機名稱 | IP位址 | 端口及角色 |
---|---|---|
redis-master | 192.29.0.147 | 6379 主節點 |
redis-slave01 | 192.29.0.203 | 6379 從節點 |
redis-slave02 | 192.29.0.204 | 6379 從節點 |
redis-master | 192.29.0.147 | 26379 哨兵1 |
redis-slave01 | 192.29.0.203 | 26379 哨兵2 |
redis-slave02 | 192.29.0.204 | 26379 哨兵3 |
分别修改每台伺服器的Sentinel.conf配置檔案
# 端口
port 26379
# pid檔案路徑
pidfile /var/run/redis-sentinel_26379.pid
# 日志檔案路徑
logfile "/home/redis5/26379/sentinel.log"
# 定義Redis主的别名, IP, 端口,這裡的2指的是需要至少2個Sentinel認為主Redis挂了才最終會采取下一步行為
sentinel monitor mymaster 192.29.0.147 6379 2
# 如果mymaster 30秒内沒有響應,則認為其主觀失效
sentinel down-after-milliseconds mymaster 30000
# 該參數指定一個時間段,在該時間段内沒有實作故障轉移成功,則會再一次發起故障轉移的操作,機關毫秒
sentinel failover-timeout mymaster 180000
啟動Sentinel
啟動順序為:主redis - 從redis - sentinel 1/2/3
[[email protected]~]#./redis-sentinel/home/redis5/26379/sentinel.conf [[email protected] ~]# ps -ef |grep redis
root 1295 1 0 14:03 ? 00:00:06 /home/redis5/6379/redis-server 192.29.0.147:6379
root 1407 1 1 14:40 ? 00:00:00 redis-sentinel *:26379 [sentinel]
root 1412 1200 0 14:40 pts/1 00:00:00 grep --color=auto redis
[[email protected]~]#./redis-sentinel/home/redis5/26379/sentinel.conf [[email protected] ~]# ps -ef |grep redis
root 1625 1 0 14:04 ? 00:00:06 /home/redis5/6379/redis-server 192.29.0.203:6379
root 1715 1 1 14:41 ? 00:00:00 redis-sentinel *:26379 [sentinel]
root 1720 1574 0 14:41 pts/0 00:00:00 grep --color=auto redis
[[email protected]~]#./redis-sentinel/home/redis5/26379/sentinel.conf [[email protected] ~]# ps -ef |grep redis
root 1628 1 0 14:07 ? 00:00:06 /home/redis5/6379/redis-server 192.29.0.204:6379
root 1709 1 0 14:42 ? 00:00:00 redis-sentinel *:26379 [sentinel]
root 1714 1575 0 14:42 pts/0 00:00:00 grep --color=auto redis
Sentinel操作
[[email protected] ~]# redis-cli -p 26379 #用戶端登入哨兵
192.29.0.147:26379> sentinel master mymaster #輸出被監控的主節點的狀态資訊
1)"name"
2)"mymaster"
3)"ip"
4)"192.29.0.147"
5)"port"
6)"6379"
7)"runid"
8)"bae06cc3bc6dcbff7c2de1510df7faf1a6eb6941"
9)"flags"
10)"master"
192.29.0.147:26379> sentinel slaves mymaster #輸出被監控的從節點的狀态資訊
1)1)"name"
2)"192.29.0.203:6379"
3)"ip"
4)"192.29.0.203"
5)"port"
6)"6379"
7)"runid"
8)"c86027e7bdd217cb584b1bd7a6fea4ba79cf6364"
9)"flags"
10)"slaves"
......
2)1)"name"
2)"192.29.0.204:6379"
3)"ip"
4)"192.29.0.204"
5)"port"
6)"6379"
7)"runid"
8)"61597fdb615ecf8bd7fc18e143112401ed6156ec"
9)"flags"
10)"slaves"
192.29.0.147:26379> sentinel sentinels mymaster #檢視其它sentinel資訊
1)1)"name"
2)"ba12e2a4023d2e9bcad282395ba6b14030920070"
3)"ip"
4)"192.29.0.203"
5)"port"
6)"26379"
7)"runid"
8)"ba12e2a4023d2e9bcad282395ba6b14030920070"
9)"flags"
10)"sentinel"
......
2)1)"name"
2)"14fca3f851e9e1bd3a4a0dc8a9e34bb237648455"
3)"ip"
4)"192.29.0.204"
5)"port"
6)"26379"
7)"runid"
8)"14fca3f851e9e1bd3a4a0dc8a9e34bb237648455"
9)"flags"
10)"sentinel"
模拟停止master上的Redis,檢視Redis的主從變化
[[email protected] ~]# systemctl stop redis #停止master上的redis
[[email protected] ~]# redis-cli -p 26379 #哨兵模式下檢視主從資訊,也是可以看到主從的變化
192.29.0.147:26379> sentinel master mymaster
1)"name"
2)"mymaster"
3)"ip"
4)"192.29.0.204"
5)"port"
6)"6379"
7)"runid"
8)"61597fdb615ecf8bd7fc18e143112401ed6156ec"
9)"flags"
10)"master"
......
192.29.0.147:26379> sentinel slaves mymaster
1)1) "name"
2) "192.29.0.203:6379"
3) "ip"
4) "192.29.0.203"
5) "port"
6) "6379"
7) "runid"
8) "c86027e7bdd217cb584b1bd7a6fea4ba79cf6364"
9) "flags"
10) "slave"
......
2)1)"name"
1)"192.29.0.147:6379"
2)"ip"
3)"192.29.0.147"
4)"port"
5)"6379"
6)"runid"
7)""
8)"flags"
9)"s_down,slave,disconnected" #該節點為從,并且狀态為s_down,斷開的狀态
......
哨兵模式總結
Sentinel的作用:
Master 狀态監測
如果Master 異常,則會進行Master-slave 轉換,将其中一個Slave作為Master,将之前的Master作為Slave;
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 的客觀下線狀态就會被移除。
- 若 Master 重新向 Sentinel 的 PING 指令傳回有效回複, Master 的主觀下線狀态就會被移除。