Redis集群詳解之主從模式

本篇文章給大家?guī)砹岁P(guān)于redis的相關(guān)知識(shí),其中主要介紹了關(guān)于集群的相關(guān)問題,詳細(xì)講一下主從模式的內(nèi)容,包括了大家主從集群等等,下面一起來看一下,希望對(duì)大家有幫助。

Redis集群詳解之主從模式

推薦學(xué)習(xí):redis

一、為什么需要集群?

在我們的實(shí)際開發(fā)當(dāng)中,只使用一臺(tái)redis運(yùn)用于工程項(xiàng)目中是不可以的,原因如下:

(1)從結(jié)構(gòu)上,單個(gè)Redis服務(wù)器會(huì)發(fā)生單點(diǎn)故障,并且一臺(tái)服務(wù)器需要處理所有的請(qǐng)求負(fù)載,壓力較大;(2)從容量上,單個(gè)Redis服務(wù)器內(nèi)存容量有限,就算一臺(tái)Redis服務(wù)器內(nèi)存容量為256G,也不能將所有內(nèi)存用作Redis存儲(chǔ)內(nèi)存,一般來說,單臺(tái)Redis最大使用內(nèi)存不應(yīng)該超過20G。(3)單臺(tái)Redis服務(wù)器的讀寫性能有限,利用集群可以提高讀寫能力。

二、主從模式

?介紹

目前,Redis有三種集群模式,分別是:主從模式,哨兵模式,Cluster模式;主從模式是三種模式中最簡(jiǎn)單的,在主從復(fù)制中,是指將一臺(tái)Redis服務(wù)器的數(shù)據(jù),復(fù)制到其他的Redis服務(wù)器。前者稱為主節(jié)點(diǎn)(master/leader),后者稱為從節(jié)點(diǎn)(slave/follower)。

?注意:

(1)數(shù)據(jù)的復(fù)制是單向的,只能由主節(jié)點(diǎn)到從節(jié)點(diǎn)。Master以寫為主,Slave 以讀為主。
(2)默認(rèn)情況下,每臺(tái)Redis服務(wù)器都是主節(jié)點(diǎn)
(3)一個(gè)主節(jié)點(diǎn)可以有多個(gè)從節(jié)點(diǎn)(或沒有從節(jié)點(diǎn)),但一個(gè)從節(jié)點(diǎn)只能有一個(gè)主節(jié)點(diǎn)

Redis集群詳解之主從模式

作用

1、數(shù)據(jù)冗余:主從復(fù)制實(shí)現(xiàn)了數(shù)據(jù)的熱備份,是持久化之外的一種數(shù)據(jù)冗余方式。
2、故障恢復(fù):當(dāng)主節(jié)點(diǎn)出現(xiàn)問題時(shí),可以由從節(jié)點(diǎn)提供服務(wù),實(shí)現(xiàn)快速的故障恢復(fù);實(shí)際上是一種服務(wù)的冗余。
3、高可用(集群)基石:主從復(fù)制還是哨兵和集群能夠?qū)嵤┑幕A(chǔ),因此說主從復(fù)制是Redis高可用的基礎(chǔ)。
4、負(fù)載均衡:在主從復(fù)制的基礎(chǔ)上,配合讀寫分離,可以由主節(jié)點(diǎn)提供寫服務(wù),由從節(jié)點(diǎn)提供讀服務(wù)(即寫Redis數(shù)據(jù)時(shí)應(yīng)用連接主節(jié)點(diǎn),讀Redis數(shù)據(jù)時(shí)應(yīng)用連接從節(jié)點(diǎn)),分擔(dān)服務(wù)器負(fù)載;尤其是在寫少讀多的場(chǎng)景下,通過多個(gè)從節(jié)點(diǎn)分擔(dān)讀負(fù)載,可以大大提高Redis服務(wù)器的并發(fā)量。

例如在我們的電商網(wǎng)站可以發(fā)現(xiàn),對(duì)于一個(gè)商品只需要上傳一次,但其卻能夠被用戶瀏覽多次,也就是“寫少讀多”這種情況,我們可以利用主從復(fù)制進(jìn)行讀寫分離減緩服務(wù)器的壓力

Redis集群詳解之主從模式

三、搭建主從集群

3.1、準(zhǔn)備工作

1、復(fù)制三個(gè)配置文件(原名:redis.conf),并分別重命名為:redis79.confredis80.confredis81.conf

Redis集群詳解之主從模式

2、修改配置文件

(1)修改redis79.conf

修改端口號(hào)

port 6379

設(shè)置為后臺(tái)運(yùn)行

daemonize:yes

設(shè)置日志文件的名字

logfile “6379.log"

設(shè)置db文件名字

dbfilename dump6379.rdb

(2)修改redis80.conf

修改端口號(hào)

port 6380

?設(shè)置為后臺(tái)運(yùn)行

daemonize:yes

設(shè)置記錄進(jìn)程Id文件名字

pidfile /var/run/redis_6380.pid

?設(shè)置日志文件的名字

logfile “6380.log"

設(shè)置db文件名字

dbfilename dump6380.rdb

(3)修改redis81.conf

修改端口號(hào)

port 6381

設(shè)置為后臺(tái)運(yùn)行

daemonize:yes

設(shè)置記錄進(jìn)程Id文件名字

pidfile /var/run/redis_6381.pid

?設(shè)置日志文件的名字

logfile “6381.log"

設(shè)置db文件名字

dbfilename dump6381.rdb

這幾個(gè)屬性的作用如下:

pid(port ID):記錄了進(jìn)程的 ID,文件帶有鎖。可以防止程序的多次啟動(dòng)。
logfile:明確日志文件的位置
dbfilename:dumpxxx.file ?#持久化文件位置
port:進(jìn)程占用的端口號(hào)

3.2、搭建一主二從

啟動(dòng)Redis服務(wù)器

注意:默認(rèn)情況下,每臺(tái)Reids服務(wù)器都是主節(jié)點(diǎn),而我們要搭建主從只需要在從機(jī)那本搭建即可。

現(xiàn)在分別啟動(dòng)redis79redis80redis81服務(wù)器。

redis-server redis79.conf  redis-server redis80.conf redis-server redis81.conf

使用以下命令,查看是否啟動(dòng)成功:

 ps -ef|grep redis

Redis集群詳解之主從模式

打開三個(gè)客戶端窗口,分別對(duì)應(yīng)操作三個(gè)Redis服務(wù)器。

輸入命令:

注意要指定端口,才知道我們要打開哪一個(gè)Redis。

窗口一:

redis-cli -p 6379

窗口二:

redis-cli -p 6380

窗口三:

redis-cli -p 6381

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

我們將redis79設(shè)置為主節(jié)點(diǎn),而將redis80redis81設(shè)置為從結(jié)點(diǎn)

配置主機(jī)的IP地址和端口號(hào),相當(dāng)于想認(rèn)其為自己的老大。

?redis80:

#SLAVEOF IP地址  端口 127.0.0.1:6380> slaveof 127.0.0.1 6379 OK

redis81:

#SLAVEOF IP地址  端口 127.0.0.1:6381> slaveof 127.0.0.1 6379 OK

這個(gè)時(shí)候,我們?cè)趶臋C(jī)使用INFO命令就可以查看主從關(guān)系了:

info replication

Redis集群詳解之主從模式

?而此時(shí)我們?nèi)ブ鳈C(jī)redis79中使用同樣的命令進(jìn)行查看:

Redis集群詳解之主從模式

現(xiàn)在我們的一主二從的關(guān)系就成功搭建好了!

提示:如果要將從機(jī)變成主機(jī),我們只需要在從機(jī)執(zhí)行以下命令,即可讓自己變?yōu)橹鳈C(jī)。

SLAVEOF no one

