redis主從復(fù)制詳解

redis主從復(fù)制詳解

本章介紹redis的一個(gè)強(qiáng)大功能–主從復(fù)制。一臺(tái)master主機(jī)可以擁有多臺(tái)slave從機(jī)。而一臺(tái)slave從機(jī)又可以擁有多個(gè)slave從機(jī)。如此下去,形成強(qiáng)大的多級(jí)服務(wù)器集群架構(gòu)(高擴(kuò)展)。可以避免Redis單點(diǎn)故障,實(shí)現(xiàn)容災(zāi)恢復(fù)效果(高可用)。讀寫分離的架構(gòu),滿足讀多寫少的并發(fā)應(yīng)用場(chǎng)景。推薦:redis視頻教程

主從復(fù)制的作用

主從復(fù)制,讀寫分離,容災(zāi)恢復(fù)。一臺(tái)主機(jī)負(fù)責(zé)寫入數(shù)據(jù),多臺(tái)從機(jī)負(fù)責(zé)備份數(shù)據(jù)。在高并發(fā)的場(chǎng)景下,即便是主機(jī)掛了,可以用從機(jī)代替主機(jī)繼續(xù)工作,避免單點(diǎn)故障導(dǎo)致系統(tǒng)性能問題。讀寫分離,讓讀多寫少的應(yīng)用性能更佳。

主從復(fù)制架構(gòu)

At the base of Redis replication there is a very simple to use and configure master-slave replication that allows slave Redis servers to be exact copies of master servers.

確實(shí)是簡(jiǎn)單的,一個(gè)命令: slaveof 主機(jī)ip 主機(jī)port ,就可以確定主從關(guān)系;一個(gè)命令:./redis-sentinel sentinel.conf ,就可以開啟哨兵監(jiān)控。

搭建是簡(jiǎn)單的,維護(hù)是痛苦的。在高并發(fā)場(chǎng)景下,會(huì)有很多想不到的問題出現(xiàn)。我們只有清楚復(fù)制的原理,熟悉主機(jī),從機(jī)宕機(jī)后的變化。才能很好的跨過這些坑。下面的每一個(gè)步驟都是一個(gè)小的知識(shí)點(diǎn),小的場(chǎng)景。每做完一個(gè)步驟,你都會(huì)收獲到知識(shí)。

架構(gòu)圖:一主二仆一兵(也可以多主多仆多兵)

redis主從復(fù)制詳解

搭建前的準(zhǔn)備工作

因?yàn)楦F,筆者選擇用一臺(tái)服務(wù)器模擬三臺(tái)主機(jī)。和生產(chǎn)環(huán)境的區(qū)別僅僅是ip地址和port端口不同。

第一步:將redis.conf 拷貝三份,名字分別是,redis6379.conf,redis6380.conf,redis6381.conf

第二步:修改三個(gè)文件的port端口,pid文件名,日志文件名,rdb文件名

第三步:分別打開三個(gè)窗口模擬三臺(tái)服務(wù)器,開啟redis服務(wù)。

[root@itdragon?bin]#?cp?redis.conf?redis6379.conf [root@itdragon?bin]#?cp?redis.conf?redis6380.conf [root@itdragon?bin]#?cp?redis.conf?redis6381.conf [root@itdragon?bin]#?vim?redis6379.conf logfile?"6379.log" dbfilename?dump_6379.rdb [root@itdragon?bin]#?vim?redis6380.conf pidfile?/var/run/redis_6380.pid port?6380 logfile?"6380.log" dbfilename?dump_6380.rdb [root@itdragon?bin]#?vim?redis6381.conf port?6381 pidfile?/var/run/redis_6381.pid logfile?"6381.log" dbfilename?dump_6381.rdb [root@itdragon?bin]#?./redis-server?redis6379.conf [root@itdragon?bin]#?./redis-cli?-h?127.0.0.1?-p?6379 127.0.0.1:6379>?keys?* (empty?list?or?set) [root@itdragon?bin]#?./redis-server?redis6380.conf? [root@itdragon?bin]#?./redis-cli?-h?127.0.0.1?-p?6380 127.0.0.1:6380>?keys?* (empty?list?or?set) [root@itdragon?bin]#?./redis-server?redis6381.conf? [root@itdragon?bin]#?./redis-cli?-h?127.0.0.1?-p?6381 127.0.0.1:6381>?keys?* (empty?list?or?set)

主從復(fù)制搭建步驟

基礎(chǔ)搭建

第一步:查詢主從復(fù)制信息,分別選擇三個(gè)端口,執(zhí)行命令:info replication。

