redis中怎么實(shí)現(xiàn)主從切換,相信很多沒有經(jīng)驗(yàn)的人對(duì)此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個(gè)問題。
彭陽網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)!從網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、成都響應(yīng)式網(wǎng)站建設(shè)等網(wǎng)站項(xiàng)目制作,到程序開發(fā),運(yùn)營(yíng)維護(hù)。創(chuàng)新互聯(lián)成立與2013年到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)。
Redis主從復(fù)制實(shí)際上就是將主Redis節(jié)點(diǎn)的數(shù)據(jù),復(fù)制到其他從Redis節(jié)點(diǎn)去進(jìn)行存儲(chǔ),當(dāng)主節(jié)點(diǎn)因?yàn)槌霈F(xiàn)異常宕機(jī)后,如何將從節(jié)點(diǎn)切換成主節(jié)點(diǎn)繼續(xù)提供服務(wù)呢?Redis主從切換主要分為以下兩種方式:手動(dòng)切換以及哨兵模式。今天我們一起來看看Redis在出現(xiàn)故障是如何進(jìn)行主從切換繼續(xù)提供服務(wù)的。
題外話
首先開始講主從切換前,先補(bǔ)充昨天遺漏的一個(gè)知識(shí)點(diǎn):我們啟動(dòng)主節(jié)點(diǎn)和啟動(dòng)不同的從節(jié)點(diǎn)啟動(dòng)間隔時(shí)間不能太短,因?yàn)橹鞴?jié)點(diǎn)需要將數(shù)據(jù)同步到不同的從節(jié)點(diǎn)會(huì)耗費(fèi)大量資源。
主從手動(dòng)切換
當(dāng)主節(jié)點(diǎn)出現(xiàn)宕機(jī)時(shí),這時(shí)候最簡(jiǎn)單的方式可以使用主從手動(dòng)切換的方式,手動(dòng)的將一臺(tái)從節(jié)點(diǎn)切換成主節(jié)點(diǎn),所以我們需要人工干預(yù)手動(dòng)設(shè)置,最關(guān)鍵在手動(dòng)切換的過程中會(huì)造成Redis服務(wù)不可用。所以說主從手動(dòng)切換的方案不是一個(gè)合適的主從切換方案,但是我們也來看下主從手動(dòng)切換是如何實(shí)現(xiàn)的。
當(dāng)主節(jié)點(diǎn)出現(xiàn)宕機(jī),這時(shí)候我們需要手動(dòng)將從節(jié)點(diǎn)設(shè)置成主節(jié)點(diǎn)。命令:
redis-cli -h <從節(jié)點(diǎn)ip> -p <從節(jié)點(diǎn)端口號(hào)> slaveof no one
通過上面命令,可以將該從節(jié)點(diǎn)臨時(shí)設(shè)置為主節(jié)點(diǎn)。當(dāng)Redis重啟時(shí),主從切換設(shè)置將會(huì)失效。然后按照上一篇主從復(fù)制的配置將其他從節(jié)點(diǎn)的主配置改成現(xiàn)在的主節(jié)點(diǎn)。當(dāng)原來的主節(jié)點(diǎn)從宕機(jī)中進(jìn)行恢復(fù),則將臨時(shí)主節(jié)點(diǎn)的數(shù)據(jù)進(jìn)行保存,將AOF文件與RDB文件拷貝替換原主節(jié)點(diǎn)下的AOF文件與RDB文件。然后重啟原主節(jié)點(diǎn)Redis服務(wù)以及臨時(shí)主節(jié)點(diǎn)Redis服務(wù),恢復(fù)原先的主從關(guān)系。但是畢竟主從手動(dòng)切換方案是存在問題的不是很適用,所以一般主從切換會(huì)采用哨兵模式。
哨兵模式
在Redis中,哨兵是一個(gè)獨(dú)立的進(jìn)程獨(dú)立運(yùn)行。由一個(gè)或多個(gè)Sentinel實(shí)例組成,可以監(jiān)視多個(gè)主節(jié)點(diǎn)以及主節(jié)點(diǎn)下的從節(jié)點(diǎn)。當(dāng)監(jiān)視的主節(jié)點(diǎn)因?yàn)楣收襄礄C(jī),Sentinel實(shí)例可以自動(dòng)的將主節(jié)點(diǎn)下的其中一個(gè)從節(jié)點(diǎn)升級(jí)為新的主節(jié)點(diǎn),由這個(gè)新的主節(jié)點(diǎn)繼續(xù)處理寫請(qǐng)求。實(shí)際上可以把哨兵理解為一個(gè)運(yùn)行在特殊模式下的Redis服務(wù)器,在哨兵服務(wù)器初始化完成后,哨兵服務(wù)器會(huì)保存所有的哨兵功能有關(guān)的狀態(tài)記錄。哨兵實(shí)際上一共有三個(gè)任務(wù):監(jiān)控(Monitoring)、提醒(Notification)、自動(dòng)故障遷移(Automatic failover)。
監(jiān)控:Sentinel實(shí)例會(huì)不斷檢測(cè)主從節(jié)點(diǎn)是否正常運(yùn)行。
提醒:當(dāng)某個(gè)節(jié)點(diǎn)出現(xiàn)異常宕機(jī)時(shí),Sentinel實(shí)例會(huì)向管理員或者其他應(yīng)用發(fā)送提醒。
自動(dòng)故障遷移:當(dāng)主節(jié)點(diǎn)宕機(jī)時(shí),Sentinel實(shí)例會(huì)將該主節(jié)點(diǎn)下的其中一個(gè)從節(jié)點(diǎn)升級(jí)為新的主節(jié)點(diǎn),并且原先其他從節(jié)點(diǎn)重新發(fā)起socket請(qǐng)求成為新的主節(jié)點(diǎn)的從節(jié)點(diǎn)。
配置中心:向客戶端返回新主節(jié)點(diǎn)的地址,就可以正常上使用新的主節(jié)點(diǎn)來處理請(qǐng)求了。
通過上面的簡(jiǎn)單介紹,其實(shí)可以發(fā)現(xiàn)哨兵模式實(shí)際上就可以將主從手動(dòng)切換給變成自動(dòng)切換,哨兵會(huì)定時(shí)通過發(fā)送命令,讓監(jiān)視的主從節(jié)點(diǎn)返回運(yùn)行狀態(tài),當(dāng)哨兵監(jiān)視到主節(jié)點(diǎn)宕機(jī),則會(huì)自動(dòng)選擇該主節(jié)點(diǎn)下的一個(gè)從節(jié)點(diǎn),切換成新的主節(jié)點(diǎn)。然后通知其他從節(jié)點(diǎn)修改成新的主節(jié)點(diǎn)的從節(jié)點(diǎn),這樣就可以成功進(jìn)行主從切換開始處理新請(qǐng)求。但是如果我們只使用一個(gè)哨兵,也就是只開啟一個(gè)Sentinel實(shí)例進(jìn)行監(jiān)視,容易出現(xiàn)問題,一般情況下會(huì)開啟多個(gè)Sentinel實(shí)例進(jìn)行監(jiān)控,一般情況下至少需要3個(gè)Sentinel實(shí)例。
節(jié)點(diǎn)的兩種宕機(jī)狀態(tài)
哨兵檢測(cè)到主節(jié)點(diǎn)宕機(jī)一般有兩種狀態(tài):sdown(主觀宕機(jī))和odown(客觀宕機(jī))。如果只有一個(gè)哨兵認(rèn)為這個(gè)主節(jié)點(diǎn)宕機(jī)了,則成為主觀宕機(jī)。如果達(dá)到一定數(shù)量的節(jié)點(diǎn)認(rèn)為該主節(jié)點(diǎn)宕機(jī),則成為客觀宕機(jī)。
哨兵如何判斷主觀宕機(jī)與客觀宕機(jī)
當(dāng)某一個(gè)哨兵ping該主節(jié)點(diǎn),在超過了is-master-down-after-milliseconds配置的超時(shí)毫秒數(shù)沒有信息返回,則該哨兵認(rèn)為這個(gè)主節(jié)點(diǎn)宕機(jī),這個(gè)時(shí)候成為主觀宕機(jī),也就是sdown。當(dāng)這個(gè)哨兵在指定時(shí)間內(nèi)收到了指定數(shù)量的哨兵同樣認(rèn)為該主節(jié)點(diǎn)宕機(jī),則這個(gè)時(shí)候就是客觀宕機(jī),也就是odown。當(dāng)一定時(shí)間內(nèi)沒有足夠數(shù)量的哨兵認(rèn)同主節(jié)點(diǎn)宕機(jī),則主節(jié)點(diǎn)的客觀宕機(jī)狀態(tài)將會(huì)移除。當(dāng)認(rèn)為主觀宕機(jī)的哨兵再次ping并得到有效回復(fù)時(shí),則主節(jié)點(diǎn)的主觀宕機(jī)也會(huì)被移除。
為什么至少需要3個(gè)Sentinel實(shí)例?
剛才說過了,當(dāng)指定時(shí)間內(nèi)指定哨兵數(shù)量都認(rèn)為主節(jié)點(diǎn)宕機(jī)則稱為客觀宕機(jī)。那指定數(shù)量是多少呢?這個(gè)指定數(shù)量實(shí)際上等于哨兵數(shù)量 / 2 + 1.也就是說如果哨兵數(shù)量等于2,出現(xiàn)一個(gè)哨兵宕機(jī)的情況,在需要主從切換的時(shí)候因?yàn)闊o法達(dá)到認(rèn)為主節(jié)點(diǎn)宕機(jī)的哨兵數(shù)量為2,所以在主節(jié)點(diǎn)出現(xiàn)宕機(jī)時(shí)無法進(jìn)行主從切換。所以說部署哨兵至少需要3個(gè)Sentinel實(shí)例來保證健壯性。
哨兵模式引發(fā)數(shù)據(jù)丟失問題
哨兵模式 + Redis主從復(fù)制這種部署結(jié)構(gòu),無法保證數(shù)據(jù)不會(huì)出現(xiàn)丟失。哨兵模式下數(shù)據(jù)丟失主要有兩種情況:
因?yàn)橹鲝膹?fù)制是異步操作,可能主從復(fù)制還沒成功,主節(jié)點(diǎn)宕機(jī)了。這時(shí)候還沒成功復(fù)制的數(shù)據(jù)就會(huì)丟失了。
如果主節(jié)點(diǎn)無法與其他從節(jié)點(diǎn)連接,但是實(shí)際上還在運(yùn)行。這時(shí)候哨兵會(huì)將一個(gè)從節(jié)點(diǎn)切換成新的主節(jié)點(diǎn),但是在這個(gè)過程中實(shí)際上主節(jié)點(diǎn)還在運(yùn)行,所以繼續(xù)向這個(gè)主節(jié)點(diǎn)寫入的數(shù)據(jù)會(huì)被丟失。
解決數(shù)據(jù)丟失方案
使用命令:
min-slaves-to-write 1
min-slaves-max-lag 10
使用這組命令可以設(shè)置至少有一個(gè)從節(jié)點(diǎn)數(shù)據(jù)復(fù)制延遲不能超過10S,也就是說如果一個(gè)直接點(diǎn)下所有從節(jié)點(diǎn)數(shù)據(jù)復(fù)制延遲都超過10S,則停止主節(jié)點(diǎn)繼續(xù)接收處理新的請(qǐng)求。這樣可以保證數(shù)據(jù)丟失最多只會(huì)丟失10S內(nèi)的數(shù)據(jù)。
看完上述內(nèi)容,你們掌握Redis中怎么實(shí)現(xiàn)主從切換的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!