持久化保證了即便 redis 服務重啓也會丟失數據,由於 redis 服務重啓後會將硬盤上持久化的數據恢復到內存中,可是當 redis 服務器的硬盤損壞了可能會致使數據丟失,若是經過 redis 的主從複製機制就能夠避免這種單點故障,以下圖:redis
說明:數據庫
一、主 redis 配置緩存
無需特殊配置。性能優化
二、從redis配置服務器
修改從 redis 服務器上的 redis.conf 文件,添加 slaveof 主 redisip 主 redis 端口。架構
上邊的配置說明當前該從 redis 服務器所對應的主 redis 是192.168.101.3,端口是6379。併發
一、完整複製過程分佈式
在 redis2.8 版本以前主從複製過程以下圖:微服務
複製過程說明:高併發
注意:此時若是生成 RDB 文件過程當中存在寫數據操做會致使 RDB 文件和當前主 redis 數據不一致,因此此時 master 主進程會開始收集寫命令並緩存起來。
注意:後續 master 收到的寫命令都會經過開始創建的鏈接發送給 slave。
當 master 和 slave 的鏈接斷開時 slave 能夠自動從新創建鏈接。若是 master 同時收到多個 slave 發來的同步鏈接命令,只會啓動一個進程來寫數據庫鏡像,而後發送給全部 slave。
完整複製的問題:
在 redis2.8 以前從 redis 每次同步都會從主 redis 中複製所有的數據,若是從 redis 是新建立的從主 redis 中複製所有的數據這是沒有問題的,可是,若是當從 redis 中止運行,再啓動時可能只有少部分數據和主 redis 不一樣步,此時啓動 redis 仍然會從主 redis 複製所有數據,這樣的性能確定沒有隻複製那一小部分不一樣步的數據高。
二、部分複製
部分複製說明:
從機鏈接主機後,會主動發起 PSYNC 命令,從機會提供 master 的 runid(機器標識,隨機生成的一個串) 和 offset(數據偏移量,若是offset主從不一致則說明數據不一樣步),主機驗證 runid 和 offset 是否有效,runid 至關於主機身份驗證碼,用來驗證從機上一次鏈接的主機,若是 runid 驗證未經過則,則進行全同步,若是驗證經過則說明曾經同步過,根據 offset 同步部分數據。
順便給你們推薦一個Java架構方面的交流學習羣:698581634,裏面會分享一些資深架構師錄製的視頻錄像:有Spring,MyBatis,Netty源碼分析,高併發、高性能、分佈式、微服務架構的原理,JVM性能優化這些成爲架構師必備的知識體系,主要針對Java開發人員提高本身,突破瓶頸,相信你來學習,會有提高和收穫。在這個羣裏會有你須要的內容 朋友們請抓緊時間加入進來吧。