行話:也就是咱們所說的主從複製,主機數據更新後根據配置和策略,redis
自動同步到備機的master/slaver機制,Master以寫爲主,Slave以讀爲主數據庫
(1)讀寫分離服務器
(2)容災恢復學習
知識注意:測試
(1)配從(庫)不配主(庫)3d
(2)從庫配置:slaveof 主庫IP 主庫端口日誌
(3)info replication查看當前redis節點信息(是主仍是從等等)server
開始配置:blog
這裏作演示是裝在一臺機器上,方便學習(生產環境是裝在不一樣機器上的)進程
咱們這裏並不安裝三個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從配置成功了。
(1)slave一、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上能不能取到
ok,6381上也是能夠拿到值的,那麼薪火相傳成功!!!!
什麼是反客爲主?
當主機中宕機了,那麼咱們能夠手動的中止從機與主機的同步,將從機轉成主機。再將其餘的從機與當前這臺主機同步數據,另成一個體系。
命令介紹:
slaveof no one使當前數據庫中止與其餘數據庫的同步,轉成主數據庫。
反客爲主案例:
假如如今主機掛掉了:這裏是人爲手動關閉,模擬掛掉
查看從機狀態:
這裏能夠發現master的狀態是down,那麼如今將80端口redis設置爲主機,81端口redis作80端口的從機:
slaveof no one使當前數據庫中止與其餘數據庫的同步,轉成主數據庫。
Info replication查看當前redis的一個信息,能夠發現當前已是master了
再將81關聯到80上,再查看當前81上的信息,就能夠看到關聯的master是80的redis了。
slaveof 127.0.0.1 6380
測試主從複製是否成功:
測試成功!!在80上寫數據,在81上能夠讀取到。
全量複製:
slave啓動成功鏈接到master後會發送一個sync命令
master接到命令啓動後臺的存盤進程,同時收集全部接收到的用於修改數據集命令,
在後臺進程執行完畢以後,master將傳送整個數據文件到slave,以完成一次徹底同步
而slave服務在接收到數據庫文件數據後,將其存盤並加載到內存中。
增量複製:
master繼續將新的全部收集到的修改命令依次傳給slave,完成同步。
注意:
(可是隻要是從新鏈接master,回自動執行一次徹底同步(全量複製))
反客爲主的自動版,可以後臺監控主機是否故障,若是故障了根據投票數自動將從庫轉換爲主庫。
咱們仍是使用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。
咱們去看下6380和6381的信息
6380:
6381:
以上截圖已經能夠看到,6380已經成了主機,並且6381已經改變了關聯的主機,改爲選舉出來的6380了。
總結出:若是主機掛掉了,那麼會在從機上投票選舉出主機,而且修改剩餘的從機關聯到新的主機中。
(2)若是以前的master重啓回來,會不會雙master衝突?
測試開始:
從新啓動6379端口的redis,查看它的信息,看一看是什麼狀況:
能夠看到6379變成了slave,主機是6380。
並且啓動6379時,哨兵打印出了一條日誌:
意思:將從機6379關聯到6380上。
總結:以前的master從新啓動後,並不會衝突,會以從機的身份來關聯主機。
注意:一組sentinel能同時監控多個Master
複製的延遲:
因爲全部的寫操做都是先在master上操做,而後同步更新到slave上,因此從master同步到slave機器有必定的延遲,當系統很繁忙的時候,延遲問題會更加嚴重,slave機器數量的增長也會使這個問題更加嚴重。
好的。到了這裏主從複製和哨兵模式完成!!!