四、知識(shí)講解

知識(shí)一

主機(jī)可以進(jìn)行讀寫操作,而從機(jī)只能讀操作。?

注意:主機(jī)中的所有信息和數(shù)據(jù),都會(huì)自動(dòng)被從機(jī)保存。

主機(jī):

127.0.0.1:6379> set key1 v1 OK 127.0.0.1:6379> get key1 "v1"

從機(jī):

127.0.0.1:6380> get key1   "v1" 127.0.0.1:6380> set key2 v2    #進(jìn)行寫操作就會(huì)報(bào)錯(cuò),提示從機(jī)只能進(jìn)行讀操作 (error) READONLY You can't write against a read only replica.

?知識(shí)二

主機(jī)如果宕機(jī)了,從機(jī)依舊可以讀取到主機(jī)宕機(jī)前的數(shù)據(jù),但仍然沒有寫操作,如果主機(jī)恢復(fù)過來了,從機(jī)依舊可以獲取到主機(jī)寫的數(shù)據(jù)。

(1)停止主機(jī)進(jìn)程(演示主機(jī)宕機(jī)了)

停止進(jìn)程的命令:

kill -9 pid #pid為redis進(jìn)程號(hào)

Redis集群詳解之主從模式

(2)從機(jī)獲取宕機(jī)前主機(jī)寫入的數(shù)據(jù)

可以發(fā)現(xiàn),能夠順利拿到,但仍然是無(wú)法進(jìn)行寫操作的。

Redis集群詳解之主從模式

?(3)恢復(fù)主機(jī)

redis-server redis79.conf

(4)主機(jī)重新寫入數(shù)據(jù),從機(jī)獲取最新數(shù)據(jù)。

主機(jī)寫入數(shù)據(jù):

127.0.0.1:6379> set k2 yixin OK

從機(jī)讀取最新數(shù)據(jù):

127.0.0.1:6380> get k2 "yixin"

知識(shí)三

兩種配置方式下的從機(jī)斷開情況

a、命令行設(shè)置主從關(guān)系

從機(jī)斷開了,其重新連接后變?yōu)橹鳈C(jī),能拿到斷開之前的數(shù)據(jù),但拿不到主機(jī)新寫入的值,如果重新設(shè)置主從關(guān)系,就可以拿到主機(jī)全部的數(shù)據(jù)了。

(1)停止從機(jī)進(jìn)程。

Redis集群詳解之主從模式

?(2)主機(jī)寫入新數(shù)據(jù)。

127.0.0.1:6379> set k3 new OK

(3)重新啟動(dòng)從機(jī)服務(wù)器。

redis-server redis80.conf

(4)嘗試獲取從機(jī)宕機(jī)前主機(jī)寫入的數(shù)據(jù),發(fā)現(xiàn)可以拿到。

127.0.0.1:6380> get k1 "v1"

(5)嘗試獲取從機(jī)宕機(jī)期間主機(jī)寫入的數(shù)據(jù),發(fā)現(xiàn)無(wú)法拿到了。

127.0.0.1:6380> get k3 (nil)

此次我們可以進(jìn)行查看主從關(guān)系,由于是命令行配置的,所以重啟之后又變回主機(jī)了

127.0.0.1:6380> info replication # Replication role:master connected_slaves:0

(6)如果要拿到主機(jī)的所有數(shù)據(jù),只要執(zhí)行以下命令重新配置主從關(guān)系就可以了。?

slaveof 127.0.0.1 6379

b、配置文件設(shè)置的主從關(guān)系

從機(jī)斷開后,重新連接,也是可以拿到主機(jī)的全部數(shù)據(jù)的。

(1)修改配置文件redis80.conf,添加主從關(guān)系。

#指定主機(jī)的ip與port slaveof 127.0.0.1 6379

(2)主機(jī)添加新數(shù)據(jù)

127.0.0.1:6379> set k5 hello OK

