持久化保證了即使 redis 服務(wù)重啟也會丟失數(shù)據(jù),因為 redis 服務(wù)重啟后會將硬盤上持久化的數(shù)據(jù)恢復(fù)到內(nèi)存中,但是當(dāng) redis 服務(wù)器的硬盤損壞了可能會導(dǎo)致數(shù)據(jù)丟失,如果通過 redis 的主從復(fù)制機(jī)制就可以避免這種單點故障,如下圖:
創(chuàng)新互聯(lián)是一家專注于網(wǎng)站制作、成都網(wǎng)站設(shè)計與策劃設(shè)計,象山網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)做網(wǎng)站,專注于網(wǎng)站建設(shè)十多年,網(wǎng)設(shè)計領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:象山等地區(qū)。象山做網(wǎng)站價格咨詢:18980820575
說明:
主 redis 中的數(shù)據(jù)有兩個副本(replication)即從 redis1 和從 redis2,即使一臺 redis 服務(wù)器宕機(jī)其它兩臺 redis 服務(wù)也可以繼續(xù)提供服務(wù)。
主 redis 中的數(shù)據(jù)和從 redis 上的數(shù)據(jù)保持實時同步,當(dāng)主 redis 寫入數(shù)據(jù)時通過主從復(fù)制機(jī)制會復(fù)制到兩個從 redis 服務(wù)上。
只有一個主 redis,可以有多個從 redis。
主從復(fù)制不會阻塞 master,在同步數(shù)據(jù)時,master 可以繼續(xù)處理 client 請求。
一個 redis 可以即是主又是從,如下圖:
1、主 redis 配置
無需特殊配置。
2、從redis配置
修改從 redis 服務(wù)器上的 redis.conf 文件,添加 slaveof 主 redisip 主 redis 端口。
上邊的配置說明當(dāng)前該從 redis 服務(wù)器所對應(yīng)的主 redis 是192.168.101.3,端口是6379。
1、完整復(fù)制過程
在 redis2.8 版本之前主從復(fù)制過程如下圖:
復(fù)制過程說明:
slave 服務(wù)啟動,slave 會建立和 master 的連接,發(fā)送 sync 命令。
master 啟動一個后臺進(jìn)程將數(shù)據(jù)庫快照保存到 RDB 文件中
注意:此時如果生成 RDB 文件過程中存在寫數(shù)據(jù)操作會導(dǎo)致 RDB 文件和當(dāng)前主 redis 數(shù)據(jù)不一致,所以此時 master 主進(jìn)程會開始收集寫命令并緩存起來。
master 就發(fā)送 RDB 文件給 slave
slave 將文件保存到磁盤上,然后加載到內(nèi)存恢復(fù)
master 把緩存的命令轉(zhuǎn)發(fā)給 slave
注意:后續(xù) master 收到的寫命令都會通過開始建立的連接發(fā)送給 slave。
當(dāng) master 和 slave 的連接斷開時 slave 可以自動重新建立連接。如果 master 同時收到多個 slave 發(fā)來的同步連接命令,只會啟動一個進(jìn)程來寫數(shù)據(jù)庫鏡像,然后發(fā)送給所有 slave。
完整復(fù)制的問題:
在 redis2.8 之前從 redis 每次同步都會從主 redis 中復(fù)制全部的數(shù)據(jù),如果從 redis 是新創(chuàng)建的從主 redis 中復(fù)制全部的數(shù)據(jù)這是沒有問題的,但是,如果當(dāng)從 redis 停止運(yùn)行,再啟動時可能只有少部分?jǐn)?shù)據(jù)和主 redis 不同步,此時啟動 redis 仍然會從主 redis 復(fù)制全部數(shù)據(jù),這樣的性能肯定沒有只復(fù)制那一小部分不同步的數(shù)據(jù)高。
2、部分復(fù)制
部分復(fù)制說明:
從機(jī)連接主機(jī)后,會主動發(fā)起 PSYNC 命令,從機(jī)會提供 master 的 runid(機(jī)器標(biāo)識,隨機(jī)生成的一個串) 和 offset(數(shù)據(jù)偏移量,如果offset主從不一致則說明數(shù)據(jù)不同步),主機(jī)驗證 runid 和 offset 是否有效,runid 相當(dāng)于主機(jī)身份驗證碼,用來驗證從機(jī)上一次連接的主機(jī),如果 runid 驗證未通過則,則進(jìn)行全同步,如果驗證通過則說明曾經(jīng)同步過,根據(jù) offset 同步部分?jǐn)?shù)據(jù)。