#?6379?端口 [root@itdragon?bin]#?./redis-server?redis6379.conf [root@itdragon?bin]#?./redis-cli?-h?127.0.0.1?-p?6379 127.0.0.1:6379>?info?replication #?Replication role:master connected_slaves:0 ......  #?6380?端口 127.0.0.1:6380>?info?replication #?Replication role:master connected_slaves:0 ......  #?6381?端口 127.0.0.1:6381>?info?replication #?Replication role:master connected_slaves:0 ......

三個(gè)端口都打印相同的信息:role:master 角色是master,connected_slaves:0 連接從機(jī)數(shù)量為零。了解更多參數(shù)含義可訪問連接: http://redisdoc.com/server/info.html

第二步:選擇6379端口,執(zhí)行命令:set k1 v1

127.0.0.1:6379>?set?k1?v1 OK

第三步:設(shè)置主從關(guān)系,分別選擇6380端口和6381端口,執(zhí)行命令:SLAVEOF 127.0.0.1 6379

#?6380?端口 127.0.0.1:6380>?SLAVEOF?127.0.0.1?6379 OK 127.0.0.1:6380>?info?replication #?Replication role:slave master_host:127.0.0.1 master_port:6379 ......  #?6381?端口 127.0.0.1:6381>?SLAVEOF?127.0.0.1?6379 OK 127.0.0.1:6381>?info?replication #?Replication role:slave master_host:127.0.0.1 master_port:6379 ......  #?6379?端口 127.0.0.1:6379>?info?replication #?Replication role:master connected_slaves:2 slave0:ip=127.0.0.1,port=6380,state=online,offset=98,lag=1 slave1:ip=127.0.0.1,port=6381,state=online,offset=98,lag=1 ......

主從關(guān)系發(fā)生了變化:

6380端口和6381端口打印的信息: role:slave 從機(jī);master_host:127.0.0.1 主機(jī)的ip地址;master_port:6379 主機(jī)的port 端口。

6379端口打印的信息: role:master 主機(jī);connected_slaves:2 連了兩個(gè)從機(jī); slaveX : ID、IP 地址、端口號(hào)、連接狀態(tài)、從庫(kù)信息

第四步:全量復(fù)制,分別選擇6380端口和6381端口,執(zhí)行命令:get k1

#?6380?端口 127.0.0.1:6380>?get?k1 "v1"  #?6381?端口 127.0.0.1:6381>?get?k1 "v1"

兩個(gè)端口都可以打印k1的值,說明在建立主從關(guān)系時(shí),從機(jī)便擁有了主機(jī)的數(shù)據(jù)。

第五步:增量復(fù)制,選擇6379端口,執(zhí)行命令:set k2 v2。然后分別選擇6380端口和6381端口,執(zhí)行命令:get k2

#?6379?端口 127.0.0.1:6379>?set?k2?v2 OK  #?6380?端口 127.0.0.1:6380>?get?k2 "v2"  #?6381?端口 127.0.0.1:6381>?get?k2 "v2"

兩個(gè)端口都可以打印k2的值,說明建立主從關(guān)系后,主機(jī)新增的數(shù)據(jù)都會(huì)復(fù)制給從機(jī)。

第六步:主從的讀寫分離,選擇6380端口,執(zhí)行命令:set k3 v3

#?6380?端口 127.0.0.1:6380>?set?k3?v3 (error)?READONLY?You?can't?write?against?a?read?only?slave.  #?6379?端口 127.0.0.1:6379>?set?k3?v3 OK

從機(jī)6380寫入失敗,是因?yàn)樽x寫分離的機(jī)制。

第七步:主機(jī)宕機(jī)的情況,選擇6379端口,執(zhí)行命令:shutdown

#?6379?端口 127.0.0.1:6379>?SHUTDOWN not?connected>?QUIT  #?6380?端口 127.0.0.1:6380>?info?replication #?Replication role:slave master_host:127.0.0.1 master_port:6379 ......  #?6381?端口 127.0.0.1:6381>?info?replication #?Replication role:slave master_host:127.0.0.1 master_port:6379 ......

從打印的結(jié)果得知:從機(jī)原地待命

第八步:主機(jī)宕機(jī)后恢復(fù),選擇6379端口,重啟Redis服務(wù),執(zhí)行命令:set k4 v4。分別選擇6380端口和6381端口,執(zhí)行命令:get k4

#?6379?端口 [root@itdragon?bin]#?./redis-server?redis6379.conf? [root@itdragon?bin]#?./redis-cli?-h?127.0.0.1?-p?6379 127.0.0.1:6379>?set?k4?v4 OK  #?6380?端口 127.0.0.1:6380>?get?k4 "v4"  #?6381?端口 127.0.0.1:6381>?get?k4 "v4"

主機(jī)重啟后,一切正常。

