Redis主從復(fù)制與讀寫分離的實(shí)現(xiàn)
1、為什么要主從復(fù)制、讀寫分離
Redis在作為緩存的時候,隨著項(xiàng)目訪問量的增加,對Redis服務(wù)器的操作也越加頻繁,雖然Redis讀寫速度都很快,但是一定程度上也會造成一定的延時,甚至出現(xiàn)宕機(jī)的可能性,這時候就出現(xiàn)了“單點(diǎn)故障”,那么為了解決訪問量大的問題,通常會采取的一種方式是主從架構(gòu)Master/Slave,Master 以寫為主,Slave 以讀為主,并且會伴隨哨兵進(jìn)行監(jiān)控

主從復(fù)制機(jī)制說明:
- 主redis中的數(shù)據(jù)有兩個副本(replication)即從redis1和從redis2,即使一臺redis服務(wù)器宕機(jī)其他兩臺redis服務(wù)也可以繼續(xù)提供服務(wù)。
- 主redis中的數(shù)據(jù)和從redis上的數(shù)據(jù)保持實(shí)時同步,當(dāng)主redis寫入數(shù)據(jù)時通過主從復(fù)制機(jī)制會復(fù)制到兩個從redis服務(wù)上。
- 只有一個主redis,可以有多個從redis。
- 主從復(fù)制不會阻塞master,在同步數(shù)據(jù)時,master可以繼續(xù)處理client請求。
一個 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
然后對這3個配置文件redis6379.conf、redis6380.conf、redis6381.conf分別進(jìn)行修改(每個配置文件都要修改)
①、修改配置端口,分別改成對應(yīng)的端口即可
注:我用的是FinalShell工具,挺方便的,推薦。

②、修改daemonize為yes

③、配置pid文件路徑 pidfile

④、配置log 文件名字

⑤、配置rdb文件名

⑥、看情況選擇:如果redis配置了密碼(requirepass 123456),則還需在從redis服務(wù)中設(shè)置這一項(xiàng),如果沒有設(shè)置密碼則忽略這一項(xiàng)

問題介紹:如果我們在主redis服務(wù)器上設(shè)置了密碼,即:在redis.conf配置文件中使用了requirepass 123456(你設(shè)置的密碼);那么我們在從redis服務(wù)器上的配置文件redis.conf中使用了slaveof 127.0.0.1 6379后發(fā)現(xiàn):主從復(fù)制失敗。
解決方案:在從redis服務(wù)器上的配置文件redis.conf中找到:masterauth <master-password>這一行,然后在這一行的下面寫上masterauth 123456(主redis服務(wù)器密碼)。這時候我們再分別重啟主redis服務(wù)器和從redis服務(wù)器,則發(fā)現(xiàn)主從復(fù)制成功!
當(dāng)三份都配置完成后,分別啟動這三個服務(wù):

使用ps -ef | grep redis 查看:

然后通過如下命令選擇不同的端口進(jìn)入到這三個Redis客戶端:
redis-cli -p 6379

3、設(shè)置主從關(guān)系
①、設(shè)置一主二從:
通過 INFO replication 命令查看發(fā)現(xiàn),三個默認(rèn)的都是Master角色,



然后我們將 6380 和 6381設(shè)置為Slave角色,可以使用如下命令:
SLAVEOF 127.0.0.1 6379 或 REPLICAOF 127.0.0.1 6379


這時 6380 和 6381成為了Slave,然后查看一下主機(jī)(Master)信息:

可以發(fā)現(xiàn)主機(jī)下面有兩個Slave節(jié)點(diǎn)。
注:通過這種方式來設(shè)置主從關(guān)系,一旦服務(wù)重啟,那么角色關(guān)系將不復(fù)存在。想要保存這種關(guān)系,可以通過Slave的 配置文件來進(jìn)行配置。
分別編輯 redis6380.conf 和 redis6381.conf 配置文件,加入(約在286行):
replicaof 127.0.0.1 6379

4、測試數(shù)據(jù)
①、給主節(jié)點(diǎn)設(shè)置值:set k1 v1



