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

這篇文章主要為大家展示了“redis如何實(shí)現(xiàn)主從復(fù)制”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“Redis如何實(shí)現(xiàn)主從復(fù)制”這篇文章吧。

創(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)定制、小程序定制開發(fā)服務(wù),打造中方網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供中方網(wǎng)站排名全網(wǎng)營銷落地服務(wù)。

前面介紹Redis,我們都在一臺服務(wù)器上進(jìn)行操作的,也就是說讀和寫以及備份操作都是在一臺Redis服務(wù)器上進(jìn)行的,那么隨著項(xiàng)目訪問量的增加,對Redis服務(wù)器的操作也越加頻繁,雖然Redis讀寫速度都很快,但是一定程度上也會造成一定的延時(shí),那么為了解決訪問量大的問題,通常會采取的一種方式是主從架構(gòu)Master/Slave,Master 以寫為主,Slave 以讀為主,Master 主節(jié)點(diǎn)更新后根據(jù)配置,自動同步到從機(jī)Slave 節(jié)點(diǎn)。

接下來我們就來介紹如何進(jìn)行主從架構(gòu)的搭建。

ps:這里我是在一臺機(jī)器上模擬多個(gè)Redis服務(wù)器,與實(shí)際生產(chǎn)環(huán)境中相比,基本配置都是一樣,僅僅是IP地址和端口號變化。

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

1、修改配置文件

首先將redis.conf 配置文件復(fù)制三份,通過修改端口分別模擬三臺Redis服務(wù)器。

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

然后我們分別對這三個(gè)redis.conf 文件進(jìn)行修改。

①、修改 daemonize yes

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

表示指定Redis以守護(hù)進(jìn)程的方式啟動(后臺啟動)

②、配置PID文件路徑 pidfile

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

表示當(dāng)redis作為守護(hù)進(jìn)程運(yùn)行的時(shí)候,它會把 pid 默認(rèn)寫到 /var/redis/run/redis_6379.pid 文件里面

③、配置端口 port

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

④、配置log 文件名字

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

⑤、配置rdb文件名

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

依次將 6380redis.conf 、6381redis.conf 配置一次,則配置完畢。

接下來我們分別啟動這三個(gè)服務(wù)。

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

通過命令查看Redis是否啟動:

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

接下來通過如下命令分別進(jìn)入到這三個(gè)Redis客戶端:

1

2

3

redis-cli -p 6379

redis-cli -p 6380

redis-cli -p 6381

2、設(shè)置主從關(guān)系

①、通過  info replication 命令查看節(jié)點(diǎn)角色

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

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

我們發(fā)現(xiàn)這三個(gè)節(jié)點(diǎn)都是扮演的 Master 角色。那么如何將 6380 和 6381 節(jié)點(diǎn)變?yōu)?Slave 角色呢?

②、選擇6380端口和6381端口,執(zhí)行命令:SLAVEOF 127.0.0.1 6379

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

我們再看 6379 節(jié)點(diǎn)信息:

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

這里通過命令來設(shè)置主從關(guān)系,一旦服務(wù)重啟,那么角色關(guān)系將不復(fù)存在。想要永久的保存這種關(guān)系,可以通過配置redis.conf 文件來配置。

3、測試主從關(guān)系

①、增量復(fù)制

主節(jié)點(diǎn)執(zhí)行 set k1 v1 命令,從節(jié)點(diǎn) get k1 能獲取嗎?

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

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

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

由上圖可知是可以獲取的。

②、全量復(fù)制

通過執(zhí)行 SLAVEOF 127.0.0.1 6379,如果主節(jié)點(diǎn) 6379 以前還存在一些 key,那么執(zhí)行命令之后,從節(jié)點(diǎn)會將以前的信息也都復(fù)制過來嗎?

答案也是肯定的,這里我就不貼測試結(jié)果了。

③、主從讀寫分離

主節(jié)點(diǎn)能夠執(zhí)行寫命令,從節(jié)點(diǎn)能夠執(zhí)行寫命令嗎?

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

這里的原因是在配置文件 6381redis.conf 中對于 slave-read-only 的配置

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

如果我們將其修改為 no 之后,執(zhí)行寫命令是可以的。

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

但是從節(jié)點(diǎn)寫命令的數(shù)據(jù)從節(jié)點(diǎn)或者主節(jié)點(diǎn)都不能獲取的。

④、主節(jié)點(diǎn)宕機(jī)

主節(jié)點(diǎn) Maste 掛掉,兩個(gè)從節(jié)點(diǎn)角色會發(fā)生變化嗎?

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

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

上圖可知主節(jié)點(diǎn) Master 掛掉之后,從節(jié)點(diǎn)角色還是不會改變的。

⑤、主節(jié)點(diǎn)宕機(jī)后恢復(fù)

主節(jié)點(diǎn)Master掛掉之后,馬上啟動主機(jī)Maste,主節(jié)點(diǎn)扮演的角色還是 Master 嗎?

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

也就是說主節(jié)點(diǎn)掛掉之后重啟,又恢復(fù)了主節(jié)點(diǎn)的角色。

4、哨兵模式

通過前面的配置,主節(jié)點(diǎn)Master 只有一個(gè),一旦主節(jié)點(diǎn)掛掉之后,從節(jié)點(diǎn)沒法擔(dān)起主節(jié)點(diǎn)的任務(wù),那么整個(gè)系統(tǒng)也無法運(yùn)行。如果主節(jié)點(diǎn)掛掉之后,從節(jié)點(diǎn)能夠自動變成主節(jié)點(diǎn),那么問題就解決了,于是哨兵模式誕生了。

哨兵模式就是不時(shí)地監(jiān)控redis是否按照預(yù)期良好地運(yùn)行(至少是保證主節(jié)點(diǎn)是存在的),若一臺主機(jī)出現(xiàn)問題時(shí),哨兵會自動將該主機(jī)下的某一個(gè)從機(jī)設(shè)置為新的主機(jī),并讓其他從機(jī)和新主機(jī)建立主從關(guān)系。

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

哨兵模式搭建步驟:

①、在配置文件目錄下新建 sentinel.conf 文件,名字絕不能錯(cuò),然后配置相應(yīng)內(nèi)容

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

1

sentinel monitor 被監(jiān)控機(jī)器的名字(自己起名字) ip地址 端口號 得票數(shù)

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

分別配置被監(jiān)控的名字,ip地址,端口號,以及得票數(shù)。上面的得票數(shù)為1表示表示主機(jī)掛掉后salve投票看讓誰接替成為主機(jī),得票數(shù)大于1便成為主機(jī)

②、啟動哨兵

1

redis-sentinel /etc/redis/sentinel.conf

啟動界面:

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

接下來,我們干掉主機(jī) 6379,然后看從節(jié)點(diǎn)有啥變化。

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

干掉主節(jié)點(diǎn)之后,我們查看后臺打印日志,發(fā)現(xiàn) 6381投票變?yōu)橹鞴?jié)點(diǎn)了。

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

這時(shí)候我們查看從節(jié)點(diǎn) 6381的節(jié)點(diǎn)信息:

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

6381 節(jié)點(diǎn)自動變?yōu)橹鞴?jié)點(diǎn)了。

PS:哨兵模式也存在單點(diǎn)故障問題,如果哨兵機(jī)器掛了,那么就無法進(jìn)行監(jiān)控了,解決辦法是哨兵也建立集群,Redis哨兵模式是支持集群的。

5、主從復(fù)制原理

Redis的復(fù)制功能分為同步(sync)和命令傳播(command propagate)兩個(gè)操作。

①、舊版同步

當(dāng)從節(jié)點(diǎn)發(fā)出 SLAVEOF 命令,要求從服務(wù)器復(fù)制主服務(wù)器時(shí),從服務(wù)器通過向主服務(wù)器發(fā)送 SYNC 命令來完成。該命令執(zhí)行步驟:

1、從服務(wù)器向主服務(wù)器發(fā)送 SYNC 命令

2、收到 SYNC 命令的主服務(wù)器執(zhí)行 BGSAVE 命令,在后臺生成一個(gè) RDB 文件,并使用一個(gè)緩沖區(qū)記錄從開始執(zhí)行的所有寫命令

3、當(dāng)主服務(wù)器的 BGSAVE 命令執(zhí)行完畢時(shí),主服務(wù)器會將 BGSAVE 命令生成的 RDB 文件發(fā)送給從服務(wù)器,從服務(wù)器接收此 RDB 文件,并將服務(wù)器狀態(tài)更新為RDB文件記錄的狀態(tài)。

4、主服務(wù)器將緩沖區(qū)的所有寫命令也發(fā)送給從服務(wù)器,從服務(wù)器執(zhí)行相應(yīng)命令。

②、命令傳播

當(dāng)同步操作完成之后,主服務(wù)器會進(jìn)行相應(yīng)的修改命令,這時(shí)候從服務(wù)器和主服務(wù)器狀態(tài)就會不一致。

為了讓主服務(wù)器和從服務(wù)器保持狀態(tài)一致,主服務(wù)器需要對從服務(wù)器執(zhí)行命令傳播操作,主服務(wù)器會將自己的寫命令發(fā)送給從服務(wù)器執(zhí)行。從服務(wù)器執(zhí)行相應(yīng)的命令之后,主從服務(wù)器狀態(tài)繼續(xù)保持一致。

總結(jié):通過同步操作以及命令傳播功能,能夠很好的保證了主從一致的特性。

但是我們考慮一個(gè)問題,如果從服務(wù)器在同步主服務(wù)器期間,突然斷開了連接,而這時(shí)候主服務(wù)器進(jìn)行了一些寫操作,這時(shí)候從服務(wù)器恢復(fù)連接,如果我們在進(jìn)行同步,那么就必須將主服務(wù)器從新生成一個(gè)RDB文件,然后給從服務(wù)器加載,這樣雖然能夠保證一致性,但是其實(shí)斷開連接之前主從服務(wù)器狀態(tài)是保持一致的,不一致的是從服務(wù)器斷開連接,而主服務(wù)器執(zhí)行了一些寫命令,那么從服務(wù)器恢復(fù)連接后能不能只要斷開連接的哪些寫命令,而不是整個(gè)RDB快照呢?

同步操作其實(shí)是一個(gè)非常耗時(shí)的操作,主服務(wù)器需要先通過 BGSAVE 命令來生成一個(gè) RDB 文件,然后需要將該文件發(fā)送給從服務(wù)器,從服務(wù)器接收該文件之后,接著加載該文件,并且加載期間,從服務(wù)器是無法處理其他命令的。

為了解決這個(gè)問題,Redis從2.8版本之后,使用了新的同步命令 PSYNC來代替 SYNC 命令。該命令的部分重同步功能用于處理斷線后重復(fù)制的效率問題。也就是說當(dāng)從服務(wù)器在斷線后重新連接主服務(wù)器時(shí),主服務(wù)器只將斷開連接后執(zhí)行的寫命令發(fā)送給從服務(wù)器,從服務(wù)器只需要接收并執(zhí)行這些寫命令即可保持主從一致。

6、主從復(fù)制的缺點(diǎn)

主從復(fù)制雖然解決了主節(jié)點(diǎn)的單點(diǎn)故障問題,但是由于所有的寫操作都是在 Master 節(jié)點(diǎn)上操作,然后同步到 Slave 節(jié)點(diǎn),那么同步就會有一定的延時(shí),當(dāng)系統(tǒng)很繁忙的時(shí)候,延時(shí)問題就會更加嚴(yán)重,而且會隨著從節(jié)點(diǎn)slave的增多而愈加嚴(yán)重。

以上是“Redis如何實(shí)現(xiàn)主從復(fù)制”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!

文章名稱:Redis如何實(shí)現(xiàn)主從復(fù)制
URL地址:http://bm7419.com/article4/geggoe.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)建站、服務(wù)器托管網(wǎng)站內(nèi)鏈、網(wǎng)站營銷標(biāo)簽優(yōu)化、Google

廣告

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

成都網(wǎng)站建設(shè)公司