持久化保證了即使 redis 服務重啟也會丟失數(shù)據,因為 redis 服務重啟后會將硬盤上持久化的數(shù)據恢復到內存中,但是當 redis 服務器的硬盤損壞了可能會導致數(shù)據丟失,如果通過 redis 的主從復制機制就可以避免這種單點故障,如下圖:
創(chuàng)新互聯(lián)網站建設提供從項目策劃、軟件開發(fā),軟件安全維護、網站優(yōu)化(SEO)、網站分析、效果評估等整套的建站服務,主營業(yè)務為網站設計制作、成都網站制作,重慶APP軟件開發(fā)以傳統(tǒng)方式定制建設網站,并提供域名空間備案等一條龍服務,秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務。創(chuàng)新互聯(lián)深信只要達到每一位用戶的要求,就會得到認可,從而選擇與我們長期合作。這樣,我們也可以走得更遠!說明:
主 redis 中的數(shù)據有兩個副本(replication)即從 redis1 和從 redis2,即使一臺 redis 服務器宕機其它兩臺 redis 服務也可以繼續(xù)提供服務。
主 redis 中的數(shù)據和從 redis 上的數(shù)據保持實時同步,當主 redis 寫入數(shù)據時通過主從復制機制會復制到兩個從 redis 服務上。
只有一個主 redis,可以有多個從 redis。
主從復制不會阻塞 master,在同步數(shù)據時,master 可以繼續(xù)處理 client 請求。
一個 redis 可以即是主又是從,如下圖:
1、主 redis 配置
無需特殊配置。
2、從redis配置
修改從 redis 服務器上的 redis.conf 文件,添加 slaveof 主 redisip 主 redis 端口。
上邊的配置說明當前該從 redis 服務器所對應的主 redis 是192.168.101.3,端口是6379。
1、完整復制過程
在 redis2.8 版本之前主從復制過程如下圖:
復制過程說明:
slave 服務啟動,slave 會建立和 master 的連接,發(fā)送 sync 命令。
master 啟動一個后臺進程將數(shù)據庫快照保存到 RDB 文件中
注意:此時如果生成 RDB 文件過程中存在寫數(shù)據操作會導致 RDB 文件和當前主 redis 數(shù)據不一致,所以此時 master 主進程會開始收集寫命令并緩存起來。
master 就發(fā)送 RDB 文件給 slave
slave 將文件保存到磁盤上,然后加載到內存恢復
master 把緩存的命令轉發(fā)給 slave
注意:后續(xù) master 收到的寫命令都會通過開始建立的連接發(fā)送給 slave。
當 master 和 slave 的連接斷開時 slave 可以自動重新建立連接。如果 master 同時收到多個 slave 發(fā)來的同步連接命令,只會啟動一個進程來寫數(shù)據庫鏡像,然后發(fā)送給所有 slave。
完整復制的問題:
在 redis2.8 之前從 redis 每次同步都會從主 redis 中復制全部的數(shù)據,如果從 redis 是新創(chuàng)建的從主 redis 中復制全部的數(shù)據這是沒有問題的,但是,如果當從 redis 停止運行,再啟動時可能只有少部分數(shù)據和主 redis 不同步,此時啟動 redis 仍然會從主 redis 復制全部數(shù)據,這樣的性能肯定沒有只復制那一小部分不同步的數(shù)據高。
2、部分復制
部分復制說明:
從機連接主機后,會主動發(fā)起 PSYNC 命令,從機會提供 master 的 runid(機器標識,隨機生成的一個串) 和 offset(數(shù)據偏移量,如果offset主從不一致則說明數(shù)據不同步),主機驗證 runid 和 offset 是否有效,runid 相當于主機身份驗證碼,用來驗證從機上一次連接的主機,如果 runid 驗證未通過則,則進行全同步,如果驗證通過則說明曾經同步過,根據 offset 同步部分數(shù)據。