1辖源、什么是主從復制
???? Redis持久化保證了即使redis服務重啟也不會丟失數(shù)據(jù)柱衔,因為redis服務重啟后會將硬盤上持久化的數(shù)據(jù)恢復到內(nèi)存中,但是當redis服務器的硬盤損壞了可能會導致數(shù)據(jù)丟失涯塔,如果通過redis的主從復制機制就可以避免這種單點故障???
說明:
??? 1作煌、主redis中的數(shù)據(jù)有兩個副本(redis1 和redis2) 即使一臺redis服務器宕機其他兩臺redis服務器也可以繼續(xù)提供服務
?? 2、主redis中的數(shù)據(jù)和從redis上的數(shù)據(jù)保持實時同步泡孩,當主redis寫入數(shù)據(jù)時通過主從復制機制會復制到兩個從redis服務上车摄。只有一個主redis,可以有多個從redis。主從復制不會阻塞master吮播,在同步數(shù)據(jù)時变屁,master 可以繼續(xù)處理client 請求。一個redis可以即是主又是從
2意狠、主從配置
?? 主redis配置(無需特殊配置)
?? 從redis配置(修改從redis服務器上的redis.conf文件,添加slaveof? 主redis的IP和端口)
3粟关、復制過程
? 3.1、完整復制
?????? 在redis2.8版本之前主從復制過程如下
??
????? 1环戈、Slave服務啟動闷板,slave會建立和master的鏈接,發(fā)送sync命令
?????? 2院塞、master啟動一個后臺進程將數(shù)據(jù)庫快照保存到RDB文件中
???????? 注意:此時如果生成RDB文件過程中存在寫數(shù)據(jù)操作會導致RDB文件和當前主redis數(shù)據(jù)不一致遮晚,所以此時master?主進程會開始收集寫命令并緩存起來。
????? 3拦止、master就發(fā)送RDB文件給Slave
???? 4县遣、slave將文件保存到磁盤上,然后加載到內(nèi)存恢復
???? 5汹族、master把緩存的命令發(fā)給slave
???????? 注意:后續(xù)master?收到的寫命令都會通過開始建立的連接發(fā)送給slave萧求。
????? 當master?和slave?的連接斷開時slave?可以自動重新建立連接。如果master?同時收到多個slave?發(fā)來的同步連接命令顶瞒,只會啟動一個進程來寫數(shù)據(jù)庫鏡像夸政,然后發(fā)送給所有slave。
? 完整復制的問題:
在redis2.8之前從redis每次同步都會從主redis中復制全部的數(shù)據(jù)榴徐,如果從redis是新創(chuàng)建的從主redis中復制全部的數(shù)據(jù)這是沒有問題的秒梳,但是,如果當從redis停止運行箕速,再啟動時可能只有少部分數(shù)據(jù)和主redis不同步,此時啟動redis仍然會從主redis復制全部數(shù)據(jù)朋譬,這樣的性能肯定沒有只復制那一小部分不同步的數(shù)據(jù)高盐茎。
3.2、部分復制
?
部分復制說明:
從機連接主機后徙赢,會主動發(fā)起 PSYNC(部分同步)命令字柠,從機會提供 master的runid(機器標識,隨機生成的一個串) 和 offset(數(shù)據(jù)偏移量狡赐,如果offset主從不一致則說明數(shù)據(jù)不同步)窑业,主機驗證 runid 和 offset 是否有效, runid 相當于主機身份驗證碼枕屉,用來驗證從機上一次連接的主機常柄,如果runid驗證未通過則,則進行全同步,如果驗證通過則說明曾經(jīng)同步過西潘,根據(jù)offset同步部分數(shù)據(jù)卷玉。