1、Redis Sentinel服務(wù)配置
1.1簡(jiǎn)介
Redis 的 Sentinel 系統(tǒng)用于管理多個(gè) Redis 服務(wù)器(instance), 該系統(tǒng)執(zhí)行以下三個(gè)任務(wù):
監(jiān)控(Monitoring): Sentinel 會(huì)不斷地檢查你的主服務(wù)器和從服務(wù)器是否運(yùn)作正常。
提醒(Notification): 當(dāng)被監(jiān)控的某個(gè) Redis 服務(wù)器出現(xiàn)問(wèn)題時(shí), Sentinel 可以通過(guò)API 向管理員或者其他應(yīng)用程序發(fā)送通知。
自動(dòng)故障遷移(Automatic failover): 當(dāng)一個(gè)主服務(wù)器不能正常工作時(shí), Sentinel 會(huì)開(kāi)始一次自動(dòng)故障遷移操作, 它會(huì)將失效主服務(wù)器的其中一個(gè)從服務(wù)器升級(jí)為新的主服務(wù)器, 并讓失效主服務(wù)器的其他從服務(wù)器改為復(fù)制新的主服務(wù)器; 當(dāng)客戶端試圖連接失效的主服務(wù)器時(shí), 集群也會(huì)向客戶端返回新主服務(wù)器的地址, 使得集群可以使用新主服務(wù)器代替失效服務(wù)器。
Redis Sentinel 是一個(gè)分布式系統(tǒng), 你可以在一個(gè)架構(gòu)中運(yùn)行多個(gè) Sentinel 進(jìn)程(progress), 這些進(jìn)程使用流言協(xié)議(gossip protocols)來(lái)接收關(guān)于主服務(wù)器是否下線的信息, 并使用投票協(xié)議(agreement protocols)來(lái)決定是否執(zhí)行自動(dòng)故障遷移,以及選擇哪個(gè)從服務(wù)器作為新的主服務(wù)器。
雖然 Redis Sentinel 釋出為一個(gè)單獨(dú)的可執(zhí)行文件 redis-sentinel , 但實(shí)際上它只是一個(gè)運(yùn)行在特殊模式下的 Redis 服務(wù)器, 你可以在啟動(dòng)一個(gè)普通 Redis 服務(wù)器時(shí)通過(guò)給定 --sentinel 選項(xiàng)來(lái)啟動(dòng)Redis Sentinel 。
1.2相關(guān)配置
案例:
如果要監(jiān)控兩個(gè)redis實(shí)例,可以進(jìn)行如下配置Redis安裝目錄下sentinel.conf文件:
常規(guī)配置:
port 26379
daemonize yes
logfile "/var/log/redis/sentinel.log"
#master 7000
sentinel monitor master1 127.0.0.1 7000 2 #配置master名、ip、port、需要多少個(gè)sentinel才能判斷[客觀下線](2)
sentinel down-after-milliseconds master-7000 30000 #配置sentinel向master發(fā)出ping,最大響應(yīng)時(shí)間、超過(guò)則認(rèn)為主觀下線
sentinel parallel-syncs master-7000 1 #配置在進(jìn)行故障轉(zhuǎn)移時(shí),運(yùn)行多少個(gè)slave進(jìn)行數(shù)據(jù)備份同步(越少速度越快)
sentinel failover-timeout master-7000 180000 #配置當(dāng)出現(xiàn)failover時(shí)下一個(gè)sentinel與上一個(gè)sentinel對(duì)[同一個(gè)master監(jiān)測(cè)的時(shí)間間隔](最后設(shè)置為客觀下線)
#master 7001
sentinel monitor master2 127.0.0.1 7001 1
sentinel down-after-milliseconds master-7001 30000
sentinel parallel-syncs master-7001 1
sentinel failover-timeout master-7001 180000
特殊配置:
min-slaves-to-write 1
min-slaves-max-lag 10
通過(guò)上面的配置,當(dāng)一個(gè)redis是master時(shí),如果它不能向至少一個(gè)slave寫數(shù)據(jù)(上面的min-slaves-to-write指定了slave的數(shù)量),它將會(huì)拒絕接受客戶端的寫請(qǐng)求。由于復(fù)制是異步的,master無(wú)法向slave寫數(shù)據(jù)意味著slave要么斷開(kāi)連接了,要么不在指定時(shí)間內(nèi)向master發(fā)送同步數(shù)據(jù)的請(qǐng)求了(上面的min-slaves-max-lag指定了這個(gè)時(shí)間)。
1.3 相關(guān)術(shù)語(yǔ)說(shuō)明
Sentinel包括兩個(gè)重要的術(shù)語(yǔ):主觀下線和客觀下線>
1. 主觀下線(Subjectively Down, 簡(jiǎn)稱 SDOWN)指的是單個(gè) Sentinel 實(shí)例對(duì)服務(wù)器做出的下線判斷。
2. 客觀下線(Objectively Down, 簡(jiǎn)稱 ODOWN)指的是多個(gè) Sentinel 實(shí)例在對(duì)同一個(gè)服務(wù)器做出 SDOWN 判斷, 并且通過(guò)SENTINEL is-master-down-by-addr 命令互相交流之后, 得出的服務(wù)器下線判斷。
客觀下線條件只適用于主服務(wù)器: 對(duì)于任何其他類型的 Redis 實(shí)例, Sentinel 在將它們判斷為下線前不需要進(jìn)行協(xié)商, 所以從服務(wù)器或者其他 Sentinel 永遠(yuǎn)不會(huì)達(dá)到客觀下線條件。
只要一個(gè) Sentinel 發(fā)現(xiàn)某個(gè)主服務(wù)器進(jìn)入了客觀下線狀態(tài), 這個(gè)Sentinel 就可能會(huì)被其他 Sentinel 推選出, 并對(duì)失效的主服務(wù)器執(zhí)行自動(dòng)故障遷移操作。
每個(gè)Sentinel實(shí)例都執(zhí)行的定時(shí)任務(wù)
1. 每個(gè)Sentinel 以每秒鐘一次的頻率向它所知的主服務(wù)器、從服務(wù)器以及其他 Sentinel 實(shí)例發(fā)送一個(gè) PING 命令。
2. 如果一個(gè)實(shí)例(instance)距離最后一次有效回復(fù) PING 命令的時(shí)間超過(guò) down-after-milliseconds 選項(xiàng)所指定的值, 那么這個(gè)實(shí)例會(huì)被 Sentinel 標(biāo)記為主觀下線。 一個(gè)有效回復(fù)可以是: +PONG 、 -LOADING 或者-MASTERDOWN 。
3. 如果一個(gè)主服務(wù)器被標(biāo)記為主觀下線, 那么正在監(jiān)視這個(gè)主服務(wù)器的所有 Sentinel 要以每秒一次的頻率確認(rèn)主服務(wù)器的確進(jìn)入了主觀下線狀態(tài)。
4. 如果一個(gè)主服務(wù)器被標(biāo)記為主觀下線, 并且有足夠數(shù)量的 Sentinel (至少要達(dá)到配置文件指定的數(shù)量)在指定的時(shí)間范圍內(nèi)同意這一判斷, 那么這個(gè)主服務(wù)器被標(biāo)記為客觀下線。
5. 在一般情況下, 每個(gè) Sentinel 會(huì)以每10 秒一次的頻率向它已知的所有主服務(wù)器和從服務(wù)器發(fā)送 INFO 命令。 當(dāng)一個(gè)主服務(wù)器被 Sentinel 標(biāo)記為客觀下線時(shí), Sentinel 向下線主服務(wù)器的所有從服務(wù)器發(fā)送 INFO 命令的頻率會(huì)從 10 秒一次改為每秒一次。
6. 當(dāng)沒(méi)有足夠數(shù)量的 Sentinel 同意主服務(wù)器已經(jīng)下線, 主服務(wù)器的客觀下線狀態(tài)就會(huì)被移除。 當(dāng)主服務(wù)器重新向 Sentinel 的 PING 命令返回有效回復(fù)時(shí), 主服務(wù)器的主管下線狀態(tài)就會(huì)被移除。
1.4服務(wù)日志說(shuō)明
Sentinel服務(wù)啟動(dòng)后會(huì)打印一些相關(guān)日志信息,以下是相關(guān)日志特殊字符說(shuō)明:
+reset-master instance details> :主服務(wù)器已被重置。
+slave instance details> :一個(gè)新的從服務(wù)器已經(jīng)被 Sentinel 識(shí)別并關(guān)聯(lián)。
+failover-state-reconf-slaves instancedetails> :故障轉(zhuǎn)移狀態(tài)切換到了reconf-slaves 狀態(tài)。
+failover-detected instance details>:另一個(gè) Sentinel 開(kāi)始了一次故障轉(zhuǎn)移操作,或者一個(gè)從服務(wù)器轉(zhuǎn)換成了主服務(wù)器。
+slave-reconf-sent instance details>:領(lǐng)頭(leader)的 Sentinel 向?qū)嵗l(fā)送了 SLAVEOF 命令,為實(shí)例設(shè)置新的主服務(wù)器。
+slave-reconf-inprog instancedetails> :實(shí)例正在將自己設(shè)置為指定主服務(wù)器的從服務(wù)器,但相應(yīng)的同步過(guò)程仍未完成。
+slave-reconf-done instance details>:從服務(wù)器已經(jīng)成功完成對(duì)新主服務(wù)器的同步。
-dup-sentinel instance details> :對(duì)給定主服務(wù)器進(jìn)行監(jiān)視的一個(gè)或多個(gè) Sentinel 已經(jīng)因?yàn)橹貜?fù)出現(xiàn)而被移除 —— 當(dāng) Sentinel 實(shí)例重啟的時(shí)候,就會(huì)出現(xiàn)這種情況。
+sentinel instance details> :一個(gè)監(jiān)視給定主服務(wù)器的新 Sentinel 已經(jīng)被識(shí)別并添加。
+sdown instance details> :給定的實(shí)例現(xiàn)在處于主觀下線狀態(tài)。
-sdown instance details> :給定的實(shí)例已經(jīng)不再處于主觀下線狀態(tài)。
+odown instance details> :給定的實(shí)例現(xiàn)在處于客觀下線狀態(tài)。
-odown instance details> :給定的實(shí)例已經(jīng)不再處于客觀下線狀態(tài)。
+new-epoch instance details> :當(dāng)前的紀(jì)元(epoch)已經(jīng)被更新。
+try-failover instance details> :一個(gè)新的故障遷移操作正在執(zhí)行中,等待被大多數(shù) Sentinel 選中(waiting to be elected by themajority)。
+elected-leader instance details> :贏得指定紀(jì)元的選舉,可以進(jìn)行故障遷移操作了。
+failover-state-select-slave instancedetails> :故障轉(zhuǎn)移操作現(xiàn)在處于select-slave 狀態(tài) —— Sentinel 正在尋找可以升級(jí)為主服務(wù)器的從服務(wù)器。
no-good-slave instance details> :Sentinel 操作未能找到適合進(jìn)行升級(jí)的從服務(wù)器。Sentinel 會(huì)在一段時(shí)間之后再次嘗試尋找合適的從服務(wù)器來(lái)進(jìn)行升級(jí),又或者直接放棄執(zhí)行故障轉(zhuǎn)移操作。
selected-slave instance details> :Sentinel 順利找到適合進(jìn)行升級(jí)的從服務(wù)器。
failover-state-send-slaveof-nooneinstance details> :Sentinel 正在將指定的從服務(wù)器升級(jí)為主服務(wù)器,等待升級(jí)功能完成。
failover-end-for-timeout instancedetails> :故障轉(zhuǎn)移因?yàn)槌瑫r(shí)而中止,不過(guò)最終所有從服務(wù)器都會(huì)開(kāi)始復(fù)制新的主服務(wù)器(slaves will eventually be configured to replicate with the newmaster anyway)。
failover-end instance details> :故障轉(zhuǎn)移操作順利完成。所有從服務(wù)器都開(kāi)始復(fù)制新的主服務(wù)器了。
+switch-master master name>oldip> oldport> newip> newport> :配置變更,主服務(wù)器的 IP 和地址已經(jīng)改變。 這是絕大多數(shù)外部用戶都關(guān)心的信息。
+tilt :進(jìn)入 tilt 模式。
-tilt :退出 tilt 模式。
1.5測(cè)試驗(yàn)證
可以對(duì)master-slave進(jìn)行測(cè)試,將master關(guān)閉,此時(shí)slave會(huì)自動(dòng)充當(dāng)新的new-master;
當(dāng)old-master恢復(fù)后,會(huì)充當(dāng)new-master的slave,即:在這個(gè)過(guò)程中,sentinel.conf會(huì)被改寫,改寫為當(dāng)前監(jiān)控的主機(jī)master服務(wù);
如下圖測(cè)試所示:
Master服務(wù)停止:
Old-Master恢復(fù)服務(wù):
以上這篇Redis Sentinel服務(wù)配置流程(詳解)就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
您可能感興趣的文章:- Redis Sentinel的基本搭建
- Redis服務(wù)之高可用組件sentinel詳解
- 詳解SpringBoot Redis自適應(yīng)配置(Cluster Standalone Sentinel)
- 基于docker搭建redis-sentinel集群的方法示例
- Linux redis-Sentinel配置詳解
- Redis Sentinel實(shí)現(xiàn)哨兵模式搭建小結(jié)
- 玩轉(zhuǎn)Redis搭建集群之Sentinel詳解
- Redis Sentinel實(shí)現(xiàn)高可用配置的詳細(xì)步驟
- java客戶端Jedis操作Redis Sentinel 連接池的實(shí)現(xiàn)方法
- Redis Sentinel的使用方法