Redis教程(三)——Redis的主從復(fù)制

上篇博文我們了解該如何實(shí)現(xiàn)Redis的持久化,這篇博文再get下Redis的主從復(fù)制的相關(guān)知識點(diǎn)茬故,理解主從復(fù)制的操作盖灸、原理以及完全重新同步和部分重新同步的區(qū)別,能優(yōu)化主從復(fù)制并且進(jìn)行故障診斷磺芭。

Redis的安裝和持久化

  1. Redis的安裝
  2. Redis的持久化

Redis的主從復(fù)制(replication)

Redis的主從復(fù)制是組成Redis高可用的一部分赁炎,也是必不可少的一部分,通過Redis提供的復(fù)制功能钾腺,將數(shù)據(jù)從Redis(master節(jié)點(diǎn))向另一個Redis(slave節(jié)點(diǎn))復(fù)制甘邀。
我們還是帶著問題去整理這個知識點(diǎn)

  • Redis是高可用的一個組成部分,我們?yōu)槭裁葱枰猂edis的主從復(fù)制垮庐,他有哪些作用
  • Redis該如何主從復(fù)制松邪,需要注意哪些問題
  • Redis的主從復(fù)制原理和機(jī)制是怎么樣的
  • Redis的主從復(fù)制該如何調(diào)優(yōu)
  • Redis發(fā)生故障時該如何進(jìn)行故障診斷

準(zhǔn)備工作

主從復(fù)制,大多數(shù)是為了數(shù)據(jù)備份哨查、高并發(fā)和高可用逗抑,而要滿足高可用的要求,一般都是兩臺不同的服務(wù)器或者虛擬機(jī)節(jié)點(diǎn),以保證主節(jié)點(diǎn)服務(wù)器宕機(jī)或者其他不可知的原因?qū)е路?wù)不能使用邮府,則需要子節(jié)點(diǎn)的服務(wù)能替代主節(jié)點(diǎn)的服務(wù)器繼續(xù)對外提供服務(wù)荧关。所以我們先準(zhǔn)備兩臺虛擬機(jī),分別安裝redis服務(wù)褂傀,并且啟動服務(wù)忍啤,其次如果讀的QPS比較多的話,一般采用讀寫分離的模式來分離讀數(shù)據(jù)和寫數(shù)據(jù)(主寫從讀)仙辟,通過橫向擴(kuò)容從Redis的實(shí)例來擴(kuò)大讀QPS,而實(shí)現(xiàn)這一功能同波,主從復(fù)制必不可少

具體安裝可以參考上一篇的博文《Redis的安裝
我們準(zhǔn)備一下兩臺虛擬機(jī),分別對外提供Redis服務(wù):

  • 主節(jié)點(diǎn):192.168.56.105:7000
  • 子節(jié)點(diǎn):192.168.56.106:7000

Redis主從復(fù)制

Redis復(fù)制的啟動

復(fù)制不僅提高了整個redis的容錯能力叠国,同時也可以對系統(tǒng)進(jìn)行橫向擴(kuò)容等未檩,開啟子節(jié)點(diǎn)復(fù)制父節(jié)點(diǎn)很容易,有三種方法可以進(jìn)行復(fù)制父節(jié)點(diǎn)數(shù)據(jù)

  1. redis.conf的配置文件中 添加
    slaveof master_ip master_port
    ## redis 5.x 版本中
    replicaof master_ip master_port
  1. 在啟動redis的時候粟焊,使用命令來啟動
    redis-server --slaveof master_ip master_port
  1. 在客戶端cli中指定主節(jié)點(diǎn)
    redis> slaveof master_ip master_port

Redis復(fù)制注意事項

  1. 將主節(jié)點(diǎn)中的protected-mode改為no

如果是保護(hù)模式開啟冤狡,則slave node中 使用 info replication 會發(fā)現(xiàn) master_link_status:down 從而導(dǎo)致復(fù)制不成功

  1. 如果master node中 開啟了授權(quán),則在slave node中需要給予主節(jié)點(diǎn)的密碼 masterauth