從節(jié)點(diǎn)也可以獲取到值,說明沒問題。
在沒有設(shè)置主從關(guān)系之前,如果主節(jié)點(diǎn)內(nèi)有數(shù)據(jù),那么在設(shè)置主從關(guān)系后,Slave從節(jié)點(diǎn)也能獲取到主節(jié)點(diǎn)原來的數(shù)據(jù)。
如果Master主節(jié)點(diǎn)掛掉了,Slave從節(jié)點(diǎn)的角色不會發(fā)生變化,一直處于等待狀態(tài),直到Master主節(jié)點(diǎn)重新啟動。
如果要將Slave從節(jié)點(diǎn)變成Master節(jié)點(diǎn),可以使用如下命令:
SLAVEOF no one
5、Redis配置文件解析
下面是redis主從復(fù)制場景的一些可調(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 :是否同時向多個從節(jié)點(diǎn)同時發(fā)數(shù)據(jù)
- repl-diskless-sync-delay 5 :發(fā)送的延遲時間
- repl-ping-slave-period 10 探測從節(jié)點(diǎn)狀態(tài)
- repl-timeout 60 探測節(jié)點(diǎn)超時時間
- repl-disable-tcp-nodelay no : 啟用nodelay
- repl-backlog-size 1mb
- slave-priority 100 : 從節(jié)點(diǎn)優(yōu)先級,復(fù)制集群中,主節(jié)點(diǎn)故障時,sentinel應(yīng)用場景中的主節(jié)點(diǎn)選舉時使用的優(yōu)先級;數(shù)字越小優(yōu)先級越高,但0表示不參與選舉;
- min-slaves-to-write 3:主節(jié)點(diǎn)僅允許其能夠通信的從節(jié)點(diǎn)數(shù)量大于等于此處的值時接受寫操作;
- min-slaves-max-lag 10:從節(jié)點(diǎn)延遲時長超出此處指定的時長時,主節(jié)點(diǎn)會拒絕寫入操作;
6、主從復(fù)制的優(yōu)點(diǎn)(特點(diǎn))與缺點(diǎn)
6.1、優(yōu)點(diǎn)(特點(diǎn))
主從采用異步復(fù)制數(shù)據(jù)
主數(shù)據(jù)庫可以進(jìn)行讀寫操作,當(dāng)寫操作時會自動將數(shù)據(jù)同步給從數(shù)據(jù)庫
從數(shù)據(jù)庫一般只讀的,并且接收主數(shù)據(jù)庫同步過來的數(shù)據(jù)
一個master可以擁有多個slave,但是一個slave只能對應(yīng)一個master
一個slave也可以連接多個slave
slave意外退出,不影響其他slave的讀和master的讀和寫,重新啟動后會將數(shù)據(jù)從master同步過來
master意外退出,不影響slave的讀,但redis不再提供寫服務(wù),master重啟后redis將重新對外提供寫服務(wù)
master掛了以后,不會在slave節(jié)點(diǎn)中重新選一個master
6.2、缺點(diǎn)
由于所有的寫操作都是先在Master上操作,然后同步更新到Slave上,所以從Master同步到Slave機(jī)器有一定的延遲,當(dāng)系統(tǒng)很繁忙的時候,延遲問題會更加嚴(yán)重,Slave機(jī)器數(shù)量的增加也會使這個問題更加嚴(yán)重。
7、Redis主從復(fù)制之原理介紹
Slave啟動成功連接到Master后會發(fā)送一個sync命令,Master接到命令啟動后臺的存盤進(jìn)程,同時收集所有接收到的用于修改數(shù)據(jù)集命令,在后臺進(jìn)程執(zhí)行完畢之后,Master將傳送整個數(shù)據(jù)文件到Slave,以完成一次完全同步
- 全量同步:而Slave服務(wù)在接收到數(shù)據(jù)庫文件數(shù)據(jù)后,將其存盤并加載到內(nèi)存中。
- 增量同步:Master繼續(xù)將新的所有收集到的修改命令依次傳給slave,完成同步。
但是只要是重新連接Master,一次完全同步(全量同步)將被自動執(zhí)行。
--詳細(xì)介紹:
①、全量同步
Redis 的全量同步過程主要分三個階段:
同步快照階段: Master 創(chuàng)建并發(fā)送快照給 Slave , Slave 載入并解析快照。 Master 同時將此階段所產(chǎn)生的 新的寫命令存儲到緩沖區(qū)。
同步寫緩沖階段: Master 向 Slave 同步存儲在緩沖區(qū)的寫操作命令。
同步增量階段: Master 向 Slave 同步寫操作命令。

②、增量同步
Redis 增量同步主要指 Slave 完成初始化后開始正常工作時, Master 發(fā)生的寫操作同步到 Slave 的過程。
通常情況下, Master 每執(zhí)行一個寫命令就會向 Slave 發(fā)送相同的寫命令,然后 Slave 接收并執(zhí)行。
到此這篇關(guān)于Redis主從復(fù)制與讀寫分離的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Redis主從復(fù)制與讀寫分離內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Redis HyperLogLog用戶統(tǒng)計功能實(shí)現(xiàn)代碼
本文詳細(xì)解析了UV(獨(dú)立訪客)統(tǒng)計在互聯(lián)網(wǎng)產(chǎn)品運(yùn)營中的的重要性,并對比了傳統(tǒng)UV統(tǒng)計方案與HyperLogLog算法的優(yōu)勢,HyperLogLogLog在內(nèi)存占用、寫入性能與統(tǒng)計精度方面表現(xiàn)出色,感興趣的朋友跟隨小編一起看看吧2026-06-06
Redis+Caffeine多級緩存數(shù)據(jù)一致性解決方案
兩級緩存Redis+Caffeine可以解決緩存雪等問題也可以提高接口的性能,但是可能會出現(xiàn)緩存一致性問題,如果數(shù)據(jù)頻繁的變更,可能會導(dǎo)致Redis和Caffeine數(shù)據(jù)不一致的問題,所以本文給大家介紹了Redis+Caffeine多級緩存數(shù)據(jù)一致性解決方案,需要的朋友可以參考下2024-12-12
redis內(nèi)部數(shù)據(jù)結(jié)構(gòu)之SDS簡單動態(tài)字符串詳解
SDS是Redis中實(shí)現(xiàn)的一種數(shù)據(jù)結(jié)構(gòu),用來存儲字符串,最近學(xué)習(xí)中正好學(xué)習(xí)到了這里,所以下面這篇文章主要給大家介紹了redis內(nèi)部數(shù)據(jù)結(jié)構(gòu)之SDS簡單動態(tài)字符串的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來一起看看吧。2017-11-11
解析高可用Redis服務(wù)架構(gòu)分析與搭建方案
我們按照由簡至繁的步驟,搭建一個最小型的高可用的Redis服務(wù)。 本文通過四種方案給大家介紹包含每種方案的優(yōu)缺點(diǎn)及詳細(xì)解說,具體內(nèi)容詳情跟隨小編一起看看吧2021-06-06

