本篇內(nèi)容介紹了“redis分布式基礎(chǔ)的主從同步”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠?qū)W有所成!
創(chuàng)新互聯(lián)公司服務項目包括鹿寨網(wǎng)站建設(shè)、鹿寨網(wǎng)站制作、鹿寨網(wǎng)頁制作以及鹿寨網(wǎng)絡營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢、行業(yè)經(jīng)驗、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,鹿寨網(wǎng)站推廣取得了明顯的社會效益與經(jīng)濟效益。目前,我們服務的客戶以成都為中心已經(jīng)輻射到鹿寨省份的部分城市,未來相信會繼續(xù)擴大服務區(qū)域并繼續(xù)獲得客戶的支持與信任!
在使用Redis的時候首先開始是從單臺Redis服務器開始,隨著業(yè)務和用戶量的增長,單機會暴漏一些問題,比如單臺服務器的響應達到了上限、Redis服務器宕機所有請求全部越過緩存等等一系列問題。
那么我們最簡單的就是有一個備用的Redis服務器,當主服務器掛了從服務器就頂替主服務器繼續(xù)服務,提高可用性。
我們擁有了主從兩臺Redis服務器之后,當主服務器掛掉之后從服務器就替換上去繼續(xù)為我們服務,原來的主服務器恢復正常后我們兩臺服務器的數(shù)據(jù)又不一樣了,那么我們?nèi)绾伪WC這兩臺服務器的數(shù)據(jù)一致性問題呢呢?前面我們提到過CAP定理和BASE理論,我們知道在分布式、集群環(huán)境中我們需要保證數(shù)據(jù)一致性。所以我們這里得使用主從同步,或者是如果我們服務器數(shù)量特別多,我們可以減輕主服務器的同步壓力,可以使用從從同步。下面我們來介紹Redis支持的幾種同步方式。
增量同步我們知道Redis增量備份是通過保存執(zhí)行指令來備份的,那么同步的時候我們也可以如此。主節(jié)點會將那些對自己的狀態(tài)產(chǎn)生修改性影響的指令記錄在本地的內(nèi)存buffer中,然后異步將buffer中的指令同步到從節(jié)點,從節(jié)點一邊執(zhí)
行同步的指令流來達到和主節(jié)點一樣的狀態(tài),一邊向主節(jié)點反饋自己同步到哪里了(偏移量) 。
但是內(nèi)存的buffer是有限的,所以Redis主節(jié)點不能將所有的指令都記錄在內(nèi)存buffer中,Redis的復制內(nèi)存buffer是一個定長的環(huán)形數(shù)組,如果數(shù)組內(nèi)容滿了,就會從頭開始覆蓋前面的內(nèi)容;如果因為網(wǎng)絡狀況不好,從節(jié)點在短時間內(nèi)無法和主節(jié)點進行同步,那么當網(wǎng)絡狀況恢復肘,Redis的主節(jié)點中那些沒有同步的指令在buffer中有可能已經(jīng)被后續(xù)的指令覆蓋掉了。
從節(jié)點將無法直接通過指令流來進行同步,這個時候就需要用到更加復雜的同步機制一一快照同步。
快照同步快照同步既全量同步,就是把整個Redis數(shù)據(jù)庫快照發(fā)送給從節(jié)點進行同步,成功后接下來的動作就是增量同步了,所以快照同步是一個非常耗資源的同步方式,這里注意的是新增加從節(jié)點是需要先進行快照同步的。
過程:
先將主節(jié)點的數(shù)據(jù)先bgsave
將這個快照保存在磁盤上,重寫開啟一個socket線程
通過socket線程可以發(fā)送快照給子節(jié)點,此時的快照是所有子節(jié)點共享的
子節(jié)點同步
這里注意一個問題:當我們進行快照同步的時候,增量同步也在進行,當增量同步的數(shù)據(jù)被覆蓋后還會進行快照同步,如此反復形成一個死循環(huán)。
無盤復制我們上面提到了在快照同步的時候會執(zhí)行增量同步,這里還有一個沒關(guān)注的就是Redis的AOF增量同步問題。
當主節(jié)點進行快照同步時是先把這個快照保存到磁盤中,然后通過子線程共享文件到從節(jié)點,這里會進行文件的IO操作,這個操作是非常耗時的,在非SSD磁盤中存儲時快照同步會對系統(tǒng)產(chǎn)生較大的負載,此時剛好主節(jié)點到了執(zhí)行AOF備份操作,但是這兩者并不能同時進行,所以AOF操作是會被延遲執(zhí)行的,這樣會嚴重影響主節(jié)點的執(zhí)行效率,所以在Redis2.8版本之后支持無盤復制。
無盤復制是指主服務器直接通過套接字將快照內(nèi)容發(fā)送到從節(jié)點,生成快照是一個遍歷的過程,主節(jié)點會一邊遍歷內(nèi)存,一邊將序列化的內(nèi)容發(fā)送到從節(jié)點,從節(jié)點先將接收到的內(nèi)容存儲到磁盤文件中,再進行一次性加載。
同步復制無盤復制屬于一種異步的方式,Redis3.0提供了一種同步復制的指令——wait,確保系統(tǒng)強一致性。wait提供兩個參數(shù),第一個參數(shù)是從節(jié)點的數(shù)量,第二個參數(shù)是時間,以毫秒為單位。
等待wait指令之前的所有寫操作同步到N個從節(jié)點最多等待T毫秒時間。如果時間=0, 表示無限等待直至N個從節(jié)點同步完成 。
注意:如果時間等于0,剛好有個節(jié)點掉線了,那么這里會一直等待,阻塞服務器。
> set key valueOK> wait 1 0(integer) 1
總結(jié)一下:
同步類型有主從同步、從從同步
同步方式有:增量同步、快照同步、無盤復制、同步復制
增量同步內(nèi)存中的buffer環(huán)形數(shù)組滿了會覆蓋,而主節(jié)點會執(zhí)行快照同步
新添加從節(jié)點會使用快照同步
快照同步過程:先執(zhí)行bgsave把快照信息放入磁盤,并且開啟子線程將快照共享,發(fā)送至從節(jié)點進行同步
快照同步的同時也會進行增量同步,如果增量同步已經(jīng)被覆蓋則會執(zhí)行快照同步,產(chǎn)生死循環(huán)
為了減小主節(jié)點的壓力,當啟用同步時數(shù)據(jù)不經(jīng)過磁盤直接通過套接字將快照數(shù)據(jù)同步到從節(jié)點
“Redis分布式基礎(chǔ)的主從同步”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!