Redis主從復(fù)制是什么?
行話:也就是我們所說(shuō)的主從復(fù)制技潘,主機(jī)數(shù)據(jù)更新后根據(jù)配置和策略粮呢,
自動(dòng)同步到備機(jī)的master/slaver機(jī)制,Master以寫為主嫩痰,Slave以讀為主剿吻。
Redis主從復(fù)制能干些什么?
(1)讀寫分離
(2)容災(zāi)恢復(fù)
Redis配置主從復(fù)制(1主2從)
知識(shí)注意:
(1)配從(庫(kù))不配主(庫(kù))
(2)從庫(kù)配置:slaveof 主庫(kù)IP 主庫(kù)端口
(3)info replication查看當(dāng)前redis節(jié)點(diǎn)信息(是主還是從等等)
redis配置1主2從
開(kāi)始配置:
這里做演示是裝在一臺(tái)機(jī)器上串纺,方便學(xué)習(xí)(生產(chǎn)環(huán)境是裝在不同機(jī)器上的)
我們這里并不安裝三個(gè)redis和橙,而是已copy三個(gè)配置文件來(lái)區(qū)分。
分別是:redis6379.conf造垛,redis6380.conf魔招,redis6381.conf
修改配置文件內(nèi)容:(這里的修改都是為了區(qū)分不同機(jī)器,6379就是端口號(hào))
daemonize yes:開(kāi)啟后臺(tái)啟動(dòng)
pid?/var/run/redis6379.pidpid文件以端口號(hào)來(lái)區(qū)分
P ort 6379指定端口
logfile "redis6379.log"指定log文件名字
dbfilename dump6379.rdb這里使用的是rdb持久化方式五辽,那么就修改rdb快照文件名
(每個(gè)配置文件都需要修改)
修改好配置文件后办斑,分別啟動(dòng)三個(gè)redis進(jìn)程:
../bin/redis-server redis6379.conf
../bin/redis-server redis6380.conf
../bin/redis-server redis6381.conf
查看是否啟動(dòng)成功:
可以看到redis三個(gè)進(jìn)程分別在6380,6381,6379三個(gè)端口號(hào)啟動(dòng)了。
分別連接這三個(gè)redis進(jìn)程杆逗,查看當(dāng)前redis狀態(tài):
6379端口:
6380端口:
6381端口:
現(xiàn)在可以看到乡翅,三個(gè)redis進(jìn)程狀態(tài)都是master,都沒(méi)有slave罪郊。
開(kāi)始主從復(fù)制配置:
一個(gè)master蠕蚜,兩個(gè)slave。
定義:6379當(dāng)master悔橄,6380和6381都為slave
可以看到我們只是注意的地方:配從(庫(kù))不配主(庫(kù))
好的靶累,分別在6380和6381上的redis去關(guān)聯(lián)6379的redis:
slaveof 127.0.0.1 6379
(注意:我們這里是以命令方式去關(guān)聯(lián)主的腺毫,當(dāng)前redis關(guān)閉即失效。如果想要重新啟動(dòng)還能關(guān)聯(lián)主挣柬,那么需要再配置文件中配置潮酒。)
然后我們?cè)俨榭?380和6381端口redis的狀態(tài):
可以看到兩臺(tái)主機(jī)都已經(jīng)改成slave了,而且還標(biāo)識(shí)出master的信息邪蛔。
如果已經(jīng)出現(xiàn)以上圖片顯示急黎,那么代表1主2從配置成功了。
測(cè)試redis的1主2從
(1)slave1侧到、slave2是從頭開(kāi)始復(fù)制還是從切入點(diǎn)開(kāi)始復(fù)制?當(dāng)前主機(jī)器上已經(jīng)有了k1 k2 k3了勃教,從機(jī)器才關(guān)聯(lián)過(guò)來(lái),那么在從機(jī)器上能拿到k1 k2 k3嗎匠抗?
測(cè)試:
主服務(wù)器先寫key
從服務(wù)再去關(guān)聯(lián)主服務(wù)器故源,去拿key
答案是可以的!8昕取!分析一下壕吹,應(yīng)該是從機(jī)器關(guān)聯(lián)主機(jī)器時(shí)著蛙,會(huì)將主機(jī)器所有key都copy一份給從機(jī)器
(2)從機(jī)是否可以寫?set可否耳贬?主服務(wù)器是否可以讀呢踏堡?get可否
測(cè)試:
在從機(jī)上寫:redis會(huì)提示你只是一個(gè)從機(jī),是只能讀不能寫咒劲。
在主機(jī)上讀:可以讀顷蟆,主機(jī)可讀可寫
(3)主機(jī)shutdown后情況如何?從機(jī)是上位還是原地待命
測(cè)試:
主機(jī)shutdown:
查看從機(jī)狀態(tài):
可以看到腐魂,從機(jī)狀態(tài)還是沒(méi)有改變帐偎,從機(jī)是在原地待命
(4)主機(jī)又回來(lái)了后,主機(jī)新增記錄蛔屹,從機(jī)還能否順利復(fù)制削樊?
測(cè)試:
從新啟動(dòng)主機(jī),寫入一個(gè)k5
在從機(jī)上獲取k5:
從機(jī)上獲取k5成功兔毒。
得出結(jié)論:
主機(jī)回來(lái)后并且新增記錄漫贞,從機(jī)能順利復(fù)制主機(jī)上的數(shù)據(jù)。
(5)其中一臺(tái)從機(jī)down后情況如何育叁?依照原有它能跟上大部隊(duì)嗎迅脐?
測(cè)試:
關(guān)閉從機(jī),重新啟動(dòng)從機(jī)豪嗽。
主機(jī)寫入k6谴蔑,從機(jī)上獲取k6豌骏,會(huì)發(fā)現(xiàn)是不行的。
為什么呢树碱?安裝的時(shí)候已經(jīng)說(shuō)了:
(注意:我們這里是以命令方式去關(guān)聯(lián)主的肯适,當(dāng)前redis關(guān)閉即失效。如果想要重新啟動(dòng)還能關(guān)聯(lián)主成榜,那么需要再配置文件中配置框舔。)
如果不相信可以去看下當(dāng)前從機(jī)的狀態(tài),它已經(jīng)變成master了赎婚。
這里就不貼截圖了刘绣。
薪火相傳
什么是薪火相傳?
上一個(gè)slave可以是下一個(gè)slave的master挣输,slave同樣可以接收其他
slaves的連接和同步請(qǐng)求纬凤,那么該slave作為了鏈條中下一個(gè)的master,
可以有效減輕master的寫壓力。
?
注意:
中途變更轉(zhuǎn)向:會(huì)清除之前的數(shù)據(jù)撩嚼,重新建立拷貝最新的
?
設(shè)置薪火相傳
slaveof 新主庫(kù)IP 新主庫(kù)端口
?
我這里還是拿之前配好的6379,6380,6381來(lái)做案例停士。
主機(jī):6379
從機(jī):6380,6381
?
將6381指向6380,。6380還是指向6379(不變)完丽。
6381端口redis信息:
6380端口redis信息:
可以看到6380端口的redis還是slave恋技,但是它底下有一個(gè)slave,正是6381逻族,好的現(xiàn)在我們已經(jīng)配置成功了蜻底。
測(cè)試一下:在6379下修改個(gè)值,6380上一定是可以取到的聘鳞,看看6381上能不能取到
ok薄辅,6381上也是可以拿到值的,那么薪火相傳成功?倭АU境!搏嗡!
反客為主
什么是反客為主源请?
當(dāng)主機(jī)中宕機(jī)了,那么我們可以手動(dòng)的停止從機(jī)與主機(jī)的同步彻况,將從機(jī)轉(zhuǎn)成主機(jī)谁尸。再將其他的從機(jī)與當(dāng)前這臺(tái)主機(jī)同步數(shù)據(jù),另成一個(gè)體系纽甘。
命令介紹:
slaveof no one使當(dāng)前數(shù)據(jù)庫(kù)停止與其他數(shù)據(jù)庫(kù)的同步良蛮,轉(zhuǎn)成主數(shù)據(jù)庫(kù)。
?
反客為主案例:
假如現(xiàn)在主機(jī)掛掉了:這里是人為手動(dòng)關(guān)閉悍赢,模擬掛掉
查看從機(jī)狀態(tài):
這里可以發(fā)現(xiàn)master的狀態(tài)是down决瞳,那么現(xiàn)在將80端口redis設(shè)置為主機(jī)货徙,81端口redis做80端口的從機(jī):
slaveof no one使當(dāng)前數(shù)據(jù)庫(kù)停止與其他數(shù)據(jù)庫(kù)的同步,轉(zhuǎn)成主數(shù)據(jù)庫(kù)皮胡。
Info replication查看當(dāng)前redis的一個(gè)信息痴颊,可以發(fā)現(xiàn)當(dāng)前已經(jīng)是master了
再將81關(guān)聯(lián)到80上,再查看當(dāng)前81上的信息屡贺,就可以看到關(guān)聯(lián)的master是80的redis了蠢棱。
slaveof 127.0.0.1 6380
測(cè)試主從復(fù)制是否成功:
測(cè)試成功!甩栈!在80上寫數(shù)據(jù)泻仙,在81上可以讀取到。
Redis主從復(fù)制原理
全量復(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)存中究抓。
?
增量復(fù)制:
master繼續(xù)將新的所有收集到的修改命令依次傳給slave,完成同步袭灯。
?
注意:
(但是只要是重新連接master刺下,回自動(dòng)執(zhí)行一次完全同步(全量復(fù)制))
哨兵模式(sentinel)
什么是哨兵模式?
反客為主的自動(dòng)版妓蛮,能夠后臺(tái)監(jiān)控主機(jī)是否故障怠李,如果故障了根據(jù)投票數(shù)自動(dòng)將從庫(kù)轉(zhuǎn)換為主庫(kù)圾叼。
實(shí)現(xiàn)哨兵模式
我們還是使用6379,6380,6381機(jī)器來(lái)演示蛤克。
(先調(diào)回1主2從情況,這里就不演示了夷蚊。)
主機(jī):6379
從機(jī):6380构挤,6381
(1)在/usr/local/redis/conf下創(chuàng)建一個(gè)名為sentinel.conf的文件,并寫入內(nèi)容
sentinel monitor?被監(jiān)控?cái)?shù)據(jù)庫(kù)名字(自己起一個(gè)名字) 127.0.0.1 6379 1
上面最后一個(gè)數(shù)字1惕鼓,表示主機(jī)掛掉后salve投票看讓誰(shuí)接替成為主機(jī)筋现,得票數(shù)多的redis成為主機(jī)
注意:這里要監(jiān)控的是主機(jī)
(2)啟動(dòng)哨兵
這是我的目錄:
bin下面就是redis的一些啟動(dòng)腳本。
config下是我copy出來(lái)的redis配置文件和剛剛創(chuàng)建的sentinel.conf
到config目錄下執(zhí)行命令啟動(dòng)哨兵:
../bin/redis-sentinel sentinel.conf
(注意:這里的命令根據(jù)不同的redis安裝目錄也是會(huì)不相同的箱歧。)
好的矾飞,如果看到以上打印出得圖就是啟動(dòng)成功⊙叫希可以看到已經(jīng)在監(jiān)控6379了洒沦,而且還找到了6379的從機(jī)器6380和6381。
哨兵測(cè)試
(1)原有的master掛了价淌,會(huì)怎么樣申眼?
好的瞒津,我們測(cè)試一下,我們手動(dòng)讓6379掛掉括尸,看下哨兵會(huì)怎么處理巷蚪。
模擬6379宕機(jī):(手動(dòng)讓6379宕掉)
稍等一會(huì),看到哨兵日志:
這里已經(jīng)檢測(cè)到6379主機(jī)宕機(jī)濒翻,那么就會(huì)投票選出一個(gè)主機(jī)屁柏,這里可以看到的是選出的主機(jī)是6380。
?
我們?nèi)タ聪?380和6381的信息
6380:
6381:
以上截圖已經(jīng)可以看到肴焊,6380已經(jīng)成了主機(jī)前联,而且6381已經(jīng)改變了關(guān)聯(lián)的主機(jī),改成選舉出來(lái)的6380了娶眷。
總結(jié)出:如果主機(jī)掛掉了似嗤,那么會(huì)在從機(jī)上投票選舉出主機(jī),并且修改剩余的從機(jī)關(guān)聯(lián)到新的主機(jī)中届宠。
(2)如果之前的master重啟回來(lái)烁落,會(huì)不會(huì)雙master沖突?
測(cè)試開(kāi)始:
重新啟動(dòng)6379端口的redis豌注,查看它的信息伤塌,看一看是什么情況:
可以看到6379變成了slave,主機(jī)是6380轧铁。
?
而且啟動(dòng)6379時(shí)每聪,哨兵打印出了一條日志:
意思:將從機(jī)6379關(guān)聯(lián)到6380上。
總結(jié):之前的master重新啟動(dòng)后齿风,并不會(huì)沖突药薯,會(huì)以從機(jī)的身份來(lái)關(guān)聯(lián)主機(jī)。
注意:一組sentinel能同時(shí)監(jiān)控多個(gè)Master
復(fù)制的缺點(diǎn)
復(fù)制的延遲:
由于所有的寫操作都是先在master上操作救斑,然后同步更新到slave上童本,所以從master同步到slave機(jī)器有一定的延遲,當(dāng)系統(tǒng)很繁忙的時(shí)候脸候,延遲問(wèn)題會(huì)更加嚴(yán)重穷娱,slave機(jī)器數(shù)量的增加也會(huì)使這個(gè)問(wèn)題更加嚴(yán)重。