Redis中如何實(shí)現(xiàn)主從復(fù)制

redis中如何實(shí)現(xiàn)主從復(fù)制,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。

成都創(chuàng)新互聯(lián)公司專注于蘄春網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠為您提供蘄春營銷型網(wǎng)站建設(shè),蘄春網(wǎng)站制作、蘄春網(wǎng)頁設(shè)計(jì)、蘄春網(wǎng)站官網(wǎng)定制、小程序制作服務(wù),打造蘄春網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供蘄春網(wǎng)站排名全網(wǎng)營銷落地服務(wù)。

Redis復(fù)制概論

數(shù)據(jù)庫復(fù)制指的是發(fā)生在不同數(shù)據(jù)庫實(shí)例之間,單向的信息傳播的行為,通常由被復(fù)制方和復(fù)制方組成,被復(fù)制方和復(fù)制方之間建立網(wǎng)絡(luò)連接,復(fù)制方式通常為被復(fù)制方主動將數(shù)據(jù)發(fā)送到復(fù)制方,復(fù)制方接收到數(shù)據(jù)存儲在當(dāng)前實(shí)例,最終目的是為了保證雙方的數(shù)據(jù)一致、同步。

Redis中如何實(shí)現(xiàn)主從復(fù)制

復(fù)制示意圖

Redis復(fù)制方式

Redis的復(fù)制方式有兩種,一種是主(master)-從(slave)模式,一種是從(slave)-從(slave)模式,因此Redis的復(fù)制拓?fù)鋱D會豐富一些,可以像星型拓?fù)?,也可以像個有向無環(huán):

Redis中如何實(shí)現(xiàn)主從復(fù)制

Redis集群復(fù)制結(jié)構(gòu)圖

通過配置多個Redis實(shí)例獨(dú)立運(yùn)行、定向復(fù)制,形成Redis集群,master負(fù)責(zé)寫、slave負(fù)責(zé)讀。

復(fù)制優(yōu)點(diǎn)

通過配置多個Redis實(shí)例,數(shù)據(jù)備份在不同的實(shí)例上,主庫專注寫請求,從庫負(fù)責(zé)讀請求,這樣的好處主要體現(xiàn)在下面幾個方面:

1、高可用性

在一個Redis集群中,如果master宕機(jī),slave可以介入并取代master的位置,因此對于整個Redis服務(wù)來說不至于提供不了服務(wù),這樣使得整個Redis服務(wù)足夠安全。

2、高性能

在一個Redis集群中,master負(fù)責(zé)寫請求,slave負(fù)責(zé)讀請求,這么做一方面通過將讀請求分散到其他機(jī)器從而大大減少了master服務(wù)器的壓力,另一方面slave專注于提供讀服務(wù)從而提高了響應(yīng)和讀取速度。

3、水平擴(kuò)展性

通過增加slave機(jī)器可以橫向(水平)擴(kuò)展Redis服務(wù)的整個查詢服務(wù)的能力。

復(fù)制缺點(diǎn)

復(fù)制提供了高可用性的解決方案,但同時引入了分布式計(jì)算的復(fù)雜度問題,認(rèn)為有兩個核心問題:

  1. 數(shù)據(jù)一致性問題,如何保證master服務(wù)器寫入的數(shù)據(jù)能夠及時同步到slave機(jī)器上。

  2. 編程復(fù)雜,如何在客戶端提供讀寫分離的實(shí)現(xiàn)方案,通過客戶端實(shí)現(xiàn)將讀寫請求分別路由到master和slave實(shí)例上。

上面兩個問題,尤其是第一個問題是Redis服務(wù)實(shí)現(xiàn)一直在演變,致力于解決的一個問題。

復(fù)制實(shí)時性和數(shù)據(jù)一致性矛盾

Redis提供了提高數(shù)據(jù)一致性的解決方案,本文后面會進(jìn)行介紹,一致性程度的增加雖然使得我能夠更信任數(shù)據(jù),但是更好的一致性方案通常伴隨著性能的損失,從而減少了吞吐量和服務(wù)能力。然而我們希望系統(tǒng)的性能達(dá)到最優(yōu),則必須要犧牲一致性的程度,因此Redis的復(fù)制實(shí)時性和數(shù)據(jù)一致性是存在矛盾的。

Redis復(fù)制原理及特性

slave指向master

舉個例子,我們有四臺redis實(shí)例,M1,R1、R2、R3,其中M1為master,R1、R2、R3分別為三臺slave redis實(shí)例。在M1啟動如下:

./redis-server ../redis8000.conf --port 8000

下面分別為R1、R2、R3的啟動命令:

 ./redis-server ../redis8001.conf --port 8001 --slaveof 127.0.0.1 8000 ./redis-server ../redis8002.conf --port 8002 --slaveof 127.0.0.1 8000 ./redis-server ../redis8003.conf --port 8003 --slaveof 127.0.0.1 8000

這樣,我們就成功的啟動了四臺Redis實(shí)例,master實(shí)例的服務(wù)端口為8000,R1、R2、R3的服務(wù)端口分別為8001、8002、8003,集群圖如下:

Redis中如何實(shí)現(xiàn)主從復(fù)制

Redis集群復(fù)制拓?fù)?/p>

上面的命令在slave啟動的時候就指定了master機(jī)器,我們也可以在slave運(yùn)行的時候通過slaveof命令來指定master機(jī)器。

復(fù)制過程

Redis復(fù)制主要由SYNC命令實(shí)現(xiàn),復(fù)制過程如下圖:

Redis中如何實(shí)現(xiàn)主從復(fù)制

Redis復(fù)制過程

上圖為Redis復(fù)制工作過程:

  1. slave向master發(fā)送sync命令。

  2. master開啟子進(jìn)程來講dataset寫入rdb文件,同時將子進(jìn)程完成之前接收到的寫命令緩存起來。

  3. 子進(jìn)程寫完,父進(jìn)程得知,開始將RDB文件發(fā)送給slave。

  4. master發(fā)送完RDB文件,將緩存的命令也發(fā)給slave。

  5. master增量的把寫命令發(fā)給slave。

值得注意的是,當(dāng)slave跟master的連接斷開時,slave可以自動的重新連接master,在redis2.8版本之前,每當(dāng)slave進(jìn)程掛掉重新連接master的時候都會開始新的一輪全量復(fù)制。如果master同時接收到多個slave的同步請求,則master只需要備份一次RDB文件。

增量復(fù)制

上面復(fù)制過程介紹的最后提到,slave和master斷開了、當(dāng)slave和master重新連接上之后需要全量復(fù)制,這個策略是很不友好的,從Redis2.8開始,Redis提供了增量復(fù)制的機(jī)制:

Redis中如何實(shí)現(xiàn)主從復(fù)制

增量復(fù)制機(jī)制

master除了備份RDB文件之外還會維護(hù)者一個環(huán)形隊(duì)列,以及環(huán)形隊(duì)列的寫索引和slave同步的全局offset,環(huán)形隊(duì)列用于存儲最新的操作數(shù)據(jù),當(dāng)slave和maste斷開重連之后,會把slave維護(hù)的offset,也就是上一次同步到哪里的這個值告訴master,同時會告訴master上次和當(dāng)前slave連接的master的runid,滿足下面兩個條件,Redis不會全量復(fù)制:

  1. slave傳遞的run id和master的run id一致。

  2. master在環(huán)形隊(duì)列上可以找到對呀offset的值。

滿足上面兩個條件,Redis就不會全量復(fù)制,這樣的好處是大大的提高的性能,不做無效的功。

增量復(fù)制是由psync命令實(shí)現(xiàn)的,slave可以通過psync命令來讓Redis進(jìn)行增量復(fù)制,當(dāng)然最終是否能夠增量復(fù)制取決于環(huán)形隊(duì)列的大小和slave的斷線時間長短和重連的這個master是否是之前的master。

環(huán)形隊(duì)列大小配置參數(shù):

repl-backlog-size 1mb

Redis同時也提供了當(dāng)沒有slave需要同步的時候,多久可以釋放環(huán)形隊(duì)列:

repl-backlog-ttl 3600

免持久化復(fù)制

免持久化機(jī)制官方叫做Diskless Replication,前面基于RDB文件寫磁盤的方式可以看出,Redis必須要先將RDB文件寫入磁盤,才進(jìn)行網(wǎng)絡(luò)傳輸,那么為什么不能直接通過網(wǎng)絡(luò)把RDB文件傳送給slave呢?免持久化復(fù)制就是做這個事情的,而且在Redis2.8.18版本開始支持,當(dāng)然目前還是實(shí)驗(yàn)階段。

值得注意的是,一旦基于Diskless Replication的復(fù)制傳送開始,新的slave請求需要等待這次傳輸完畢才能夠得到服務(wù)。

是否開啟Diskless Replication的開關(guān)配置為:

repo-diskless-sync no

為了讓后續(xù)的slave能夠盡量趕上本次復(fù)制,Redis提供了一個參數(shù)配置指定復(fù)制開始的時間延遲:

repl-diskless-sync-delay 5

slave只讀模式

自從Redis2.6版本開始,支持對slave的只讀模式的配置,默認(rèn)對slave的配置也是只讀。只讀模式的slave將會拒絕客戶端的寫請求,從而避免因?yàn)閺膕lave寫入而導(dǎo)致的數(shù)據(jù)不一致問題。

半同步復(fù)制

和MySQL復(fù)制策略有點(diǎn)類似,Redis復(fù)制本身是異步的,但也提供了半同步的復(fù)制策略,半同步復(fù)制策略在Redis復(fù)制中的語義是這樣的:

允許用戶給出這樣的配置:在maste接受寫操作的時候,只有當(dāng)一定時間間隔內(nèi),至少有N臺slave在線,否則寫入無效。

上面功能的實(shí)現(xiàn)基于Redis下面特性:

  1. Redis slaves每秒鐘會ping一次master,告訴master當(dāng)前slave復(fù)制到哪里了。

  2. Redis master會記住每個slave復(fù)制到哪里了。

我們可以通過下面配置來指定時間間隔和N這個值:

min-slaves-to-write <number of slaves>min-slaves-max-lag <number of seconds>

當(dāng)配置了上面兩個參數(shù)之后,一旦對于一個寫操作沒有滿足上面的兩個條件,則master會報錯,并且將本次寫操作視為無效。這有點(diǎn)像CAP理論中的“C”,即一致性實(shí)現(xiàn),雖然半同步策略不能夠完全保證master和slave的數(shù)據(jù)一致性,但是相對減少了不一致性的窗口期。

看完上述內(nèi)容是否對您有幫助呢?如果還想對相關(guān)知識有進(jìn)一步的了解或閱讀更多相關(guān)文章,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對創(chuàng)新互聯(lián)的支持。

分享標(biāo)題:Redis中如何實(shí)現(xiàn)主從復(fù)制
本文地址:http://bm7419.com/article2/gegoic.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站策劃、營銷型網(wǎng)站建設(shè)動態(tài)網(wǎng)站、虛擬主機(jī)外貿(mào)網(wǎng)站建設(shè)、靜態(tài)網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)頁設(shè)計(jì)公司