溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Redis分布式基礎的主從同步

發(fā)布時間:2021-08-30 16:26:42 來源:億速云 閱讀:145 作者:chen 欄目:大數(shù)據(jù)

本篇內容介紹了“Redis分布式基礎的主從同步”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

在使用Redis的時候首先開始是從單臺Redis服務器開始,隨著業(yè)務和用戶量的增長,單機會暴漏一些問題,比如單臺服務器的響應達到了上限、Redis服務器宕機所有請求全部越過緩存等等一系列問題。

那么我們最簡單的就是有一個備用的Redis服務器,當主服務器掛了從服務器就頂替主服務器繼續(xù)服務,提高可用性。

我們擁有了主從兩臺Redis服務器之后,當主服務器掛掉之后從服務器就替換上去繼續(xù)為我們服務,原來的主服務器恢復正常后我們兩臺服務器的數(shù)據(jù)又不一樣了,那么我們如何保證這兩臺服務器的數(shù)據(jù)一致性問題呢呢?前面我們提到過CAP定理和BASE理論,我們知道在分布式、集群環(huán)境中我們需要保證數(shù)據(jù)一致性。所以我們這里得使用主從同步,或者是如果我們服務器數(shù)量特別多,我們可以減輕主服務器的同步壓力,可以使用從從同步。下面我們來介紹Redis支持的幾種同步方式。

增量同步

我們知道Redis增量備份是通過保存執(zhí)行指令來備份的,那么同步的時候我們也可以如此。主節(jié)點會將那些對自己的狀態(tài)產(chǎn)生修改性影響的指令記錄在本地的內存buffer中,然后異步將buffer中的指令同步到從節(jié)點,從節(jié)點一邊執(zhí)
行同步的指令流來達到和主節(jié)點一樣的狀態(tài),一邊向主節(jié)點反饋自己同步到哪里了(偏移量) 。

但是內存的buffer是有限的,所以Redis主節(jié)點不能將所有的指令都記錄在內存buffer中,Redis的復制內存buffer是一個定長的環(huán)形數(shù)組,如果數(shù)組內容滿了,就會從頭開始覆蓋前面的內容;如果因為網(wǎng)絡狀況不好,從節(jié)點在短時間內無法和主節(jié)點進行同步,那么當網(wǎng)絡狀況恢復肘,Redis的主節(jié)點中那些沒有同步的指令在buffer中有可能已經(jīng)被后續(xù)的指令覆蓋掉了。

從節(jié)點將無法直接通過指令流來進行同步,這個時候就需要用到更加復雜的同步機制一一快照同步。

快照同步

快照同步既全量同步,就是把整個Redis數(shù)據(jù)庫快照發(fā)送給從節(jié)點進行同步,成功后接下來的動作就是增量同步了,所以快照同步是一個非常耗資源的同步方式,這里注意的是新增加從節(jié)點是需要先進行快照同步的。

過程:

  1. 先將主節(jié)點的數(shù)據(jù)先bgsave

  2. 將這個快照保存在磁盤上,重寫開啟一個socket線程

  3. 通過socket線程可以發(fā)送快照給子節(jié)點,此時的快照是所有子節(jié)點共享的

  4. 子節(jié)點同步

這里注意一個問題:當我們進行快照同步的時候,增量同步也在進行,當增量同步的數(shù)據(jù)被覆蓋后還會進行快照同步,如此反復形成一個死循環(huán)。

無盤復制  

我們上面提到了在快照同步的時候會執(zhí)行增量同步,這里還有一個沒關注的就是Redis的AOF增量同步問題。

當主節(jié)點進行快照同步時是先把這個快照保存到磁盤中,然后通過子線程共享文件到從節(jié)點,這里會進行文件的IO操作,這個操作是非常耗時的,在非SSD磁盤中存儲時快照同步會對系統(tǒng)產(chǎn)生較大的負載,此時剛好主節(jié)點到了執(zhí)行AOF備份操作,但是這兩者并不能同時進行,所以AOF操作是會被延遲執(zhí)行的,這樣會嚴重影響主節(jié)點的執(zhí)行效率,所以在Redis2.8版本之后支持無盤復制。

無盤復制是指主服務器直接通過套接字將快照內容發(fā)送到從節(jié)點,生成快照是一個遍歷的過程,主節(jié)點會一邊遍歷內存,一邊將序列化的內容發(fā)送到從節(jié)點,從節(jié)點先將接收到的內容存儲到磁盤文件中,再進行一次性加載。

同步復制

無盤復制屬于一種異步的方式,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

總結一下

  1. 同步類型有主從同步、從從同步

  2. 同步方式有:增量同步、快照同步、無盤復制、同步復制

  3. 增量同步內存中的buffer環(huán)形數(shù)組滿了會覆蓋,而主節(jié)點會執(zhí)行快照同步

  4. 新添加從節(jié)點會使用快照同步

  5. 快照同步過程:先執(zhí)行bgsave把快照信息放入磁盤,并且開啟子線程將快照共享,發(fā)送至從節(jié)點進行同步

  6. 快照同步的同時也會進行增量同步,如果增量同步已經(jīng)被覆蓋則會執(zhí)行快照同步,產(chǎn)生死循環(huán)

  7. 為了減小主節(jié)點的壓力,當啟用同步時數(shù)據(jù)不經(jīng)過磁盤直接通過套接字將快照數(shù)據(jù)同步到從節(jié)點

“Redis分布式基礎的主從同步”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關的知識可以關注億速云網(wǎng)站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內容。

AI