Redis主從復制(Master/Slave) 與哨兵模式


Redis主從復制是什么?

行話:也就是我們所說的主從復制,主機數據更新后根據配置和策略,

自動同步到備機的master/slaver機制,Master以寫為主,Slave以讀為主

 

Redis主從復制能干些什么?

1)讀寫分離

2)容災恢復

 

Redis配置主從復制(1主2從)

知識注意:

(1)配從(庫)不配主(庫)

(2)從庫配置:slaveof 主庫IP 主庫端口

(3)info replication查看當前redis節點信息(是主還是從等等)

 

redis配置1主2從

開始配置:

這里做演示是裝在一台機器上,方便學習(生產環境是裝在不同機器上的)

我們這里並不安裝三個redis,而是已copy三個配置文件來區分。

分別是:redis6379.conf,redis6380.conf,redis6381.conf

 

 

修改配置文件內容:(這里的修改都是為了區分不同機器,6379就是端口號

daemonize yes開啟后台啟動

pid /var/run/redis6379.pidpid文件以端口號來區分

P ort 6379指定端口

logfile "redis6379.log"指定log文件名字

dbfilename dump6379.rdb這里使用的是rdb持久化方式,那么就修改rdb快照文件名

(每個配置文件都需要修改)

 

修改好配置文件后,分別啟動三個redis進程:

../bin/redis-server redis6379.conf

../bin/redis-server redis6380.conf

../bin/redis-server redis6381.conf

 

查看是否啟動成功:

可以看到redis三個進程分別在6380,6381,6379三個端口號啟動了。

 

分別連接這三個redis進程,查看當前redis狀態:

6379端口:

 

6380端口:

 

 

6381端口:

 

現在可以看到,三個redis進程狀態都是master,都沒有slave。

 

開始主從復制配置:

一個master,兩個slave。

定義:6379當master,6380和6381都為slave

可以看到我們只是注意的地方:配從(庫)不配主(庫)

好的,分別在6380和6381上的redis去關聯6379的redis:

slaveof 127.0.0.1 6379

注意:我們這里是以命令方式去關聯主的,當前redis關閉即失效。如果想要重新啟動還能關聯主,那么需要再配置文件中配置。

 

然后我們再查看6380和6381端口redis的狀態:

可以看到兩台主機都已經改成slave了,而且還標識出master的信息。

如果已經出現以上圖片顯示,那么代表1主2從配置成功了。

 

測試redis的1主2從

 

(1)slave1、slave2是從頭開始復制還是從切入點開始復制?當前主機器上已經有了k1 k2 k3了,從機器才關聯過來,那么在從機器上能拿到k1 k2 k3嗎?

測試:

主服務器先寫key

 

從服務再去關聯主服務器,去拿key

答案是可以的!!!分析一下,應該是從機器關聯主機器時,會將主機器所有key都copy一份給從機器

 

(2)從機是否可以寫?set可否?主服務器是否可以讀呢?get可否

測試:

在從機上寫:redis會提示你只是一個從機,是只能讀不能寫。

 

在主機上讀:可以讀,主機可讀可寫

 

 

(3)主機shutdown后情況如何?從機是上位還是原地待命

測試:

主機shutdown:

查看從機狀態:

可以看到,從機狀態還是沒有改變,從機是在原地待命

 

(4)主機又回來了后,主機新增記錄,從機還能否順利復制?

測試:

從新啟動主機,寫入一個k5

在從機上獲取k5:

從機上獲取k5成功。

得出結論:

主機回來后並且新增記錄,從機能順利復制主機上的數據。

 

 

5其中一台從機down后情況如何?依照原有它能跟上大部隊嗎?

測試:

關閉從機,重新啟動從機。

主機寫入k6,從機上獲取k6,會發現是不行的。

為什么呢?安裝的時候已經說了:

(注意:我們這里是以命令方式去關聯主的,當前redis關閉即失效。如果想要重新啟動還能關聯主,那么需要再配置文件中配置。)

如果不相信可以去看下當前從機的狀態,它已經變成master了。

這里就不貼截圖了。

 

薪火相傳

什么是薪火相傳?

上一個slave可以是下一個slave的master,slave同樣可以接收其他

slaves的連接和同步請求,那么該slave作為了鏈條中下一個的master,

可以有效減輕master的寫壓力

 

注意:

中途變更轉向:會清除之前的數據,重新建立拷貝最新的

 

設置薪火相傳

slaveof 新主庫IP 新主庫端口

 

我這里還是拿之前配好的6379,6380,6381來做案例。

主機:6379

從機:6380,6381

 

6381指向6380,。6380還是指向6379(不變)。

6381端口redis信息:

 

6380端口redis信息:

可以看到6380端口的redis還是slave,但是它底下有一個slave,正是6381,好的現在我們已經配置成功了。

 

測試一下:在6379下修改個值,6380上一定是可以取到的,看看6381上能不能取到

 

ok6381上也是可以拿到值的,那么薪火相傳成功!!!!

 

反客為主

什么是反客為主?

當主機中宕機了,那么我們可以手動的停止從機與主機的同步,將從機轉成主機。再將其他的從機與當前這台主機同步數據,另成一個體系。

 

命令介紹:

slaveof no one使當前數據庫停止與其他數據庫的同步,轉成主數據庫

 

反客為主案例:

假如現在主機掛掉了:這里是人為手動關閉,模擬掛掉

查看從機狀態:

 

這里可以發現master的狀態是down,那么現在將80端口redis設置為主機,81端口redis80端口的從機:

slaveof no one使當前數據庫停止與其他數據庫的同步,轉成主數據庫

Info replication查看當前redis的一個信息,可以發現當前已經是master

 

再將81關聯到80上,再查看當前81上的信息,就可以看到關聯的master80redis了。

slaveof 127.0.0.1 6380

測試主從復制是否成功:

 

測試成功!!在80上寫數據,在81上可以讀取到。

 

Redis主從復制原理

全量復制:

slave啟動成功連接到master后會發送一個sync命令

master接到命令啟動后台的存盤進程,同時收集所有接收到的用於修改數據集命令,

在后台進程執行完畢之后,master將傳送整個數據文件到slave,以完成一次完全同步

slave服務在接收到數據庫文件數據后,將其存盤並加載到內存中。

 

增量復制:

master繼續將新的所有收集到的修改命令依次傳給slave完成同步

 

注意:

但是只要是重新連接master,回自動執行一次完全同步(全量復制)

 

哨兵模式(sentinel)

什么是哨兵模式?

反客為主的自動版,能夠后台監控主機是否故障,如果故障了根據投票數自動將從庫轉換為主庫

 

實現哨兵模式

我們還是使用6379,6380,6381機器來演示。

(先調回1主2從情況,這里就不演示了。)

主機:6379

從機:6380,6381

(1)/usr/local/redis/conf下創建一個名為sentinel.conf的文件,並寫入內容

sentinel monitor 被監控數據庫名字(自己起一個名字) 127.0.0.1 6379 1

上面最后一個數字1,表示主機掛掉后salve投票看讓誰接替成為主機,得票數多redis成為主機

注意:這里要監控的是主機

 

(2)啟動哨兵

這是我的目錄:

bin下面就是redis的一些啟動腳本。

config下是我copy出來的redis配置文件和剛剛創建的sentinel.conf

config目錄下執行命令啟動哨兵:

../bin/redis-sentinel sentinel.conf

注意:這里的命令根據不同的redis安裝目錄也是會不相同的。

好的,如果看到以上打印出得圖就是啟動成功。可以看到已經在監控6379了,而且還找到了6379的從機器6380和6381。

 

  哨兵測試

(1)原有的master掛了,會怎么樣?

好的,我們測試一下,我們手動讓6379掛掉,看下哨兵會怎么處理。

 

模擬6379宕機:(手動讓6379宕掉)

 

稍等一會,看到哨兵日志:

這里已經檢測到6379主機宕機,那么就會投票選出一個主機,這里可以看到的是選出的主機是6380

 

我們去看下63806381的信息

6380

 

6381

以上截圖已經可以看到,6380已經成了主機,而且6381已經改變了關聯的主機,改成選舉出來的6380了。

總結出:如果主機掛掉了,那么會在從機上投票選舉出主機,並且修改剩余的從機關聯到新的主機中。

 

2如果之前的master重啟回來,會不會雙master沖突?

測試開始:

重新啟動6379端口的redis,查看它的信息,看一看是什么情況:

 

可以看到6379變成了slave,主機是6380

 

而且啟動6379時,哨兵打印出了一條日志:

 

意思:將從機6379關聯到6380上。

 

總結:之前的master重新啟動后,並不會沖突,會以從機的身份來關聯主機。

注意:一組sentinel能同時監控多個Master

復制的缺點

復制的延遲:

由於所有的寫操作都是先在master上操作,然后同步更新到slave上,所以從master同步到slave機器有一定的延遲,當系統很繁忙的時候,延遲問題會更加嚴重,slave機器數量的增加也會使這個問題更加嚴重。

 

 好的。到了這里主從復制和哨兵模式完成!!!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM