您好,登錄后才能下訂單哦!
本篇內(nèi)容主要講解“Redis主從復(fù)制相關(guān)配置和常見問題的解決方法”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“Redis主從復(fù)制相關(guān)配置和常見問題的解決方法”吧!
主從復(fù)制的配置都是在從節(jié)點配置,所以以下幾個參數(shù)都是在從節(jié)點配置
1、slaveof <master ip> <master port>
slave實例需要配置該項,指向master的ip和port
2、masterauth <master-password>
如果master實例啟用了密碼,則該配置項需要填master的啟動密碼,若master未啟用密碼,該配置需要注釋掉
3、slave-server-stale-data
指定slave與master連接中斷時的動作,默認(rèn)為yes,表明slave會繼續(xù)應(yīng)答來自client的請求,但這些數(shù)據(jù)可能已經(jīng)過期(因為連接中斷導(dǎo)致無法從master同步)。若配置為no,則slave除正常應(yīng)答info和slaveof命令外,其余來自客戶端請求的命令會均得到“sync with master in prigress”的應(yīng)答,直到該slave與master的連接重建成功或改slave被提升為master
4、slave-read-only
指定slave是否只讀,默認(rèn)為yes。若配置為no,這表示slave是可寫的,但是寫的內(nèi)容在主從同步后會被刪除
5、repl-disable-tcp-nodelay
指向slave同步數(shù)據(jù)時,是否禁用scoket的NO_DELAY選項,若配置為yes則禁用NO_DELAY,則tcp協(xié)議棧會合并小包統(tǒng)一發(fā)送,這樣可以減少主從節(jié)點間的包數(shù)量并節(jié)省寬帶,但會增加數(shù)據(jù)同步到slave的時間。若配置為no,表明啟用NO_DELAY,則tcp協(xié)議棧不會延遲小包的發(fā)送時機(jī),這樣數(shù)據(jù)同步的延時會減少,但需要更大的寬帶,通常情況下,應(yīng)該配置為no以降低同步延時,但在主從節(jié)點間網(wǎng)絡(luò)負(fù)載已經(jīng)很高的情況下, 可以配置為yes
6、slave-priority
指定slave的優(yōu)先級,在不只1個salve存在的部署環(huán)境下,當(dāng)master宕機(jī)時,redis sentinel會將priority值最小的slave提升為master,需要注意的是,若改配置項為0,則對應(yīng)的slave永遠(yuǎn)不會被redis sentinel自動提升為master
讀流量分?jǐn)偟綇墓?jié)點,這是個非常好的特性,如果一個業(yè)務(wù)只需要讀數(shù)據(jù),那么我們只需要連接一臺slave從機(jī)讀數(shù)據(jù)
雖然讀寫有優(yōu)勢,能夠讓讀這部分分配給各個slave從機(jī),如果不夠,直接加slave機(jī)器就好了,但是也會出現(xiàn)以下問題
1、復(fù)制數(shù)據(jù)延遲
可能會出現(xiàn)slave延遲當(dāng)值讀寫不一致等問題,當(dāng)然你也可以使用監(jiān)控偏移量offset,如果offset超出范圍就切換到master上,邏輯切換,而具體延遲多少,可以通過info replication的offset指標(biāo)進(jìn)行排查
對于無法容忍大量延遲場景,可以編寫外部監(jiān)控程序(consul)監(jiān)聽主節(jié)點的復(fù)制偏移量,當(dāng)延遲較大時觸發(fā)報警或者通知客戶端避免讀取延遲過高的從節(jié)點
同時從節(jié)點的slave-serve-stale-data參數(shù)也與此有關(guān),它控制這種情況下從節(jié)點的表現(xiàn):如果為yes(默認(rèn)值),則從節(jié)點仍能夠響應(yīng)客戶端的命令;如果為no,則從節(jié)點只能響應(yīng)info、slaveof等少數(shù)命令。該參數(shù)的設(shè)置與應(yīng)用對數(shù)據(jù)一致性的要求有關(guān);如果對數(shù)據(jù)一致性要求很高,則應(yīng)設(shè)置為no。
2、只有n個從節(jié)點鏈接的時候才允許寫入
redis2.8以后,可以設(shè)置從節(jié)點在有N臺從節(jié)點鏈接的時候可以寫入請求,然后因為redis使用的是異步復(fù)制,所以沒有辦法保證從節(jié)點確實收到的給定寫入請求,所以存在一個窗口期的數(shù)據(jù)丟失的可能性。
下來解釋一下這個特性是如何工作的
從節(jié)點每秒鐘都會ping主節(jié)點,告知它所有的復(fù)制流工作了
主節(jié)點會記住每個從節(jié)點收到的最新的ping
用戶可以給主節(jié)點配置一個在等于從節(jié)點的數(shù)量的最低值和不超過最高值之間的延遲
如果至少有N個從節(jié)點,如果少于延遲M秒,則寫入就將被接受
你可能覺得經(jīng)最大努力保證數(shù)據(jù)安全機(jī)制,雖然數(shù)據(jù)一致性無法保證,但是至少只是幾秒的時間窗口內(nèi)丟失數(shù)據(jù),通常情況下范圍數(shù)據(jù)丟失可比無范圍數(shù)據(jù)丟失好多了
如果條件不滿足,主節(jié)點將會返回一個錯誤,并且寫入請求將不接受
主機(jī)配置兩個參數(shù):
最小的從主機(jī)連接數(shù)量
min-slaves-to-write <number of slaves>
最大的延遲時間
min-slaves-max-lag <number of seconds>
舉個例子,如果我們向主服務(wù)器提供以下設(shè)置:
min-slaves-to-write 3min-slaves-max-lag 10
那么在從服務(wù)器的數(shù)量少于3個,或者三個從服務(wù)器的延遲(lag)值都大于或等于10秒時,主服務(wù)器將拒絕執(zhí)行寫命令
3、如何選擇,要不要讀寫分離
沒有最合適的方案,只有最合適的場景,讀寫分離需要業(yè)務(wù)可以容忍一定程度的數(shù)據(jù)不一致,適合讀多寫少的業(yè)務(wù)場景,讀寫分離,是為了什么,主要是因為要建立一主多從的架構(gòu),才能橫向任意擴(kuò)展slave node去支撐更大的讀吞吐量
對于從節(jié)點的故障問題,需要在客戶端維護(hù)一個可用從節(jié)點可用列表,當(dāng)從節(jié)點故障時,立刻切換到其他從節(jié)點或主節(jié)點,之后redis Cluster 時候可以解決這個問題
主機(jī)和從機(jī)不同,經(jīng)常導(dǎo)致主機(jī)和從機(jī)的配置不一致,并帶來的問題
數(shù)據(jù)丟失:主機(jī)和從機(jī)有時候會發(fā)生配置不一致的情況,例如maxmemory不一致,如果主機(jī)配置maxmemory為8g,從機(jī)slave設(shè)置為4g,這個時候是可以用的,而且還不會報錯。但是如果要做高可用,讓從節(jié)點變成主節(jié)點的時候,就會發(fā)現(xiàn)數(shù)據(jù)已經(jīng)丟失了,而且無法挽回
全量復(fù)制指的是當(dāng)slave從機(jī)斷掉并重啟后,runid產(chǎn)生變化而導(dǎo)致需要在master主機(jī)里拷貝全部數(shù)據(jù)。這種拷貝全部數(shù)據(jù)的過程非常耗資源
全量復(fù)制是不可避免的,例如第一次的全量復(fù)制是不可避免的,這是我們需要選擇小主節(jié)點且maxmemory值不要過大,這樣就比較快。同時選擇在低峰值的時候做全量復(fù)制
1、主從節(jié)點運行的runid不匹配。主節(jié)點如果重啟,runid將會發(fā)生變化。如果從節(jié)點監(jiān)控到runid不是同一個,它就會認(rèn)為你的節(jié)點不安全。當(dāng)發(fā)生故障轉(zhuǎn)移時候,如果主節(jié)點發(fā)生故障,那么從機(jī)就會變成主節(jié)點。后邊會說到哨兵和集群
2、復(fù)制緩沖區(qū)空間不足,比如默認(rèn)1M,可以部分復(fù)制。但如果緩沖區(qū)不夠大的話,首先需要網(wǎng)絡(luò)中斷,部分復(fù)制就無法滿足。其次需要增大復(fù)制緩沖區(qū)配置(relbacklogsize)對網(wǎng)絡(luò)的緩沖增強(qiáng)
在一些場景下,可能希望對主節(jié)點進(jìn)行重啟,例如主節(jié)點內(nèi)存碎片率過高,或者希望調(diào)整一些只能在啟動時調(diào)整的參數(shù)。如果使用普通的手段重啟主節(jié)點,會使得runid發(fā)生變化,可能導(dǎo)致不必要的全量復(fù)制
為了解決這個問題,Redis提供了debug reload的重啟方式:重啟后,主節(jié)點的runid和offset都不受影響,避免了全量復(fù)制。
例如:當(dāng)一個主機(jī)下面掛了很多個slave從機(jī)的時候,主機(jī)master掛了,這時master主機(jī)重啟后,因為runid發(fā)生了變化,所有的slave從機(jī)都要做一次全量復(fù)制。這將引起單節(jié)點和單機(jī)器的復(fù)制風(fēng)暴,開銷會非常大。
解決:
可以采用樹狀結(jié)構(gòu)降低多個從節(jié)點對主節(jié)點的消耗
從節(jié)點采用樹狀樹非常有用,網(wǎng)絡(luò)開銷交給位于中間層的從節(jié)點,而不必消耗頂層的主節(jié)點。但是這種樹狀結(jié)構(gòu)也帶來了運維的復(fù)雜性,增加了手動和自動處理故障轉(zhuǎn)移的難度
由于 Redis 的單線程架構(gòu),通常單臺機(jī)器會部署多個 Redis 實例。當(dāng)一臺機(jī)器(machine)上同時部署多個主節(jié)點(master)時,如果每個 master 主機(jī)只有一臺 slave 從機(jī),那么當(dāng)機(jī)器宕機(jī)以后,會產(chǎn)生大量全量復(fù)制。這種情況是非常危險的情況,帶寬馬上會被占用,會導(dǎo)致不可用。
解決:
應(yīng)該把主節(jié)點盡量分散在多臺機(jī)器上,避免在單臺機(jī)器上部署過多的主節(jié)點。
當(dāng)主節(jié)點所在機(jī)器故障后提供故障轉(zhuǎn)移機(jī)制,避免機(jī)器恢復(fù)后進(jìn)行密集的全量復(fù)制
到此,相信大家對“Redis主從復(fù)制相關(guān)配置和常見問題的解決方法”有了更深的了解,不妨來實際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。