第九步:從機(jī)宕機(jī)后恢復(fù),選擇6380端口,執(zhí)行命令:shutdown。選擇6379端口,執(zhí)行命令:set k5 v5。選擇6380端口,重啟Redis服務(wù)后執(zhí)行命令:get k5

#?6380?端口 127.0.0.1:6380>?SHUTDOWN not?connected>?QUIT [root@itdragon?bin]#?./redis-server?redis6380.conf [root@itdragon?bin]#?./redis-cli?-h?127.0.0.1?-p?6380 127.0.0.1:6380>?info?replication #?Replication role:slave master_host:127.0.0.1 master_port:6379 ...... 127.0.0.1:6380>?get?k5 "v5"  #?6379?端口 127.0.0.1:6379>?set?k5?v5 OK

從機(jī)宕機(jī)后,一切正常。筆者用的是redis.4.0.2版本的。看過其他教程,從機(jī)宕機(jī)恢復(fù)后,只能同步主機(jī)新增數(shù)據(jù),也就是k5是沒有值的,可是筆者反復(fù)試過,均有值。留著備忘!

第十步:去中性化思想,選擇6380端口,執(zhí)行命令:SLAVEOF 127.0.0.1 6381。選擇6381端口,執(zhí)行命令:info replication

#?6380?端口 127.0.0.1:6380>?SLAVEOF?127.0.0.1?6381 OK  #?6381?端口 127.0.0.1:6381>?info?replication #?Replication role:slave master_host:127.0.0.1 master_port:6379 ...... connected_slaves:1 slave0:ip=127.0.0.1,port=6380,state=online,offset=1677,lag=1 ......

雖然6381 是6380的主機(jī),是6379的從機(jī)。在Redis眼中,6381依舊是從機(jī)。一臺(tái)主機(jī)配多臺(tái)從機(jī),一臺(tái)從機(jī)在配多臺(tái)從機(jī),從而實(shí)現(xiàn)了龐大的集群架構(gòu)。同時(shí)也減輕了一臺(tái)主機(jī)的壓力,缺點(diǎn)是增加了服務(wù)器間的延遲。

從機(jī)上位?

模擬主機(jī)宕機(jī),人為手動(dòng)慫恿從機(jī)上位的場(chǎng)景。先將三個(gè)端口恢復(fù)成6379是主機(jī),6380和6381是從機(jī)的架構(gòu)。

從機(jī)上位步驟:

第一步:模擬主機(jī)宕機(jī),選擇6379端口,執(zhí)行命令:shutdown

第二步:斷開主從關(guān)系,選擇6380端口,執(zhí)行命令:SLAVEOF no one

第三步:重新搭建主從,選擇6381端口,執(zhí)行命令:info replication,SLAVEOF 127.0.0.1 6380

第四步:之前主機(jī)恢復(fù),選擇6379端口,重啟Redis服務(wù),執(zhí)行命令:info replication

在6379主機(jī)宕機(jī)后,6380從機(jī)斷開主從關(guān)系,6381開始還在原地待命,后來投靠6380主機(jī)后,6379主機(jī)回來了當(dāng)它已是孤寡老人,空頭司令。

#?6379端口  127.0.0.1:6379>?SHUTDOWN not?connected>?QUIT  #?6380端口 127.0.0.1:6380>?SLAVEOF?no?one OK 127.0.0.1:6380>?set?k6?v6 OK  #?6381端口 127.0.0.1:6381>?info?replication #?Replication role:slave master_host:127.0.0.1 master_port:6379 ...... 127.0.0.1:6381>?SLAVEOF?127.0.0.1?6380 OK 127.0.0.1:6381>?get?k6 "v6"

哨兵監(jiān)控?

從機(jī)上位是需要人為控制,在生產(chǎn)環(huán)境中是不可取的,不可能有人實(shí)時(shí)盯著它,也不可能大半夜起床重新搭建主從關(guān)系。在這樣的需求促使下,哨兵模式來了!!!

哨兵有三大任務(wù):

1 監(jiān)控:哨兵會(huì)不斷地檢查你的Master和Slave是否運(yùn)作正常

2 提醒:當(dāng)被監(jiān)控的某個(gè)Redis出現(xiàn)問題時(shí), 哨兵可以通過API向管理員或者其他應(yīng)用程序發(fā)送通知

3 故障遷移:若一臺(tái)主機(jī)出現(xiàn)問題時(shí),哨兵會(huì)自動(dòng)將該主機(jī)下的某一個(gè)從機(jī)設(shè)置為新的主機(jī),并讓其他從機(jī)和新主機(jī)建立主從關(guān)系。

哨兵搭建步驟:

第一步:新開一個(gè)窗口,取名sentinel,方便觀察哨兵日志信息

第二步:創(chuàng)建sentinel.conf文件,也可以從redis的解壓文件夾中拷貝一份。