master node 中

requirepass passwd
slave node 中

masterauth passwd

  1. 在最新的版本中 slaveof已經(jīng)替換為 replicaof项棠,但是slaveof同樣可以使用悲雳,并且作用是相同的,至于為什么可以通用香追,我從技術(shù)領(lǐng)域角度來說合瓢,閑的無聊,找點(diǎn)事做翅阵。
  2. 個人建議在做主從復(fù)制時歪玲,一定要將master node做持久化操作迁央,原因是當(dāng)master node節(jié)點(diǎn)重啟服務(wù)時掷匠,如果不做持久化的話,到時會將數(shù)據(jù)清空岖圈,同時slave node的數(shù)據(jù)也會被清空讹语,導(dǎo)致不僅僅master數(shù)據(jù)丟失,slave node的數(shù)據(jù)也會丟失
  3. 如果想實(shí)現(xiàn)部分重新同步蜂科,那么在redis4.x版本之后顽决,需要將slave node也做持久化操作,至于原因會在下面的原理中給予解釋

Redis復(fù)制的驗(yàn)證

  1. 開啟rdis復(fù)制之后导匣,我們可以在客戶端中使用 info replication命令來查看是否已經(jīng)開啟復(fù)制成功
    ## 主節(jié)點(diǎn)中 cli中執(zhí)行 info replication
    # Replication
    role:master
    connected_slaves:1
    slave0:ip=192.168.56.106,port=7000,state=online,offset=28,lag=0
    ## master node中的節(jié)點(diǎn)id
    master_replid:43db81ea472435516baa83e0164574bef8ac65f8
    master_replid2:0000000000000000000000000000000000000000
    ## master node中的節(jié)點(diǎn)偏移量
    master_repl_offset:28
    second_repl_offset:-1
    repl_backlog_active:1
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:1
    repl_backlog_histlen:28
    ## 子節(jié)點(diǎn)中 cli中執(zhí)行 info replication
    # Replication
    role:slave
    master_host:192.168.56.105
    master_port:7000
    master_link_status:up
    master_last_io_seconds_ago:5
    master_sync_in_progress:0
    slave_repl_offset:42
    slave_priority:100
    slave_read_only:1
    connected_slaves:0
    master_replid:43db81ea472435516baa83e0164574bef8ac65f8
    master_replid2:0000000000000000000000000000000000000000
    master_repl_offset:42
    second_repl_offset:-1
    repl_backlog_active:1
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:1
    repl_backlog_histlen:42

出現(xiàn)如上所述的master node 中 connected_slaves:1才菠,說明master node存在一個連接的slave node節(jié)點(diǎn),并且slave0是關(guān)于第一個子節(jié)點(diǎn)的配置信息贡定。在slave node節(jié)點(diǎn)中role表明這個是子節(jié)點(diǎn)赋访,并且master_host顯示master node的IP信息,master_link_status表明是否連接上,up表示連接中蚓耽,down表示連接失敗渠牲,此處連接失敗,可能是master node中protected-mode為yes導(dǎo)致签杈。

Redis主從復(fù)制的原理和核心機(jī)制

Redis主從復(fù)制的原理:

  1. slave node啟動時,會向master node發(fā)送 sync命令鼎兽。相當(dāng)于向master node注冊slave node的相關(guān)節(jié)點(diǎn)信息答姥,讓master node知道他存在一個子節(jié)點(diǎn)
  2. slave node剛啟動時踢涌,會發(fā)送master_repl_offset給master node睁壁,由master node決定是走完全重新同步還是部分重新同步步驟潘明,如果master_repl_offset與master node是中的backlog中能找到,則是部分重新同步,否則是完全重新同步。
  3. 是完全重新同步:master node會將緩存所有的寫入操作命令灯荧,同時fork一個子線程礁击,生成RDB快照,master node將RDB文件傳給slave node,slave node再將所有的命令同步到本地的內(nèi)存中逗载,如果此時slave node也做了持久化哆窿,則會將數(shù)據(jù)持久化到磁盤中
  4. 部分重新同步:不需要從master node中轉(zhuǎn)存數(shù)據(jù)文件,master node直接將偏移量之后的所有命令同步發(fā)送給slave node節(jié)點(diǎn)厉斟,在slave node節(jié)點(diǎn)來完成數(shù)據(jù)的更新

流程圖如下:


image

為了更深層次的理解Redis是如何進(jìn)行主從復(fù)制的挚躯,我們需要知道Redis復(fù)制的核心機(jī)制

  1. Redis采用異步方式復(fù)制數(shù)據(jù)到slave節(jié)點(diǎn)
  2. 一個master node 可以配置多個slave node
  3. slave node之間可以互聯(lián)互通,傳遞類似心跳的數(shù)據(jù)
  4. slave node在做復(fù)制的時候擦秽,不會阻塞master node的正常工作
  5. slave node在做復(fù)制的時候码荔,也不會block對自己的查詢操作食侮,它會用舊的數(shù)據(jù)集來提供服務(wù); 但是復(fù)制完成的時候,需要刪除舊數(shù)據(jù)集目胡,加載新數(shù)據(jù)集锯七,這個時候就會暫停對外服務(wù)了
  6. slave node主要用來進(jìn)行橫向擴(kuò)容,做讀寫分離誉己,擴(kuò)容的slave node可以提高讀的吞吐量

Redis主從復(fù)制調(diào)優(yōu)

根據(jù)上面的主從復(fù)制的原理眉尸,我們可以知道主從復(fù)制進(jìn)行的是完全重新同步還是部分重新同步的主要依據(jù)是slave提交給master的offset偏移量能否在master的replication backlog中查找到,如果能查找到則說明進(jìn)行部分重新同步操作巨双,如果查找不到則說明進(jìn)行完全重新同步操作

再次之前我們先了解下 replication backlog是什么噪猾?
replication backlog是master中的環(huán)形緩沖區(qū),該區(qū)域記錄的是最新所有的寫入命令筑累,是一個固定長度的列表!

知道上述原理袱蜡,我們可以通過控制backlog中的值的大小來控制是否進(jìn)行完全重新同步還是部分重新同步,在redis.conf配置文件中backlog的大小是通過 repl-backlog-size來控制的慢宗,默認(rèn)是1mb

在實(shí)際生產(chǎn)中坪蚁,我們可以通過info replication中獲取 master_repl_offset 的大小來估算backlog的大小

Redis主從復(fù)制故障診斷

影響Redis主從復(fù)制故障的原因可能有:磁盤IO、網(wǎng)絡(luò)連接镜沽、數(shù)據(jù)集大小和長時間的阻塞等因素敏晤。

說起主從復(fù)制,我們需要先了解主從之間是怎么判斷彼此之間的通訊缅茉,master想要知道slave是否正常運(yùn)行嘴脾,則會向slave發(fā)送ping命令,我們可以通過repl-ping-replica-period參數(shù)來調(diào)整這個間隔蔬墩,默認(rèn)間隔是10s

那么主從實(shí)例又是如何判斷彼此之間復(fù)制鏈接被斷開呢译打?

slave會向master發(fā)送REPLCONF ACK來報告他的復(fù)制偏移量,對Ping和REPLCONF ACK來說拇颅,都可以通過repl-timeout來指定超時時間奏司,該值默認(rèn)時間是60s,如果兩次PING護(hù)著REPLCONF ACK之間的時間間隔比超時時間差蔬蕊,則可以認(rèn)為主從復(fù)制鏈接被斷開结澄。

master向slave進(jìn)行完全重新同步時哥谷,master會生成RDB快照文件岸夯,然后發(fā)送給slave,slave將RDB快照中的文件數(shù)據(jù)存儲到slave的內(nèi)存中,在這個步驟執(zhí)行的過程中们妥,如果master有新的數(shù)據(jù)寫入猜扮,則master會將這部分?jǐn)?shù)據(jù)寫入到從客戶端緩沖區(qū)(slave client buffer)中,在slaveRDB加載之后监婶,將該緩沖區(qū)的數(shù)據(jù)發(fā)送給slave實(shí)例旅赢。但是這個實(shí)例是有大小限制的齿桃,當(dāng)緩沖區(qū)的數(shù)據(jù)超過這個默認(rèn)值時,則會導(dǎo)致復(fù)制重新開始煮盼。

所以我們在復(fù)制故障診斷時短纵,需要注意參數(shù)repl-ping-replication-periodrepl-timeout的值的控制,在生產(chǎn)環(huán)境中 repl-ping-replication-period一定要比repl-timeout小僵控,否則容易造成復(fù)制超時香到。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市报破,隨后出現(xiàn)的幾起案子悠就,更是在濱河造成了極大的恐慌,老刑警劉巖充易,帶你破解...
    沈念sama閱讀 218,386評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件梗脾,死亡現(xiàn)場離奇詭異,居然都是意外死亡盹靴,警方通過查閱死者的電腦和手機(jī)炸茧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來稿静,“玉大人宇立,你說我怎么就攤上這事∽耘猓” “怎么了妈嘹?”我有些...
    開封第一講書人閱讀 164,704評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長绍妨。 經(jīng)常有香客問我润脸,道長,這世上最難降的妖魔是什么他去? 我笑而不...
    開封第一講書人閱讀 58,702評論 1 294
  • 正文 為了忘掉前任毙驯,我火速辦了婚禮,結(jié)果婚禮上灾测,老公的妹妹穿的比我還像新娘爆价。我一直安慰自己,他們只是感情好媳搪,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,716評論 6 392
  • 文/花漫 我一把揭開白布铭段。 她就那樣靜靜地躺著,像睡著了一般秦爆。 火紅的嫁衣襯著肌膚如雪序愚。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,573評論 1 305
  • 那天等限,我揣著相機(jī)與錄音爸吮,去河邊找鬼芬膝。 笑死,一個胖子當(dāng)著我的面吹牛形娇,可吹牛的內(nèi)容都是我干的锰霜。 我是一名探鬼主播,決...
    沈念sama閱讀 40,314評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼桐早,長吁一口氣:“原來是場噩夢啊……” “哼锈遥!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起勘畔,我...
    開封第一講書人閱讀 39,230評論 0 276
  • 序言:老撾萬榮一對情侶失蹤所灸,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后炫七,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體爬立,經(jīng)...
    沈念sama閱讀 45,680評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,873評論 3 336
  • 正文 我和宋清朗相戀三年万哪,在試婚紗的時候發(fā)現(xiàn)自己被綠了侠驯。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,991評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡奕巍,死狀恐怖吟策,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情的止,我是刑警寧澤檩坚,帶...
    沈念sama閱讀 35,706評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站诅福,受9級特大地震影響匾委,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜氓润,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,329評論 3 330
  • 文/蒙蒙 一赂乐、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧咖气,春花似錦挨措、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至悯舟,卻和暖如春担租,著一層夾襖步出監(jiān)牢的瞬間砸民,已是汗流浹背抵怎。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評論 1 270
  • 我被黑心中介騙來泰國打工奋救, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人反惕。 一個月前我還...
    沈念sama閱讀 48,158評論 3 370
  • 正文 我出身青樓尝艘,卻偏偏與公主長得像,于是被迫代替她去往敵國和親姿染。 傳聞我的和親對象是個殘疾皇子背亥,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,941評論 2 355

推薦閱讀更多精彩內(nèi)容