Redis Sentinel哨兵機制
簡(jiǎn)介
Redis的哨兵(sentinel) 系統用于管理多個(gè) Redis 服務(wù)器,該系統執行以下三個(gè)任務(wù):
監控(Monitoring): 哨兵(sentinel) 會(huì )不斷地檢查你的Master和Slave是否運作正常。
提醒(Notification): 當被監控的某個(gè) Redis出現問(wèn)題時(shí), 哨兵(sentinel) 可以通過(guò) API 向管理員或者其他應用程序發(fā)送通知。
自動(dòng)故障遷移(Automatic failover): 當一個(gè)Master不能正常工作時(shí),哨兵(sentinel) 會(huì )開(kāi)始一次自動(dòng)故障遷移操作,它會(huì )將失效Master的其中一個(gè)Slave升級為新的Master, 并讓失效Master的其他Slave改為復制新的Master; 當客戶(hù)端試圖連接失效的Master時(shí),集群也會(huì )向客戶(hù)端返回新Master的地址,使得集群可以使用Master代替失效Master。
哨兵(sentinel) 是一個(gè)分布式系統,你可以在一個(gè)架構中運行多個(gè)哨兵(sentinel) 進(jìn)程,這些進(jìn)程使用流言協(xié)議(gossipprotocols)來(lái)接收關(guān)于Master是否下線(xiàn)的信息,并使用投票協(xié)議(agreement protocols)來(lái)決定是否執行自動(dòng)故障遷移,以及選擇哪個(gè)Slave作為新的Master。
每個(gè)哨兵(sentinel) 會(huì )向其它哨兵(sentinel)、master、slave定時(shí)發(fā)送消息,以確認對方是否”活”著(zhù),如果發(fā)現對方在指定時(shí)間(可配置)內未回應,則暫時(shí)認為對方已掛(所謂的”主觀(guān)認為宕機” Subjective Down,簡(jiǎn)稱(chēng)sdown).
若“哨兵群”中的多數sentinel,都報告某一master沒(méi)響應,系統才認為該master"徹底死亡"(即:客觀(guān)上的真正down機,Objective Down,簡(jiǎn)稱(chēng)odown),通過(guò)一定的vote算法,從剩下的slave節點(diǎn)中,選一臺提升為master,然后自動(dòng)修改相關(guān)配置。
雖然哨兵(sentinel) 釋出為一個(gè)單獨的可執行文件 redis-sentinel ,但實(shí)際上它只是一個(gè)運行在特殊模式下的 Redis 服務(wù)器,你可以在啟動(dòng)一個(gè)普通 Redis 服務(wù)器時(shí)通過(guò)給定 --sentinel 選項來(lái)啟動(dòng)哨兵(sentinel)。
哨兵(sentinel) 的一些設計思路和zookeeper非常類(lèi)似。
哨兵(Sentinel)總結
1、Sentinel的作用:
- Master 狀態(tài)監測
- 如果Master 異常,則會(huì )進(jìn)行Master-slave 轉換,將其中一個(gè)Slave作為Master,將之前的Master作為Slave
- Master-Slave切換后,master_redis.conf、slave_redis.conf和sentinel.conf的內容都會(huì )發(fā)生改變,即master_redis.conf中會(huì )多一行slaveof的配置,sentinel.conf的監控目標會(huì )隨之調換
2. Sentinel的工作方式:
- 每個(gè)Sentinel以每秒鐘一次的頻率向它所知的Master,Slave以及其他 Sentinel 實(shí)例發(fā)送一個(gè) PING 命令。
- 如果一個(gè)實(shí)例(instance)距離最后一次有效回復 PING 命令的時(shí)間超過(guò) down-after-milliseconds 選項所指定的值, 則這個(gè)實(shí)例會(huì )被 Sentinel 標記為主觀(guān)下線(xiàn)。
- 如果一個(gè)Master被標記為主觀(guān)下線(xiàn),則正在監視這個(gè)Master的所有 Sentinel 要以每秒一次的頻率確認Master的確進(jìn)入了主觀(guān)下線(xiàn)狀態(tài)。
- 當有足夠數量的 Sentinel(大于等于配置文件指定的值)在指定的時(shí)間范圍內確認Master的確進(jìn)入了主觀(guān)下線(xiàn)狀態(tài), 則Master會(huì )被標記為客觀(guān)下線(xiàn) 。
- 在一般情況下, 每個(gè) Sentinel 會(huì )以每 10 秒一次的頻率向它已知的所有Master,Slave發(fā)送 INFO 命令 。
- 當Master被 Sentinel 標記為客觀(guān)下線(xiàn)時(shí),Sentinel 向下線(xiàn)的 Master 的所有 Slave 發(fā)送 INFO 命令的頻率會(huì )從 10 秒一次改為每秒一次 。
- 若沒(méi)有足夠數量的 Sentinel 同意 Master 已經(jīng)下線(xiàn), Master 的客觀(guān)下線(xiàn)狀態(tài)就會(huì )被移除。
若 Master 重新向 Sentinel 的 PING 命令返回有效回復, Master 的主觀(guān)下線(xiàn)狀態(tài)就會(huì )被移除。
