Redis主從復(fù)制與讀寫分離的實(shí)現(xiàn)
1、為什么要主從復(fù)制、讀寫分離
Redis在作為緩存的時(shí)候,隨著項(xiàng)目訪問(wèn)量的增加,對(duì)Redis服務(wù)器的操作也越加頻繁,雖然Redis讀寫速度都很快,但是一定程度上也會(huì)造成一定的延時(shí),甚至出現(xiàn)宕機(jī)的可能性,這時(shí)候就出現(xiàn)了“單點(diǎn)故障”,那么為了解決訪問(wèn)量大的問(wèn)題,通常會(huì)采取的一種方式是主從架構(gòu)Master/Slave,Master 以寫為主,Slave 以讀為主,并且會(huì)伴隨哨兵進(jìn)行監(jiān)控
主從復(fù)制機(jī)制說(shuō)明:
- 主redis中的數(shù)據(jù)有兩個(gè)副本(replication)即從redis1和從redis2,即使一臺(tái)redis服務(wù)器宕機(jī)其他兩臺(tái)redis服務(wù)也可以繼續(xù)提供服務(wù)。
- 主redis中的數(shù)據(jù)和從redis上的數(shù)據(jù)保持實(shí)時(shí)同步,當(dāng)主redis寫入數(shù)據(jù)時(shí)通過(guò)主從復(fù)制機(jī)制會(huì)復(fù)制到兩個(gè)從redis服務(wù)上。
- 只有一個(gè)主redis,可以有多個(gè)從redis。
- 主從復(fù)制不會(huì)阻塞master,在同步數(shù)據(jù)時(shí),master可以繼續(xù)處理client請(qǐng)求。
一個(gè) Redis 可以即是主又是從,如下圖:
2、主從配置實(shí)踐,修改配置文件
[root@localhost ~]# cd /usr/local/redis/bin/ [root@localhost bin]# cp redis.conf redis6379.conf [root@localhost bin]# cp redis.conf redis6380.conf [root@localhost bin]# cp redis.conf redis6381.conf
然后對(duì)這3個(gè)配置文件redis6379.conf、redis6380.conf、redis6381.conf分別進(jìn)行修改(每個(gè)配置文件都要修改)
①、修改配置端口,分別改成對(duì)應(yīng)的端口即可
注:我用的是FinalShell工具,挺方便的,推薦。
②、修改daemonize為yes
③、配置pid文件路徑 pidfile
④、配置log 文件名字
⑤、配置rdb文件名
⑥、看情況選擇:如果redis配置了密碼(requirepass 123456),則還需在從redis服務(wù)中設(shè)置這一項(xiàng),如果沒(méi)有設(shè)置密碼則忽略這一項(xiàng)
問(wèn)題介紹:如果我們?cè)谥鱮edis服務(wù)器上設(shè)置了密碼,即:在redis.conf配置文件中使用了requirepass 123456(你設(shè)置的密碼);那么我們?cè)趶膔edis服務(wù)器上的配置文件redis.conf中使用了slaveof 127.0.0.1 6379后發(fā)現(xiàn):主從復(fù)制失敗。
解決方案:在從redis服務(wù)器上的配置文件redis.conf中找到:masterauth <master-password>這一行,然后在這一行的下面寫上masterauth 123456(主redis服務(wù)器密碼)。這時(shí)候我們?cè)俜謩e重啟主redis服務(wù)器和從redis服務(wù)器,則發(fā)現(xiàn)主從復(fù)制成功!
當(dāng)三份都配置完成后,分別啟動(dòng)這三個(gè)服務(wù):
使用ps -ef | grep redis
查看:
然后通過(guò)如下命令選擇不同的端口進(jìn)入到這三個(gè)Redis客戶端:
redis-cli -p 6379
3、設(shè)置主從關(guān)系
①、設(shè)置一主二從:
通過(guò) INFO replication 命令查看發(fā)現(xiàn),三個(gè)默認(rèn)的都是Master角色,
然后我們將 6380 和 6381設(shè)置為Slave角色,可以使用如下命令:
SLAVEOF 127.0.0.1 6379 或 REPLICAOF 127.0.0.1 6379
這時(shí) 6380 和 6381成為了Slave,然后查看一下主機(jī)(Master)信息:
可以發(fā)現(xiàn)主機(jī)下面有兩個(gè)Slave節(jié)點(diǎn)。
注:通過(guò)這種方式來(lái)設(shè)置主從關(guān)系,一旦服務(wù)重啟,那么角色關(guān)系將不復(fù)存在。想要保存這種關(guān)系,可以通過(guò)Slave的 配置文件來(lái)進(jìn)行配置。
分別編輯 redis6380.conf 和 redis6381.conf 配置文件,加入(約在286行):
replicaof 127.0.0.1 6379
4、測(cè)試數(shù)據(jù)
①、給主節(jié)點(diǎn)設(shè)置值:set k1 v1
從節(jié)點(diǎn)也可以獲取到值,說(shuō)明沒(méi)問(wèn)題。
在沒(méi)有設(shè)置主從關(guān)系之前,如果主節(jié)點(diǎn)內(nèi)有數(shù)據(jù),那么在設(shè)置主從關(guān)系后,Slave從節(jié)點(diǎn)也能獲取到主節(jié)點(diǎn)原來(lái)的數(shù)據(jù)。
如果Master主節(jié)點(diǎn)掛掉了,Slave從節(jié)點(diǎn)的角色不會(huì)發(fā)生變化,一直處于等待狀態(tài),直到Master主節(jié)點(diǎn)重新啟動(dòng)。
如果要將Slave從節(jié)點(diǎn)變成Master節(jié)點(diǎn),可以使用如下命令:
SLAVEOF no one
5、Redis配置文件解析
下面是redis主從復(fù)制場(chǎng)景的一些可調(diào)參數(shù),需要根據(jù)實(shí)際環(huán)境調(diào)整
- slave-serve-stale-data yes : 是否可以把不新鮮的數(shù)據(jù)服務(wù)與客戶端
- slave-read-only yes : 從節(jié)點(diǎn)只讀,啟用slaveof定義后才生效
- repl-diskless-sync no :是否同時(shí)向多個(gè)從節(jié)點(diǎn)同時(shí)發(fā)數(shù)據(jù)
- repl-diskless-sync-delay 5 :發(fā)送的延遲時(shí)間
- repl-ping-slave-period 10 探測(cè)從節(jié)點(diǎn)狀態(tài)
- repl-timeout 60 探測(cè)節(jié)點(diǎn)超時(shí)時(shí)間
- repl-disable-tcp-nodelay no : 啟用nodelay
- repl-backlog-size 1mb
- slave-priority 100 : 從節(jié)點(diǎn)優(yōu)先級(jí),復(fù)制集群中,主節(jié)點(diǎn)故障時(shí),sentinel應(yīng)用場(chǎng)景中的主節(jié)點(diǎn)選舉時(shí)使用的優(yōu)先級(jí);數(shù)字越小優(yōu)先級(jí)越高,但0表示不參與選舉;
- min-slaves-to-write 3:主節(jié)點(diǎn)僅允許其能夠通信的從節(jié)點(diǎn)數(shù)量大于等于此處的值時(shí)接受寫操作;
- min-slaves-max-lag 10:從節(jié)點(diǎn)延遲時(shí)長(zhǎng)超出此處指定的時(shí)長(zhǎng)時(shí),主節(jié)點(diǎn)會(huì)拒絕寫入操作;
6、主從復(fù)制的優(yōu)點(diǎn)(特點(diǎn))與缺點(diǎn)
6.1、優(yōu)點(diǎn)(特點(diǎn))
主從采用異步復(fù)制數(shù)據(jù)
主數(shù)據(jù)庫(kù)可以進(jìn)行讀寫操作,當(dāng)寫操作時(shí)會(huì)自動(dòng)將數(shù)據(jù)同步給從數(shù)據(jù)庫(kù)
從數(shù)據(jù)庫(kù)一般只讀的,并且接收主數(shù)據(jù)庫(kù)同步過(guò)來(lái)的數(shù)據(jù)
一個(gè)master可以擁有多個(gè)slave,但是一個(gè)slave只能對(duì)應(yīng)一個(gè)master
一個(gè)slave也可以連接多個(gè)slave
slave意外退出,不影響其他slave的讀和master的讀和寫,重新啟動(dòng)后會(huì)將數(shù)據(jù)從master同步過(guò)來(lái)
master意外退出,不影響slave的讀,但redis不再提供寫服務(wù),master重啟后redis將重新對(duì)外提供寫服務(wù)
master掛了以后,不會(huì)在slave節(jié)點(diǎn)中重新選一個(gè)master
6.2、缺點(diǎn)
由于所有的寫操作都是先在Master上操作,然后同步更新到Slave上,所以從Master同步到Slave機(jī)器有一定的延遲,當(dāng)系統(tǒng)很繁忙的時(shí)候,延遲問(wèn)題會(huì)更加嚴(yán)重,Slave機(jī)器數(shù)量的增加也會(huì)使這個(gè)問(wèn)題更加嚴(yán)重。
7、Redis主從復(fù)制之原理介紹
Slave啟動(dòng)成功連接到Master后會(huì)發(fā)送一個(gè)sync命令,Master接到命令啟動(dòng)后臺(tái)的存盤進(jìn)程,同時(shí)收集所有接收到的用于修改數(shù)據(jù)集命令,在后臺(tái)進(jìn)程執(zhí)行完畢之后,Master將傳送整個(gè)數(shù)據(jù)文件到Slave,以完成一次完全同步
- 全量同步:而Slave服務(wù)在接收到數(shù)據(jù)庫(kù)文件數(shù)據(jù)后,將其存盤并加載到內(nèi)存中。
- 增量同步:Master繼續(xù)將新的所有收集到的修改命令依次傳給slave,完成同步。
但是只要是重新連接Master,一次完全同步(全量同步)將被自動(dòng)執(zhí)行。
--詳細(xì)介紹:
①、全量同步
Redis 的全量同步過(guò)程主要分三個(gè)階段:
同步快照階段: Master 創(chuàng)建并發(fā)送快照給 Slave , Slave 載入并解析快照。 Master 同時(shí)將此階段所產(chǎn)生的 新的寫命令存儲(chǔ)到緩沖區(qū)。
同步寫緩沖階段: Master 向 Slave 同步存儲(chǔ)在緩沖區(qū)的寫操作命令。
同步增量階段: Master 向 Slave 同步寫操作命令。
②、增量同步
Redis 增量同步主要指 Slave 完成初始化后開(kāi)始正常工作時(shí), Master 發(fā)生的寫操作同步到 Slave 的過(guò)程。
通常情況下, Master 每執(zhí)行一個(gè)寫命令就會(huì)向 Slave 發(fā)送相同的寫命令,然后 Slave 接收并執(zhí)行。
到此這篇關(guān)于Redis主從復(fù)制與讀寫分離的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Redis主從復(fù)制與讀寫分離內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
利用Redis實(shí)現(xiàn)SQL伸縮的方法簡(jiǎn)介
這篇文章主要介紹了利用Redis實(shí)現(xiàn)SQL伸縮的方法,包括講到了鎖和時(shí)間序列等方面來(lái)提升傳統(tǒng)數(shù)據(jù)庫(kù)的性能,需要的朋友可以參考下2015-06-06redis實(shí)現(xiàn)sentinel哨兵架構(gòu)的方法
哨兵是一個(gè)分布式系統(tǒng),可以在一個(gè)架構(gòu)中運(yùn)行多個(gè)哨兵(sentinel) 進(jìn)程,這些進(jìn)程使用流言協(xié)議(gossip protocols)來(lái)接收關(guān)于Master主服務(wù)器是否下線的信息,這篇文章主要介紹了redis實(shí)現(xiàn)sentinel哨兵架構(gòu),需要的朋友可以參考下2022-11-11redis 解決庫(kù)存并發(fā)問(wèn)題實(shí)現(xiàn)數(shù)量控制
本文主要介紹了redis 解決庫(kù)存并發(fā)問(wèn)題實(shí)現(xiàn)數(shù)量控制,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-04-04Redis整合Spring結(jié)合使用緩存實(shí)例
這篇文章主要介紹了Redis整合Spring結(jié)合使用緩存實(shí)例,介紹了如何在Spring中配置redis,并通過(guò)Spring中AOP的思想,將緩存的方法切入到有需要進(jìn)入緩存的類或方法前面。需要的朋友可以參考下2015-12-12