本篇文章帶大家了解一下redis中的哨兵模式。有一定的參考價(jià)值,有需要的朋友可以參考一下,希望對(duì)大家有所幫助。
主從切換技術(shù)的方法是:
- 當(dāng)主服務(wù)器宕機(jī)時(shí),需要將從服務(wù)器手動(dòng)切換(slaveof no one)到主從服務(wù)器,這需要人工干預(yù)。
- 這既費(fèi)時(shí)又費(fèi)力,但也會(huì)在一段時(shí)間內(nèi)導(dǎo)致服務(wù)不可用。 這不是推薦的方法。
- 更多的時(shí)間,我們優(yōu)先考慮哨兵模式,這是當(dāng)前企業(yè)應(yīng)用程序的主流模式。 redis sentinel是Redis的高度可用的實(shí)現(xiàn)。
- Sentinel是管理多個(gè)Redis實(shí)例的工具。 它可以監(jiān)視,通知Redis并自動(dòng)進(jìn)行故障轉(zhuǎn)移。
Redis Sentinel的基本概念
主從復(fù)制和Sentinel高可用性架構(gòu)的示意圖
Redis Sentinel架構(gòu)
Redis Sentinel的主要功能Sentinel的主要功能包括:
主節(jié)點(diǎn)生存檢測(cè),主從操作檢測(cè),自動(dòng)故障轉(zhuǎn)移以及主從切換。
- Redis的最小標(biāo)記配置是一臺(tái)主機(jī)和一臺(tái)從機(jī);
- Redis的Sentinel系統(tǒng)可用于管理多個(gè)Redis服務(wù)器。
- 系統(tǒng)可以執(zhí)行以下四個(gè)任務(wù):
1、監(jiān)視:Sentinel會(huì)不斷檢查主服務(wù)器和從屬服務(wù)器是否正常運(yùn)行;2、通知:當(dāng)受監(jiān)控的Redis服務(wù)器出現(xiàn)問(wèn)題時(shí),Sentinel會(huì)通過(guò)API腳本向管理員或其他應(yīng)用程序發(fā)送通知;3、自動(dòng)故障轉(zhuǎn)移:當(dāng)主節(jié)點(diǎn)無(wú)法正常工作時(shí),Sentinel將啟動(dòng)自動(dòng)故障轉(zhuǎn)移操作。它將與發(fā)生故障的主節(jié)點(diǎn)處于主從關(guān)系的從節(jié)點(diǎn)之一升級(jí)到新的主節(jié)點(diǎn),并將其他從節(jié)點(diǎn)指向新的主節(jié)點(diǎn);4、 配置提供程序:在Redis Sentinel模式下,初始化客戶(hù)端應(yīng)用程序時(shí),它將連接Sentinel節(jié)點(diǎn)集合以獲取主節(jié)點(diǎn)的信息;
Redis Sentinel如何工作
- 當(dāng)哨兵節(jié)點(diǎn)連接到Redis實(shí)例時(shí),它將創(chuàng)建兩個(gè)連接:cmd和pub/sub。 Sentinel通過(guò)cmd連接將命令發(fā)送到Redis,并通過(guò)pub/sub連接到Redis實(shí)例上的其他哨兵實(shí)例。
- Sentinel與Redis主節(jié)點(diǎn)和從節(jié)點(diǎn)進(jìn)行交互的命令
- 每個(gè)Sentinel每秒向其已知的主實(shí)例,從屬實(shí)例和其他Sentinel實(shí)例發(fā)送一個(gè)PING命令。
- 如果一個(gè)實(shí)例花費(fèi)的時(shí)間比上次對(duì)PING命令的有效回復(fù)(毫秒)后down所指定的時(shí)間更長(zhǎng),那么Sentinel會(huì)將該實(shí)例標(biāo)記為主觀離線(xiàn)。
- 如果將主服務(wù)器標(biāo)記為主觀注銷(xiāo),則將監(jiān)視主服務(wù)器的所有Sentinel節(jié)點(diǎn)以確認(rèn)主服務(wù)器確實(shí)已經(jīng)每秒進(jìn)入一次主觀注銷(xiāo)狀態(tài)。
- 如果將主服務(wù)器標(biāo)記為主觀注銷(xiāo),并且在指定的時(shí)間范圍內(nèi)有足夠的哨兵(至少配置文件中指定的數(shù)量)與該判斷相符,則將主服務(wù)器標(biāo)記為客觀下線(xiàn)。
- 通常,每個(gè)Sentinel每10秒向其所有已知的主服務(wù)器和從服務(wù)器發(fā)送INFO命令。 當(dāng)Sentinel將主服務(wù)器標(biāo)記為脫機(jī)時(shí),Sentinel發(fā)送INFO命令給脫機(jī)主服務(wù)器的所有從屬服務(wù)器的頻率將從每10秒一次更改為每秒一次。
- Sentinel和其他哨兵協(xié)商主節(jié)點(diǎn)的狀態(tài)。如果主節(jié)點(diǎn)處于SDOWN狀態(tài),投票將自動(dòng)選擇新的主節(jié)點(diǎn)。將其余的從節(jié)點(diǎn)指向新的主節(jié)點(diǎn)以進(jìn)行數(shù)據(jù)復(fù)制。
- 如果沒(méi)有足夠的哨兵以允許主服務(wù)器注銷(xiāo),則將刪除主服務(wù)器的客觀注銷(xiāo)狀態(tài)。 當(dāng)主服務(wù)器對(duì)Sentinel的PING命令返回有效答復(fù)時(shí),主服務(wù)器的主觀脫機(jī)狀態(tài)將被刪除。
- note
健壯的Redis Sentinel群集應(yīng)至少使用三個(gè)Sentinel實(shí)例,并確保將這些實(shí)例放置在不同的計(jì)算機(jī)上,甚至放置在不同的物理區(qū)域上.
Sentinel無(wú)法保證強(qiáng)一致性。 常見(jiàn)客戶(hù)端應(yīng)用程序庫(kù)中支持Sentinel。
Sentinel需要不斷測(cè)試和觀察以確保高可用性
測(cè)試
- 創(chuàng)建配置文件
內(nèi)容簡(jiǎn)單配置如下:
port?16379??#?哨兵端口號(hào) daemonize?yes sentinel?monitor?master?127.0.0.1?6379?1????#?監(jiān)視master protected-mode?no logfile?"/usr/local/bin/sentinel-1/sentinel-1.log"???#?日志文件
- 先啟動(dòng)redis設(shè)置集群,啟動(dòng)redis-cli,設(shè)6379為master
- 再啟動(dòng)sentinel
sudo?redis-sentinel?sentinel-1/sentinel.conf
- 關(guān)閉6379
- 查看另外兩個(gè)redis-cli的角色情況
- 再啟動(dòng)6379
- 查看sentinel日志
sentinel.conf說(shuō)明
#?Example?sentinel.conf #?***?IMPORTANT?*** #?綁定IP地址 #?bind?127.0.0.1?192.168.1.1 #?保護(hù)模式(是否禁止外部鏈接,除綁定的ip地址外) #?protected-mode?no #?port?<sentinel-port> #?此Sentinel實(shí)例運(yùn)行的端口 port?26379 #?默認(rèn)情況下,Redis?Sentinel不作為守護(hù)程序運(yùn)行。?如果需要,可以設(shè)置為?yes。 daemonize?no #?啟用守護(hù)進(jìn)程運(yùn)行后,Redis將在/var/run/redis-sentinel.pid中寫(xiě)入一個(gè)pid文件 pidfile?/var/run/redis-sentinel.pid #?指定日志文件名。?如果值為空,將強(qiáng)制Sentinel日志標(biāo)準(zhǔn)輸出。守護(hù)進(jìn)程下,如果使用標(biāo)準(zhǔn)輸出進(jìn)行日志記錄,則日志將發(fā)送到/dev/null logfile?"" #?sentinel?announce-ip?<ip> #?sentinel?announce-port?<port> # #?上述兩個(gè)配置指令在環(huán)境中非常有用,因?yàn)镹AT可以通過(guò)非本地地址從外部訪問(wèn)Sentinel。 # #?當(dāng)提供announce-ip時(shí),Sentinel將在通信中聲明指定的IP地址,而不是像通常那樣自動(dòng)檢測(cè)本地地址。 # #?類(lèi)似地,當(dāng)提供announce-port?有效且非零時(shí),Sentinel將宣布指定的TCP端口。 # #?這兩個(gè)選項(xiàng)不需要一起使用,如果只提供announce-ip,Sentinel將宣告指定的IP和“port”選項(xiàng)指定的服務(wù)器端口。 #?如果僅提供announce-port,Sentinel將通告自動(dòng)檢測(cè)到的本地IP和指定端口。 # #?Example: # #?sentinel?announce-ip?1.2.3.4 #?dir?<working-directory> #?每個(gè)長(zhǎng)時(shí)間運(yùn)行的進(jìn)程都應(yīng)該有一個(gè)明確定義的工作目錄。對(duì)于Redis?Sentinel來(lái)說(shuō),/tmp就是自己的工作目錄。 dir?/tmp #?sentinel?monitor?<master-name>?<ip>?<redis-port>?<quorum> # #?告訴Sentinel監(jiān)聽(tīng)指定主節(jié)點(diǎn),并且只有在至少<quorum>哨兵達(dá)成一致的情況下才會(huì)判斷它?O_DOWN?狀態(tài)。 # # #?副本是自動(dòng)發(fā)現(xiàn)的,因此您無(wú)需指定副本。 #?Sentinel本身將重寫(xiě)此配置文件,使用其他配置選項(xiàng)添加副本。另請(qǐng)注意,當(dāng)副本升級(jí)為主副本時(shí),將重寫(xiě)配置文件。 # #?注意:主節(jié)點(diǎn)(master)名稱(chēng)不能包含特殊字符或空格。 #?有效字符可以是?A-z?0-9?和這三個(gè)字符?".-_". sentinel?monitor?mymaster?127.0.0.1?6379?2 #?如果redis配置了密碼,那這里必須配置認(rèn)證,否則不能自動(dòng)切換 #?Example: # #?sentinel?auth-pass?mymaster?MySUPER--secret-0123passw0rd #?sentinel?down-after-milliseconds?<master-name>?<milliseconds> # #?主節(jié)點(diǎn)或副本在指定時(shí)間內(nèi)沒(méi)有回復(fù)PING,便認(rèn)為該節(jié)點(diǎn)為主觀下線(xiàn)?S_DOWN?狀態(tài)。 # #?默認(rèn)是30秒 sentinel?down-after-milliseconds?mymaster?30000 #?sentinel?parallel-syncs?<master-name>?<numreplicas> # #?在故障轉(zhuǎn)移期間,多少個(gè)副本節(jié)點(diǎn)進(jìn)行數(shù)據(jù)同步 sentinel?parallel-syncs?mymaster?1 #?sentinel?failover-timeout?<master-name>?<milliseconds> # #?指定故障轉(zhuǎn)移超時(shí)(以毫秒為單位)。?它以多種方式使用: # #?-?在先前的故障轉(zhuǎn)移之后重新啟動(dòng)故障轉(zhuǎn)移所需的時(shí)間已由給定的Sentinel針對(duì)同一主服務(wù)器嘗試,是故障轉(zhuǎn)移超時(shí)的兩倍。 # #?-?當(dāng)一個(gè)slave從一個(gè)錯(cuò)誤的master那里同步數(shù)據(jù)開(kāi)始計(jì)算時(shí)間。直到slave被糾正為向正確的master那里同步數(shù)據(jù)時(shí)。 # #?-?取消已在進(jìn)行但未生成任何配置更改的故障轉(zhuǎn)移所需的時(shí)間 # #?-?當(dāng)進(jìn)行failover時(shí),配置所有slaves指向新的master所需的最大時(shí)間。 #???即使過(guò)了這個(gè)超時(shí),slaves依然會(huì)被正確配置為指向master。 # #?默認(rèn)3分鐘 sentinel?failover-timeout?mymaster?180000 #?腳本執(zhí)行 # #?sentinel?notification-script和sentinel?reconfig-script用于配置調(diào)用的腳本,以通知系統(tǒng)管理員或在故障轉(zhuǎn)移后重新配置客戶(hù)端。 #?腳本使用以下規(guī)則執(zhí)行以進(jìn)行錯(cuò)誤處理: # #?如果腳本以“1”退出,則稍后重試執(zhí)行(最多重試次數(shù)為當(dāng)前設(shè)置的10次)。 # #?如果腳本以“2”(或更高的值)退出,則不會(huì)重試執(zhí)行。 # #?如果腳本因?yàn)槭盏叫盘?hào)而終止,則行為與退出代碼1相同。 # #?腳本的最長(zhǎng)運(yùn)行時(shí)間為60秒。?達(dá)到此限制后,腳本將以SIGKILL終止,并重試執(zhí)行。 #?通知腳本 # #?sentinel?notification-script?<master-name>?<script-path> # #?為警告級(jí)別生成的任何Sentinel事件調(diào)用指定的通知腳本(例如-sdown,-odown等)。 #?此腳本應(yīng)通過(guò)電子郵件,SMS或任何其他消息傳遞系統(tǒng)通知系統(tǒng)管理員?監(jiān)控的Redis系統(tǒng)出了問(wèn)題。 # #?使用兩個(gè)參數(shù)調(diào)用腳本:第一個(gè)是事件類(lèi)型,第二個(gè)是事件描述。 # #?該腳本必須存在且可執(zhí)行,以便在提供此選項(xiàng)時(shí)啟動(dòng)sentinel。 # #?舉例: # #?sentinel?notification-script?mymaster?/var/redis/notify.sh #?客戶(hù)重新配置腳本 # #?sentinel?client-reconfig-script?<master-name>?<script-path> # #?當(dāng)主服務(wù)器因故障轉(zhuǎn)移而變更時(shí),可以調(diào)用腳本執(zhí)行特定于應(yīng)用程序的任務(wù),以通知客戶(hù)端,配置已更改且主服務(wù)器地址已經(jīng)變更。 # #?以下參數(shù)將傳遞給腳本: # #?<master-name>?<role>?<state>?<from-ip>?<from-port>?<to-ip>?<to-port> # #?<state>?目前始終是故障轉(zhuǎn)移?"failover" #?<role>?是?"leader"?或?"observer" # #?參數(shù)?from-ip,?from-port,?to-ip,?to-port?用于傳遞主服務(wù)器的舊地址和所選副本的新地址。 # #?舉例: # #?sentinel?client-reconfig-script?mymaster?/var/redis/reconfig.sh #?安全 #?避免腳本重置,默認(rèn)值yes #?默認(rèn)情況下,SENTINEL?SET將無(wú)法在運(yùn)行時(shí)更改notification-script和client-reconfig-script。 #?這避免了一個(gè)簡(jiǎn)單的安全問(wèn)題,客戶(hù)端可以將腳本設(shè)置為任何內(nèi)容并觸發(fā)故障轉(zhuǎn)移以便執(zhí)行程序。 sentinel?deny-scripts-reconfig?yes #?REDIS命令重命名 # # #?在這種情況下,可以告訴Sentinel使用不同的命令名稱(chēng)而不是正常的命令名稱(chēng)。 #?例如,如果主“mymaster”和相關(guān)副本的“CONFIG”全部重命名為“GUESSME”,我可以使用: # #?SENTINEL?rename-command?mymaster?CONFIG?GUESSME # #?設(shè)置此類(lèi)配置后,每次Sentinel使用CONFIG時(shí),它將使用GUESSME。?請(qǐng)注意,實(shí)際上不需要尊重命令案例,因此在上面的示例中寫(xiě)“config?guessme”是相同的。 # #?SENTINEL?SET也可用于在運(yùn)行時(shí)執(zhí)行此配置。 # #?為了將命令設(shè)置回其原始名稱(chēng)(撤消重命名),可以將命令重命名為它自身: # #?SENTINEL?rename-command?mymaster?CONFIG?CONFIG</role></state></to-port></to-ip></from-port></from-ip></state></role></master-name></script-path></master-name></script-path></master-name></milliseconds></master-name></numreplicas></master-name></milliseconds></master-name></quorum></quorum></redis-port></ip></master-name></working-directory></port></ip></sentinel-port>
更多編程相關(guān)知識(shí),請(qǐng)?jiān)L問(wèn):編程教學(xué)!!