Redis 的主從復制模式下,一旦主節點由于故障不能提供服務,需要人工進
行主從切換,同時大量的客戶端需要被通知切換到新的主節點上,對于上了一定規模的應用來說,這種方案是無法接受的,于是Redis從2.8開始提供了RedisSentinel(哨兵)來解決這個問題。
哨兵模式的作用
哨兵也叫 sentinel,它的作用是能夠在后臺監控主機是否故障,如果故障了根據投票數自動將從庫轉換為主庫。
如果master宕機了,sential會從剩下的從服務器節點中選擇一臺提升為master,然后自動修改相關配置,選舉策略如下:
選擇優先級靠前的服務器。優先級的配置在 redis.conf 文件中的
replica-priority
配置,默認為 100,值越小優先級越高。選擇偏移量最大的。偏移量是指獲得原主機數據最全的。
選擇 runid 最小的從服務器。每個redis實例啟動后都會隨機生成一個40位的runid。
Redis Sentinel中的Sentinel節點個數應該為大于等于3且最好為奇數。
哨兵集群為什么建議部署 “奇數個節點”?比如 3 個、5 個,而不是 2 個、4 個?
核心原因:避免 “投票腦裂”,確保故障轉移時能選出 “領頭哨兵” 和新主庫。
哨兵的關鍵投票場景需要 “超過半數節點同意”:
配置哨兵模式
- 首先配置好三臺主機的/etc/reids/redis.cnf文件
vim /etc/redis/redis.conf
bind 0.0.0.0
protected-mode no
daemonize no ?
- 重新啟動redis服務
systemctl start redis
- 配置好redis的主從同步
- 查看master主從情況---------- 兩個從都是在線的狀態下
- 接著配置三臺主機的哨兵配置文件
port 26379 #監聽端口
daemonize no #后臺運行
pidfile /var/run/redis-sentinel.pid
logfile /var/log/redis/sentinel.log
sentinel monitor mymaster 192.168.1.20 6379 2
#monitor:監控
#mymaster為監控對象起的服務名稱
#2表示只有2個或2個以上的哨兵認為主節點不可用的時候,才會把 master 設置為客觀下線狀態,然后進行 failover 操作。
sentinel down-after-milliseconds mymaster 30000 #master中斷時長, 30秒連不上視為master下線
sentinel parallel-syncs mymaster 1 #發生故障轉移后,同時開始同步新master數據的slave數量
sentinel failover-timeout mymaster 180000 #整個故障切換的超時時間為3分鐘
- 現在master上配置好哨兵配置文件---再將配置好的哨兵文件傳到slave1.slave2上對他們原來的哨兵文件進行覆蓋
scp /etc/redis/sentinel.conf root@192.168.1.21:/etc/redis
scp /etc/redis/sentinel.conf root@192.168.1.22:/etc/redis
重新啟動哨兵服務
systemctl restart redis-sentinel.service
測試---模擬master故障
- 首先將master的redis服務關閉
shutdown
- 然后查看slave1的狀態----查看master是否成功轉移slave1上
- 查看slave2的主從狀態
master成功轉移到slave1上并,salve2的主庫也成功變成slave1
- 查看slave2的redis配置文件--查看哨兵是否檢測到故障并且更改slave2文件的主
哨兵自動更改了master的IP為slave1的ip
注意
/etc/redis/sentinel.conf 文件在用哨兵程序調用后會被更改,如果需要重新做要刪掉文件重新編輯。
- 由于所有的寫操作都是先在Master上操作,然后同步更新到Slave上,所以從Master同步到Slave機器有定的延遲,當系統很繁忙的時候,延遲問題會更加嚴重,Slave機器數量的增加也會使這個問題更加嚴重。
- 在生產環境中如果master和slave中的網絡出現故障,由于哨兵的存在會把master提出去當網絡恢復谷master發現環境發生改變,master就會把自己的身份轉換成slave。master變成slave后會把網絡故障那段時間寫入自己中的數據清掉,這樣數據就丟失了。
- 解決辦法:master在被寫入數據時會持續連接slave, mater確保有2slave可以寫入我才允許寫入,如果slave數量少于2個便拒絕寫入