溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Redis中怎么實(shí)現(xiàn)主從切換

發(fā)布時(shí)間:2021-06-21 15:09:29 來源:億速云 閱讀:189 作者:Leah 欄目:大數(shù)據(jù)

Redis中怎么實(shí)現(xiàn)主從切換,相信很多沒有經(jīng)驗(yàn)的人對此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個(gè)問題。

Redis主從復(fù)制實(shí)際上就是將主Redis節(jié)點(diǎn)的數(shù)據(jù),復(fù)制到其他從Redis節(jié)點(diǎn)去進(jìn)行存儲,當(dāng)主節(jié)點(diǎn)因?yàn)槌霈F(xiàn)異常宕機(jī)后,如何將從節(jié)點(diǎn)切換成主節(jié)點(diǎn)繼續(xù)提供服務(wù)呢?Redis主從切換主要分為以下兩種方式:手動切換以及哨兵模式。今天我們一起來看看Redis在出現(xiàn)故障是如何進(jìn)行主從切換繼續(xù)提供服務(wù)的。

題外話

首先開始講主從切換前,先補(bǔ)充昨天遺漏的一個(gè)知識點(diǎn):我們啟動主節(jié)點(diǎn)和啟動不同的從節(jié)點(diǎn)啟動間隔時(shí)間不能太短,因?yàn)橹鞴?jié)點(diǎn)需要將數(shù)據(jù)同步到不同的從節(jié)點(diǎn)會耗費(fèi)大量資源。

主從手動切換

當(dāng)主節(jié)點(diǎn)出現(xiàn)宕機(jī)時(shí),這時(shí)候最簡單的方式可以使用主從手動切換的方式,手動的將一臺從節(jié)點(diǎn)切換成主節(jié)點(diǎn),所以我們需要人工干預(yù)手動設(shè)置,最關(guān)鍵在手動切換的過程中會造成Redis服務(wù)不可用。所以說主從手動切換的方案不是一個(gè)合適的主從切換方案,但是我們也來看下主從手動切換是如何實(shí)現(xiàn)的。

當(dāng)主節(jié)點(diǎn)出現(xiàn)宕機(jī),這時(shí)候我們需要手動將從節(jié)點(diǎn)設(shè)置成主節(jié)點(diǎn)。命令:

  • redis-cli -h <從節(jié)點(diǎn)ip> -p <從節(jié)點(diǎn)端口號> slaveof no one

通過上面命令,可以將該從節(jié)點(diǎn)臨時(shí)設(shè)置為主節(jié)點(diǎn)。當(dāng)Redis重啟時(shí),主從切換設(shè)置將會失效。然后按照上一篇主從復(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)系。但是畢竟主從手動切換方案是存在問題的不是很適用,所以一般主從切換會采用哨兵模式。

哨兵模式

在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í)例可以自動的將主節(jié)點(diǎn)下的其中一個(gè)從節(jié)點(diǎn)升級為新的主節(jié)點(diǎn),由這個(gè)新的主節(jié)點(diǎn)繼續(xù)處理寫請求。實(shí)際上可以把哨兵理解為一個(gè)運(yùn)行在特殊模式下的Redis服務(wù)器,在哨兵服務(wù)器初始化完成后,哨兵服務(wù)器會保存所有的哨兵功能有關(guān)的狀態(tài)記錄。哨兵實(shí)際上一共有三個(gè)任務(wù):監(jiān)控(Monitoring)、提醒(Notification)、自動故障遷移(Automatic failover)。

  • 監(jiān)控:Sentinel實(shí)例會不斷檢測主從節(jié)點(diǎn)是否正常運(yùn)行。

  • 提醒:當(dāng)某個(gè)節(jié)點(diǎn)出現(xiàn)異常宕機(jī)時(shí),Sentinel實(shí)例會向管理員或者其他應(yīng)用發(fā)送提醒。

  • 自動故障遷移:當(dāng)主節(jié)點(diǎn)宕機(jī)時(shí),Sentinel實(shí)例會將該主節(jié)點(diǎn)下的其中一個(gè)從節(jié)點(diǎn)升級為新的主節(jié)點(diǎn),并且原先其他從節(jié)點(diǎn)重新發(fā)起socket請求成為新的主節(jié)點(diǎn)的從節(jié)點(diǎn)。

  • 配置中心:向客戶端返回新主節(jié)點(diǎn)的地址,就可以正常上使用新的主節(jié)點(diǎn)來處理請求了。

通過上面的簡單介紹,其實(shí)可以發(fā)現(xiàn)哨兵模式實(shí)際上就可以將主從手動切換給變成自動切換,哨兵會定時(shí)通過發(fā)送命令,讓監(jiān)視的主從節(jié)點(diǎn)返回運(yùn)行狀態(tài),當(dāng)哨兵監(jiān)視到主節(jié)點(diǎn)宕機(jī),則會自動選擇該主節(jié)點(diǎn)下的一個(gè)從節(jié)點(diǎn),切換成新的主節(jié)點(diǎn)。然后通知其他從節(jié)點(diǎn)修改成新的主節(jié)點(diǎn)的從節(jié)點(diǎn),這樣就可以成功進(jìn)行主從切換開始處理新請求。但是如果我們只使用一個(gè)哨兵,也就是只開啟一個(gè)Sentinel實(shí)例進(jìn)行監(jiān)視,容易出現(xiàn)問題,一般情況下會開啟多個(gè)Sentinel實(shí)例進(jìn)行監(jiān)控,一般情況下至少需要3個(gè)Sentinel實(shí)例。

節(jié)點(diǎn)的兩種宕機(jī)狀態(tài)

哨兵檢測到主節(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)將會移除。當(dāng)認(rèn)為主觀宕機(jī)的哨兵再次ping并得到有效回復(fù)時(shí),則主節(jié)點(diǎn)的主觀宕機(jī)也會被移除。

為什么至少需要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ù)不會出現(xiàn)丟失。哨兵模式下數(shù)據(jù)丟失主要有兩種情況:

  • 因?yàn)橹鲝膹?fù)制是異步操作,可能主從復(fù)制還沒成功,主節(jié)點(diǎn)宕機(jī)了。這時(shí)候還沒成功復(fù)制的數(shù)據(jù)就會丟失了。

  • 如果主節(jié)點(diǎn)無法與其他從節(jié)點(diǎn)連接,但是實(shí)際上還在運(yùn)行。這時(shí)候哨兵會將一個(gè)從節(jié)點(diǎn)切換成新的主節(jié)點(diǎn),但是在這個(gè)過程中實(shí)際上主節(jié)點(diǎn)還在運(yùn)行,所以繼續(xù)向這個(gè)主節(jié)點(diǎn)寫入的數(shù)據(jù)會被丟失。

解決數(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ù)接收處理新的請求。這樣可以保證數(shù)據(jù)丟失最多只會丟失10S內(nèi)的數(shù)據(jù)。

看完上述內(nèi)容,你們掌握Redis中怎么實(shí)現(xiàn)主從切換的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI