Redis分布式基础主从同步
?在使用Redis的時(shí)候首先開(kāi)始是從單臺(tái)Redis服務(wù)器開(kāi)始,隨著業(yè)務(wù)和用戶量的增長(zhǎng),單機(jī)會(huì)暴漏一些問(wèn)題,比如單臺(tái)服務(wù)器的響應(yīng)達(dá)到了上限、Redis服務(wù)器宕機(jī)所有請(qǐng)求全部越過(guò)緩存等等一系列問(wèn)題。
那么我們最簡(jiǎn)單的就是有一個(gè)備用的Redis服務(wù)器,當(dāng)主服務(wù)器掛了從服務(wù)器就頂替主服務(wù)器繼續(xù)服務(wù),提高可用性。
我們擁有了主從兩臺(tái)Redis服務(wù)器之后,當(dāng)主服務(wù)器掛掉之后從服務(wù)器就替換上去繼續(xù)為我們服務(wù),原來(lái)的主服務(wù)器恢復(fù)正常后我們兩臺(tái)服務(wù)器的數(shù)據(jù)又不一樣了,那么我們?nèi)绾伪WC這兩臺(tái)服務(wù)器的數(shù)據(jù)一致性問(wèn)題呢呢?前面我們提到過(guò)CAP定理和BASE理論,我們知道在分布式、集群環(huán)境中我們需要保證數(shù)據(jù)一致性。所以我們這里得使用主從同步,或者是如果我們服務(wù)器數(shù)量特別多,我們可以減輕主服務(wù)器的同步壓力,可以使用從從同步。下面我們來(lái)介紹Redis支持的幾種同步方式。
增量同步
我們知道Redis增量備份是通過(guò)保存執(zhí)行指令來(lái)備份的,那么同步的時(shí)候我們也可以如此。主節(jié)點(diǎn)會(huì)將那些對(duì)自己的狀態(tài)產(chǎn)生修改性影響的指令記錄在本地的內(nèi)存buffer中,然后異步將buffer中的指令同步到從節(jié)點(diǎn),從節(jié)點(diǎn)一邊執(zhí)行同步的指令流來(lái)達(dá)到和主節(jié)點(diǎn)一樣的狀態(tài),一邊向主節(jié)點(diǎn)反饋?zhàn)约和降侥睦锪?#xff08;偏移量) 。
但是內(nèi)存的buffer是有限的,所以Redis主節(jié)點(diǎn)不能將所有的指令都記錄在內(nèi)存buffer中,Redis的復(fù)制內(nèi)存buffer是一個(gè)定長(zhǎng)的環(huán)形數(shù)組,如果數(shù)組內(nèi)容滿了,就會(huì)從頭開(kāi)始覆蓋前面的內(nèi)容;如果因?yàn)榫W(wǎng)絡(luò)狀況不好,從節(jié)點(diǎn)在短時(shí)間內(nèi)無(wú)法和主節(jié)點(diǎn)進(jìn)行同步,那么當(dāng)網(wǎng)絡(luò)狀況恢復(fù)肘,Redis的主節(jié)點(diǎn)中那些沒(méi)有同步的指令在buffer中有可能已經(jīng)被后續(xù)的指令覆蓋掉了。
從節(jié)點(diǎn)將無(wú)法直接通過(guò)指令流來(lái)進(jìn)行同步,這個(gè)時(shí)候就需要用到更加復(fù)雜的同步機(jī)制一一快照同步。
快照同步
快照同步既全量同步,就是把整個(gè)Redis數(shù)據(jù)庫(kù)快照發(fā)送給從節(jié)點(diǎn)進(jìn)行同步,成功后接下來(lái)的動(dòng)作就是增量同步了,所以快照同步是一個(gè)非常耗資源的同步方式,這里注意的是新增加從節(jié)點(diǎn)是需要先進(jìn)行快照同步的。
過(guò)程:
先將主節(jié)點(diǎn)的數(shù)據(jù)先bgsave
將這個(gè)快照保存在磁盤上,重寫開(kāi)啟一個(gè)socket線程
通過(guò)socket線程可以發(fā)送快照給子節(jié)點(diǎn),此時(shí)的快照是所有子節(jié)點(diǎn)共享的
子節(jié)點(diǎn)同步
這里注意一個(gè)問(wèn)題:當(dāng)我們進(jìn)行快照同步的時(shí)候,增量同步也在進(jìn)行,當(dāng)增量同步的數(shù)據(jù)被覆蓋后還會(huì)進(jìn)行快照同步,如此反復(fù)形成一個(gè)死循環(huán)。
無(wú)盤復(fù)制
我們上面提到了在快照同步的時(shí)候會(huì)執(zhí)行增量同步,這里還有一個(gè)沒(méi)關(guān)注的就是Redis的AOF增量同步問(wèn)題。
當(dāng)主節(jié)點(diǎn)進(jìn)行快照同步時(shí)是先把這個(gè)快照保存到磁盤中,然后通過(guò)子線程共享文件到從節(jié)點(diǎn),這里會(huì)進(jìn)行文件的IO操作,這個(gè)操作是非常耗時(shí)的,在非SSD磁盤中存儲(chǔ)時(shí)快照同步會(huì)對(duì)系統(tǒng)產(chǎn)生較大的負(fù)載,此時(shí)剛好主節(jié)點(diǎn)到了執(zhí)行AOF備份操作,但是這兩者并不能同時(shí)進(jìn)行,所以AOF操作是會(huì)被延遲執(zhí)行的,這樣會(huì)嚴(yán)重影響主節(jié)點(diǎn)的執(zhí)行效率,所以在Redis2.8版本之后支持無(wú)盤復(fù)制。
無(wú)盤復(fù)制是指主服務(wù)器直接通過(guò)套接字將快照內(nèi)容發(fā)送到從節(jié)點(diǎn),生成快照是一個(gè)遍歷的過(guò)程,主節(jié)點(diǎn)會(huì)一邊遍歷內(nèi)存,一邊將序列化的內(nèi)容發(fā)送到從節(jié)點(diǎn),從節(jié)點(diǎn)先將接收到的內(nèi)容存儲(chǔ)到磁盤文件中,再進(jìn)行一次性加載。
同步復(fù)制
無(wú)盤復(fù)制屬于一種異步的方式,Redis3.0提供了一種同步復(fù)制的指令——wait,確保系統(tǒng)強(qiáng)一致性。wait提供兩個(gè)參數(shù),第一個(gè)參數(shù)是從節(jié)點(diǎn)的數(shù)量,第二個(gè)參數(shù)是時(shí)間,以毫秒為單位。
等待wait指令之前的所有寫操作同步到N個(gè)從節(jié)點(diǎn)最多等待T毫秒時(shí)間。如果時(shí)間=0, 表示無(wú)限等待直至N個(gè)從節(jié)點(diǎn)同步完成 。
注意:如果時(shí)間等于0,剛好有個(gè)節(jié)點(diǎn)掉線了,那么這里會(huì)一直等待,阻塞服務(wù)器。
> set key valueOK> wait 1 0(integer) 1?
總結(jié)一下:
同步類型有主從同步、從從同步
同步方式有:增量同步、快照同步、無(wú)盤復(fù)制、同步復(fù)制
增量同步內(nèi)存中的buffer環(huán)形數(shù)組滿了會(huì)覆蓋,而主節(jié)點(diǎn)會(huì)執(zhí)行快照同步
新添加從節(jié)點(diǎn)會(huì)使用快照同步
快照同步過(guò)程:先執(zhí)行bgsave把快照信息放入磁盤,并且開(kāi)啟子線程將快照共享,發(fā)送至從節(jié)點(diǎn)進(jìn)行同步
快照同步的同時(shí)也會(huì)進(jìn)行增量同步,如果增量同步已經(jīng)被覆蓋則會(huì)執(zhí)行快照同步,產(chǎn)生死循環(huán)
為了減小主節(jié)點(diǎn)的壓力,當(dāng)啟用同步時(shí)數(shù)據(jù)不經(jīng)過(guò)磁盤直接通過(guò)套接字將快照數(shù)據(jù)同步到從節(jié)點(diǎn)
?
一名正在搶救的coder
筆名:mangolove
CSDN地址:https://blog.csdn.net/mango_love
GitHub地址:https://github.com/mangoloveYu
新人創(chuàng)作打卡挑戰(zhàn)賽發(fā)博客就能抽獎(jiǎng)!定制產(chǎn)品紅包拿不停!總結(jié)
以上是生活随笔為你收集整理的Redis分布式基础主从同步的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: mfc ui2
- 下一篇: Redis缓存穿透、击穿、雪崩来解释个明