第三步:設(shè)置監(jiān)控的主機(jī)和上位的規(guī)則,編輯sentinel.conf,輸入 sentinel monitor itdragon-redis 127.0.0.1 6379 1 保存退出。解說:指定監(jiān)控主機(jī)的ip地址,port端口,得票數(shù)。

第四步:前端啟動(dòng)哨兵,執(zhí)行命令:./redis-sentinel sentinel.conf。

第五步:模擬主機(jī)宕機(jī),選擇6379窗口,執(zhí)行命令:shutdown。

第六步:等待從機(jī)投票,在sentinel窗口中查看打印信息。

第七步:?jiǎn)?dòng)6379服務(wù)器,

語法結(jié)構(gòu):sentinel monitor 自定義數(shù)據(jù)庫(kù)名 主機(jī)ip 主機(jī)port 得票數(shù)

若從機(jī)得票數(shù)大于設(shè)置值,則成為新的主機(jī)。若之前的主機(jī)恢復(fù)后,

如果哨兵也宕機(jī)了???那就多配幾個(gè)哨兵并且相互監(jiān)控。

#?sentinel窗口 [root@itdragon?bin]#?vim?sentinel.conf sentinel?monitor?itdragon-redis?127.0.0.1?6379?1 [root@itdragon?bin]#?./redis-sentinel?sentinel.conf ...... 21401:X?29?Nov?15:39:15.052?*?+slave?slave?127.0.0.1:6381?127.0.0.1?6381?@?itdragon-redis?127.0.0.1?6380 21401:X?29?Nov?15:39:15.052?*?+slave?slave?127.0.0.1:6379?127.0.0.1?6379?@?itdragon-redis?127.0.0.1?6380 21401:X?29?Nov?15:39:45.081?#?+sdown?slave?127.0.0.1:6379?127.0.0.1?6379?@?itdragon-redis?127.0.0.1?6380  21401:X?29?Nov?16:40:52.055?#?-sdown?slave?127.0.0.1:6379?127.0.0.1?6379?@?itdragon-redis?127.0.0.1?6380 21401:X?29?Nov?16:41:02.028?*?+convert-to-slave?slave?127.0.0.1:6379?127.0.0.1?6379?@?itdragon-redis?127.0.0.1?6380 ......  #?6379端口 127.0.0.1:6379>?SHUTDOWN not?connected>?QUIT  #?6380端口 127.0.0.1:6380>?info?replication #?Replication role:master connected_slaves:1 slave0:ip=127.0.0.1,port=6381,state=online,offset=72590,lag=0 ......  #?6381端口 127.0.0.1:6381>?info?replication #?Replication role:slave master_host:127.0.0.1 master_port:6380 ......

+slave :一個(gè)新的從服務(wù)器已經(jīng)被 Sentinel 識(shí)別并關(guān)聯(lián)。

+sdown :給定的實(shí)例現(xiàn)在處于主觀下線狀態(tài)。

-sdown :給定的實(shí)例已經(jīng)不再處于主觀下線狀態(tài)。

redis主從復(fù)制詳解

redis主從復(fù)制詳解

主從復(fù)制的原理

全量復(fù)制

實(shí)現(xiàn)原理:建立主從關(guān)系時(shí),從機(jī)會(huì)給主機(jī)發(fā)送sync命令,主機(jī)接收命令,后臺(tái)啟動(dòng)的存盤進(jìn)程,同時(shí)收集所有用于修改命令,傳送給從機(jī)。

增量復(fù)制

實(shí)現(xiàn)原理:主機(jī)會(huì)繼續(xù)將新收集到的修改命令依次傳給從機(jī),實(shí)現(xiàn)數(shù)據(jù)的同步效果。

主從復(fù)制的缺點(diǎn)

Redis的主從復(fù)制最大的缺點(diǎn)就是延遲,主機(jī)負(fù)責(zé)寫,從機(jī)負(fù)責(zé)備份,這個(gè)過程有一定的延遲,當(dāng)系統(tǒng)很繁忙的時(shí)候,延遲問題會(huì)更加嚴(yán)重,從機(jī)器數(shù)量的增加也會(huì)使這個(gè)問題更加嚴(yán)重。

總結(jié)

1 查看主從復(fù)制關(guān)系命令:info replication

2 設(shè)置主從關(guān)系命令:slaveof 主機(jī)ip 主機(jī)port

3 開啟哨兵模式命令:./redis-sentinel sentinel.conf

4 主從復(fù)制原則:開始是全量賦值,之后是增量賦值

5 哨兵模式三大任務(wù):監(jiān)控,提醒,自動(dòng)故障遷移

更多redis知識(shí)請(qǐng)關(guān)注redis視頻教程欄目。

以上就是

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點(diǎn)贊9 分享