Redis 主从复制
Redis 主從復(fù)制
?
概念
主從復(fù)制,是指將一臺(tái)Redis服務(wù)器的數(shù)據(jù),復(fù)制到其他的Redis服務(wù)器。前者稱為主節(jié)點(diǎn)(master),后者稱為從節(jié)點(diǎn)(slave); 數(shù)據(jù)的復(fù)制是單向的,只能由主節(jié)點(diǎn)到從節(jié)點(diǎn)。
?
默認(rèn)情況下,每臺(tái)Redis服務(wù)器都是主節(jié)點(diǎn);且一個(gè)主節(jié)點(diǎn)可以有多個(gè)從節(jié)點(diǎn)(或沒(méi)有從節(jié)點(diǎn)),但一個(gè)從節(jié)點(diǎn)只能有一個(gè)主節(jié)點(diǎn)。
?
主從復(fù)制的作用
主從復(fù)制的作用主要包括:
?
- 數(shù)據(jù)冗余:主從復(fù)制實(shí)現(xiàn)了數(shù)據(jù)的熱備份,是持久化之外的一種數(shù)據(jù)冗余方式。
- 故障恢復(fù):當(dāng)主節(jié)點(diǎn)出現(xiàn)問(wèn)題時(shí),可以由從節(jié)點(diǎn)提供服務(wù),實(shí)現(xiàn)快速的故障恢復(fù);實(shí)際上是一種服務(wù)的冗余。
- 負(fù)載均衡:在主從復(fù)制的基礎(chǔ)上,配合讀寫(xiě)分離,可以由主節(jié)點(diǎn)提供寫(xiě)服務(wù),由從節(jié)點(diǎn)提供讀服務(wù)(即寫(xiě)Redis數(shù)據(jù)時(shí)應(yīng)用連接主節(jié)點(diǎn),讀Redis數(shù)據(jù)時(shí)應(yīng)用連接從節(jié)點(diǎn)),分擔(dān)服務(wù)器負(fù)載;尤其是在寫(xiě)少讀多的場(chǎng)景下,通過(guò)多個(gè)從節(jié)點(diǎn)分擔(dān)讀負(fù)載,可以大大提高Redis服務(wù)器的并發(fā)量。
- 高可用基石:除了上述作用以外,主從復(fù)制還是哨兵和集群能夠?qū)嵤┑幕A(chǔ),因此說(shuō)主從復(fù)制是Redis高可用的基礎(chǔ)。
?
一般來(lái)說(shuō), 要將 Redis 運(yùn)用于工程中, 只使用一臺(tái) Redis 是萬(wàn)萬(wàn)不能的(宕機(jī)) - 主從結(jié)構(gòu)下, 單個(gè) Redis 服務(wù)器會(huì)發(fā)生單點(diǎn)故障, 并且一臺(tái)服務(wù)器需要處理所有的請(qǐng)求負(fù)載, 壓力較大
- 從容量上看, 單個(gè) Redis 服務(wù)器內(nèi)存容量有限, 就算一臺(tái)Redsi 服務(wù)器的內(nèi)存容量為 256G , 也不能將所有的內(nèi)存用作 Redis 存儲(chǔ)內(nèi)存, 一般來(lái)說(shuō), 單臺(tái)Redis最大使用內(nèi)存不因該超過(guò)20G
?
電商網(wǎng)站上的2商品, 一般都是一次上傳, 無(wú)數(shù)次瀏覽, 專業(yè)術(shù)語(yǔ) 多讀少寫(xiě)
?
?
主從復(fù)制, 讀寫(xiě)分離, 80% 的情況下都是在進(jìn)行讀操作, 減緩服務(wù)器壓力, 架構(gòu)中經(jīng)常使用, 一主二從
?
?
?
環(huán)境配置
只配置從庫(kù), 不用配置主庫(kù)
查看一些信息
?
?
復(fù)制三個(gè)配置文件, 然后修改對(duì)應(yīng)的信息
- 端口
- pid名字
- 日志名字
- dump.rdb名字
?
redis-server redis.windows.conf
Linux類同
?
redis-cli -p 6379
redis-cli -p 6380
redis-cli -p 6381
?
一主二從
默認(rèn)情況下, 每臺(tái)redis 服務(wù)器都是主節(jié)點(diǎn); 我們一般情況下只用配置從機(jī)就可
?
?
主機(jī)測(cè)試
?
?
?
?
命令行的配置僅僅是暫時(shí)的, 需要永久的話可以在redis配置文件中進(jìn)行修改
?
細(xì)節(jié)
主機(jī)可以寫(xiě), 從機(jī)不能寫(xiě), 從機(jī)只能讀
?
測(cè)試: 主機(jī)斷開(kāi)連接, 從機(jī)依舊連接到主機(jī), 但是沒(méi)有寫(xiě)操作, 這時(shí)候主機(jī)如果回來(lái)了, 從機(jī)依舊可以獲取到主機(jī)所寫(xiě)的信息
?
?
如果使用命令行, 來(lái)配置的主從, 這個(gè)時(shí)候如果重啟了, 那么從機(jī)就會(huì)變成主機(jī), 只要變成從機(jī), 立馬就會(huì)從主機(jī)中獲取值
?
復(fù)制原理
全量同步
Redis全量復(fù)制一般發(fā)生在Slave初始化階段,這時(shí)Slave需要將Master上的所有數(shù)據(jù)都復(fù)制一份。具體步驟如下:
- 從服務(wù)器連接主服務(wù)器,發(fā)送SYNC命令;
- 主服務(wù)器接收到SYNC命名后,開(kāi)始執(zhí)行BGSAVE命令生成RDB文件并使用緩沖區(qū)記錄此后執(zhí)行的所有寫(xiě)命令;
- 主服務(wù)器BGSAVE執(zhí)行完后,向所有從服務(wù)器發(fā)送快照文件,并在發(fā)送期間繼續(xù)記錄被執(zhí)行的寫(xiě)命令;
- 從服務(wù)器收到快照文件后丟棄所有舊數(shù)據(jù),載入收到的快照;
- 主服務(wù)器快照發(fā)送完畢后開(kāi)始向從服務(wù)器發(fā)送緩沖區(qū)中的寫(xiě)命令;
- 從服務(wù)器完成對(duì)快照的載入,開(kāi)始接收命令請(qǐng)求,并執(zhí)行來(lái)自主服務(wù)器緩沖區(qū)的寫(xiě)命令;
?
而slave服務(wù)在接受到數(shù)據(jù)文件后, 將其存到內(nèi)存中
?
?
完成上面幾個(gè)步驟后就完成了從服務(wù)器數(shù)據(jù)初始化的所有操作,從服務(wù)器此時(shí)可以接收來(lái)自用戶的讀請(qǐng)求.
?
增量同步
Redis增量復(fù)制是指Slave初始化后開(kāi)始正常工作時(shí)主服務(wù)器發(fā)生的寫(xiě)操作同步到從服務(wù)器的過(guò)程.
增量復(fù)制的過(guò)程主要是主服務(wù)器每執(zhí)行一個(gè)寫(xiě)命令就會(huì)向從服務(wù)器發(fā)送相同的寫(xiě)命令,從服務(wù)器接收并執(zhí)行收到的寫(xiě)命令.
?
Master繼續(xù)將新的所有收集到的修改命名依次傳給slave, 完成同步
?
?
Redis主從同步策略
主從剛剛連接的時(shí)候,進(jìn)行全量同步;全同步結(jié)束后,進(jìn)行增量同步。當(dāng)然,如果有需要,slave 在任何時(shí)候都可以發(fā)起全量同步。redis 策略是,無(wú)論如何,首先會(huì)嘗試進(jìn)行增量同步,如不成功,要求從機(jī)進(jìn)行全量同步.
?
?
層層鏈路
上一個(gè)master 連接下一個(gè)slave
?
?
此時(shí)也可以完成主從復(fù)制, 但是80端口的依舊僅僅可以讀(不能寫(xiě))
?
?
如果沒(méi)有主
這個(gè)時(shí)候 80 能不能變成老大
?
手動(dòng)配置
?
此時(shí)80就為老大
?
文章已上傳gitee https://gitee.com/codingce/hexo-blog
項(xiàng)目地址: https://github.com/xzMhehe/codingce-java
總結(jié)
以上是生活随笔為你收集整理的Redis 主从复制的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【Java进阶】SpringBoot整合
- 下一篇: Redis缓存穿透、缓存击穿和缓存雪崩