redis主從復(fù)制的原理及實(shí)現(xiàn)
redis的四種模式:單例模式;主從模式;哨兵模式,集群模式
一、主從模式
單例模式雖然操作簡單,但是不具備高可用
缺點(diǎn):
- 單點(diǎn)的宕機(jī)引來的服務(wù)的災(zāi)難、數(shù)據(jù)丟失
- 單點(diǎn)服務(wù)器內(nèi)存瓶頸,無法無限縱向擴(kuò)容
解決辦法:
單節(jié)點(diǎn)宕機(jī),可以由其他節(jié)點(diǎn)暫時(shí)接替,宕機(jī)的慢慢排查,也就是主從模式
優(yōu)點(diǎn)
有了主從,提高了Redis整體的可用性,當(dāng)主節(jié)點(diǎn)(master)掛了,可以把從節(jié)點(diǎn)(slave)手動升級為主節(jié)點(diǎn)繼續(xù)服務(wù)。
缺點(diǎn)
master掛了整個(gè)Redis將失去寫操作的能力,僅具備讀操作,需要運(yùn)維半夜爬起來手動升級,中間的請求失敗數(shù)據(jù)丟失無法容忍。
解決辦法
可以有一種方式自動升級slave為master ------【哨兵模式】
1.1主從復(fù)制
從一臺Redis服務(wù)器的數(shù)據(jù)(主節(jié)點(diǎn)master),復(fù)制到其他Redis服務(wù)器(從節(jié)點(diǎn)slave)。數(shù)據(jù)復(fù)制單向,只能由主節(jié)點(diǎn)到從節(jié)點(diǎn),master可讀可寫,slave只可讀不可寫;默認(rèn)每臺Redis服務(wù)器都是主節(jié)點(diǎn),從節(jié)點(diǎn)需要在配置文件中單獨(dú)配置,才會從默認(rèn)的主節(jié)點(diǎn)變成從節(jié)點(diǎn)。一個(gè)主節(jié)點(diǎn)可以有0個(gè)或多個(gè)從節(jié)點(diǎn),但每個(gè)從節(jié)點(diǎn)只能有一個(gè)主節(jié)點(diǎn)。
1.1.1 復(fù)制原理
slave第一次連接master,一定會執(zhí)行一次全量復(fù)制
全量復(fù)制數(shù)據(jù)量過大,會造成很大的網(wǎng)絡(luò)開銷,消耗CPU/內(nèi)存/硬盤IO
增量復(fù)制用于處理在主從復(fù)制中因網(wǎng)絡(luò)等數(shù)據(jù)丟失的場景,當(dāng)slave再次連接上master,并且就是原來的master,如果條件允許,master補(bǔ)發(fā)數(shù)據(jù)給slave,補(bǔ)發(fā)數(shù)據(jù)量小,避免全量復(fù)制的開銷(到底能不能復(fù)制還要看offset和buffer的情況)
如果slave再次連上的master是新選舉的master,那么只能進(jìn)行全量復(fù)制
早期的redis只有全量復(fù)制,增量復(fù)制是對全量復(fù)制的重大優(yōu)化,盡量采用2.8以上版本
1.1.1.1 全量復(fù)制
- slave給master發(fā)一個(gè)sync同步命令
- master通過bgsave命令fork子進(jìn)程,持久化生成RDB文件
- master通過網(wǎng)絡(luò)將RDB文件傳給slave
- slave清空老數(shù)據(jù),載入新的RDB文件,此時(shí)slave阻塞,無法響應(yīng)客戶端,專心復(fù)制
1.1.1.2 增量復(fù)制
- 主從節(jié)點(diǎn)各自維護(hù)自己的復(fù)制偏移量offset,主節(jié)點(diǎn)寫入命令時(shí),offset=offset+命令字節(jié)長度;從節(jié)點(diǎn)收到主節(jié)點(diǎn)命令也會相應(yīng)增加自己的offset,并同步給主節(jié)點(diǎn)。主節(jié)點(diǎn)同時(shí)維護(hù)自己的offset和從節(jié)點(diǎn)的offset,以此來判斷主從節(jié)點(diǎn)數(shù)據(jù)是否一致。
- 主節(jié)點(diǎn)指令記錄在本地buffer(緩沖區(qū)),異步將buffer同步給從節(jié)點(diǎn)
- 若網(wǎng)絡(luò)不好,同步速度慢了,buffer滿了就會從頭開始覆蓋前面的內(nèi)容,于是無法增量復(fù)制,必須全量復(fù)制
# 主從原理
1. 副本庫通過slaveof 127.0.0.1 6379命令,連接主庫,并發(fā)送SYNC給主庫
2. 主庫收到SYNC,會立即觸發(fā)BGSAVE,后臺保存RDB,發(fā)送給副本庫
3. 副本庫接收后會應(yīng)用RDB快照
4. 主庫會陸續(xù)將中間產(chǎn)生的新的操作,保存并發(fā)送給副本庫
5. 到此,我們主復(fù)制集就正常工作了
6. 再此以后,主庫只要發(fā)生新的操作,都會以命令傳播的形式自動發(fā)送給副本庫.
7. 所有復(fù)制相關(guān)信息,從info信息中都可以查到.即使重啟任何節(jié)點(diǎn),他的主從關(guān)系依然都在.
8. 如果發(fā)生主從關(guān)系斷開時(shí),從庫數(shù)據(jù)沒有任何損壞,在下次重連之后,從庫發(fā)送PSYNC給主庫
9. 主庫只會將從庫缺失部分的數(shù)據(jù)同步給從庫應(yīng)用,達(dá)到快速恢復(fù)主從的目的# 主庫是否要開啟持久化(一般情況要開啟)
如果不開有可能,主庫重啟操作,造成所有主從數(shù)據(jù)丟失!
1.2 讀寫分離 ;
大部分情況都是讀操作,將讀操作放在從節(jié)點(diǎn),寫操作放在主節(jié)點(diǎn),減緩服務(wù)器壓力;同時(shí)一些執(zhí)行耗時(shí)比較久的操作也可以放在一臺從節(jié)點(diǎn)完成,例如keys、sort。(什么時(shí)候連主節(jié)點(diǎn)寫,什么時(shí)候連從節(jié)點(diǎn)讀,由客戶端自己控制)
最低配:一主二從,當(dāng)主節(jié)點(diǎn)宕機(jī)后,其中一個(gè)從節(jié)點(diǎn)升級為主節(jié)點(diǎn),還能剩一個(gè)從節(jié)點(diǎn)。
1.3 主要作用
- 數(shù)據(jù)冗余:熱備份,持久化另一種方式
- 故障恢復(fù):master宕機(jī),快速升級slave為master
- 讀寫分離:master寫,slave,提高服務(wù)器負(fù)載能力,同時(shí)可以根據(jù)需求添加slave
- 負(fù)載均衡:配合讀寫分離,讀多寫少場景,多個(gè)slave分擔(dān)負(fù)載,大大提高并發(fā)
- 高可用基石:是實(shí)現(xiàn)哨兵和集群的基礎(chǔ)
二、主從的搭建具體操作
# 前置條件1 :至少需要兩臺機(jī)器--》在一臺機(jī)器運(yùn)行兩個(gè)redis實(shí)例 # 前置條件2:輔助配置(主從數(shù)據(jù)一致性配置) min-slaves-to-write 1 min-slaves-max-lag 3 #那么在從服務(wù)器的數(shù)量少于1個(gè),或者三個(gè)從服務(wù)器的延遲(lag)值都大于或等于3秒時(shí),主服務(wù)器將拒絕執(zhí)行寫命令 # 方式一: # 1 6380是從,6379是主 # 2 啟動器兩臺實(shí)例 # 3 搭建主從關(guān)系 -在從庫上:slaveof ip port slaveof 127.0.0.1 6379 # 4 斷開主從關(guān)系 -在從庫上:slaveof no one # 方式二:配置文件方式 # 在從庫的配置文件中: slaveof 127.0.0.1 6379 slave-read-only yes # 使用info查看主從關(guān)系
到此這篇關(guān)于redis主從復(fù)制的原理及實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)redis主從復(fù)制內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Redis server 主從復(fù)制配置實(shí)現(xiàn)
- Redis主從復(fù)制與讀寫分離的實(shí)現(xiàn)
- Docker搭建Redis主從復(fù)制的實(shí)現(xiàn)步驟
- Redis主從復(fù)制分步講解使用
- Redis主從復(fù)制操作和配置詳情
- Redis6 主從復(fù)制及哨兵機(jī)制的實(shí)現(xiàn)
- Redis實(shí)現(xiàn)主從復(fù)制方式(Master&Slave)
- 關(guān)于Redis的主從復(fù)制及哨兵問題
- 淺談Redis主從復(fù)制以及主從復(fù)制原理
- 詳解Redis主從復(fù)制實(shí)踐
- Redis7.2.x主從復(fù)制的實(shí)現(xiàn)示例
相關(guān)文章
基于session?Redis實(shí)現(xiàn)登錄
這篇文章主要介紹了基于session?Redis實(shí)現(xiàn)登錄的相關(guān)資料,需要的朋友可以參考下2023-10-10Redis數(shù)據(jù)庫分布式設(shè)計(jì)方案介紹
大家好,本篇文章主要講的是Redis數(shù)據(jù)庫分布式設(shè)計(jì)方案介紹,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下2022-01-01redis通過lua腳本,獲取滿足key pattern的所有值方式
這篇文章主要介紹了redis通過lua腳本,獲取滿足key pattern的所有值方式,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-03-03一起raid數(shù)據(jù)恢復(fù)及回遷成功的案例
這篇文章主要介紹了一起raid數(shù)據(jù)恢復(fù)及回遷成功的案例,需要的朋友可以參考下2017-04-04