1、什么是主從復(fù)制
???? Redis持久化保證了即使redis服務(wù)重啟也不會(huì)丟失數(shù)據(jù),因?yàn)閞edis服務(wù)重啟后會(huì)將硬盤上持久化的數(shù)據(jù)恢復(fù)到內(nèi)存中,但是當(dāng)redis服務(wù)器的硬盤損壞了可能會(huì)導(dǎo)致數(shù)據(jù)丟失,如果通過redis的主從復(fù)制機(jī)制就可以避免這種單點(diǎn)故障???

說明:
??? 1、主redis中的數(shù)據(jù)有兩個(gè)副本(redis1 和redis2) 即使一臺(tái)redis服務(wù)器宕機(jī)其他兩臺(tái)redis服務(wù)器也可以繼續(xù)提供服務(wù)
?? 2、主redis中的數(shù)據(jù)和從redis上的數(shù)據(jù)保持實(shí)時(shí)同步,當(dāng)主redis寫入數(shù)據(jù)時(shí)通過主從復(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、主從配置
?? 主redis配置(無(wú)需特殊配置)
?? 從redis配置(修改從redis服務(wù)器上的redis.conf文件,添加slaveof? 主redis的IP和端口)
3、復(fù)制過程
? 3.1、完整復(fù)制
?????? 在redis2.8版本之前主從復(fù)制過程如下
??

????? 1、Slave服務(wù)啟動(dòng),slave會(huì)建立和master的鏈接,發(fā)送sync命令
?????? 2、master啟動(dòng)一個(gè)后臺(tái)進(jìn)程將數(shù)據(jù)庫(kù)快照保存到RDB文件中
???????? 注意:此時(shí)如果生成RDB文件過程中存在寫數(shù)據(jù)操作會(huì)導(dǎo)致RDB文件和當(dāng)前主redis數(shù)據(jù)不一致,所以此時(shí)master?主進(jìn)程會(huì)開始收集寫命令并緩存起來(lái)。
????? 3、master就發(fā)送RDB文件給Slave
???? 4、slave將文件保存到磁盤上,然后加載到內(nèi)存恢復(fù)
???? 5、master把緩存的命令發(fā)給slave
???????? 注意:后續(xù)master?收到的寫命令都會(huì)通過開始建立的連接發(fā)送給slave。
????? 當(dāng)master?和slave?的連接斷開時(shí)slave?可以自動(dòng)重新建立連接。如果master?同時(shí)收到多個(gè)slave?發(fā)來(lái)的同步連接命令,只會(huì)啟動(dòng)一個(gè)進(jìn)程來(lái)寫數(shù)據(jù)庫(kù)鏡像,然后發(fā)送給所有slave。
? 完整復(fù)制的問題:
在redis2.8之前從redis每次同步都會(huì)從主redis中復(fù)制全部的數(shù)據(jù),如果從redis是新創(chuàng)建的從主redis中復(fù)制全部的數(shù)據(jù)這是沒有問題的,但是,如果當(dāng)從redis停止運(yùn)行,再啟動(dòng)時(shí)可能只有少部分?jǐn)?shù)據(jù)和主redis不同步,此時(shí)啟動(dòng)redis仍然會(huì)從主redis復(fù)制全部數(shù)據(jù),這樣的性能肯定沒有只復(fù)制那一小部分不同步的數(shù)據(jù)高。
3.2、部分復(fù)制
?

部分復(fù)制說明:
從機(jī)連接主機(jī)后,會(huì)主動(dòng)發(fā)起 PSYNC(部分同步)命令,從機(jī)會(huì)提供 master的runid(機(jī)器標(biāo)識(shí),隨機(jī)生成的一個(gè)串) 和 offset(數(shù)據(jù)偏移量,如果offset主從不一致則說明數(shù)據(jù)不同步),主機(jī)驗(yàn)證 runid 和 offset 是否有效, runid 相當(dāng)于主機(jī)身份驗(yàn)證碼,用來(lái)驗(yàn)證從機(jī)上一次連接的主機(jī),如果runid驗(yàn)證未通過則,則進(jìn)行全同步,如果驗(yàn)證通過則說明曾經(jīng)同步過,根據(jù)offset同步部分?jǐn)?shù)據(jù)。