(3)重新啟動(dòng)redis80服務(wù)器。

redis-server redis80.conf

(4)獲取從機(jī)宕機(jī)期間主機(jī)新寫入的數(shù)據(jù),發(fā)現(xiàn)現(xiàn)在可以順利拿到了。

127.0.0.1:6380> get k5 "hello"

我們來查看6380的主從關(guān)系,可以發(fā)現(xiàn)在重啟的時(shí)候就已經(jīng)設(shè)置好主從關(guān)系了

Redis集群詳解之主從模式

五、復(fù)制原理

(1)Slave 啟動(dòng)成功連接到 Master 后會(huì)發(fā)送一個(gè)sync同步命令

(2)Master 接到命令,啟動(dòng)后臺(tái)的存盤進(jìn)程,同時(shí)收集所有接收到的用于修改數(shù)據(jù)集命令,在后臺(tái)進(jìn)程執(zhí)行完畢之后,master將傳送整個(gè)數(shù)據(jù)文件到slave,并完成一次完全同步

(3)全量復(fù)制:而slave服務(wù)在接收到數(shù)據(jù)庫(kù)文件數(shù)據(jù)后,將其存盤并加載到內(nèi)存中。

(4)增量復(fù)制:Master 繼續(xù)將新的所有收集到的修改命令依次傳給slave,完成同步。

注意:只要是重新連接master,一次完全同步(全量復(fù)制)將被自動(dòng)執(zhí)行! 我們的數(shù)據(jù)一定可以在從機(jī)中看到。

六、主從模式的優(yōu)缺點(diǎn)

優(yōu)點(diǎn)

(1)同一個(gè)Master可以同步多個(gè)Slaves
(2)Slave同樣可以接受其它Slaves的連接和同步請(qǐng)求,這樣可以有效的分載Master的同步壓力。因此我們可以將Redis的Replication架構(gòu)視為圖結(jié)構(gòu)。
(3)Master Server是以非阻塞的方式為Slaves提供服務(wù)。所以在Master-Slave同步期間,客戶端仍然可以提交查詢或修改請(qǐng)求。
(4)Slave Server同樣是以非阻塞的方式完成數(shù)據(jù)同步。在同步期間,如果有客戶端提交查詢請(qǐng)求,Redis則返回同步之前的數(shù)據(jù)。
(5)為了分載Master讀操作壓力Slave服務(wù)器可以為客戶端提供只讀操作的服務(wù),寫服務(wù)仍然必須由Master來完成。即便如此,系統(tǒng)的伸縮性還是得到了很大的提高。
(6)Master可以將數(shù)據(jù)保存操作交給Slaves完成,從而避免了在Master中要有獨(dú)立的進(jìn)程來完成此操作。
(7)支持主從復(fù)制,主機(jī)會(huì)自動(dòng)將數(shù)據(jù)同步到從機(jī),可以進(jìn)行讀寫分離

缺點(diǎn)

(1) Redis 主從模式不具備自動(dòng)容錯(cuò)和恢復(fù)功能,如果主節(jié)點(diǎn)宕機(jī),Redis 集群將無(wú)法工作,此時(shí)需要人為干預(yù),將從節(jié)點(diǎn)提升為主節(jié)點(diǎn)。
(2) 如果主機(jī)宕機(jī)前有一部分?jǐn)?shù)據(jù)未能及時(shí)同步到從機(jī),即使切換主機(jī)后也會(huì)造成數(shù)據(jù)不一致的問題,從而降低了系統(tǒng)的可用性。
(3) 因?yàn)橹挥幸粋€(gè)主節(jié)點(diǎn),所以其寫入能力和存儲(chǔ)能力都受到一定程度地限制。
(4) 在進(jìn)行數(shù)據(jù)全量同步時(shí),若同步的數(shù)據(jù)量較大可能會(huì)造卡頓的現(xiàn)象。

推薦學(xué)習(xí):redis

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點(diǎn)贊11 分享