Redis主從複製看這篇就夠了

什麼是主從複製

持久化保證了即便 redis 服務重啓也會丟失數據,由於 redis 服務重啓後會將硬盤上持久化的數據恢復到內存中,可是當 redis 服務器的硬盤損壞了可能會致使數據丟失,若是經過 redis 的主從複製機制就能夠避免這種單點故障,以下圖:redis

Redis主從複製看這篇就夠了

 

說明:數據庫

  • 主 redis 中的數據有兩個副本(replication)即從 redis1 和從 redis2,即便一臺 redis 服務器宕機其它兩臺 redis 服務也能夠繼續提供服務。
  • 主 redis 中的數據和從 redis 上的數據保持實時同步,當主 redis 寫入數據時經過主從複製機制會複製到兩個從 redis 服務上。
  • 只有一個主 redis,能夠有多個從 redis。
  • 主從複製不會阻塞 master,在同步數據時,master 能夠繼續處理 client 請求。
  • 一個 redis 能夠便是主又是從,以下圖:

Redis主從複製看這篇就夠了

 

  •  

主從配置

一、主 redis 配置緩存

無需特殊配置。性能優化

二、從redis配置服務器

修改從 redis 服務器上的 redis.conf 文件,添加 slaveof 主 redisip 主 redis 端口。架構

Redis主從複製看這篇就夠了

 

上邊的配置說明當前該從 redis 服務器所對應的主 redis 是192.168.101.3,端口是6379。併發

主從複製過程

一、完整複製過程分佈式

在 redis2.8 版本以前主從複製過程以下圖:微服務

Redis主從複製看這篇就夠了

 

複製過程說明:高併發

  1. slave 服務啓動,slave 會創建和 master 的鏈接,發送 sync 命令。
  2. master 啓動一個後臺進程將數據庫快照保存到 RDB 文件中

注意:此時若是生成 RDB 文件過程當中存在寫數據操做會致使 RDB 文件和當前主 redis 數據不一致,因此此時 master 主進程會開始收集寫命令並緩存起來。

  1. master 就發送 RDB 文件給 slave
  2. slave 將文件保存到磁盤上,而後加載到內存恢復
  3. master 把緩存的命令轉發給 slave

注意:後續 master 收到的寫命令都會經過開始創建的鏈接發送給 slave。

當 master 和 slave 的鏈接斷開時 slave 能夠自動從新創建鏈接。若是 master 同時收到多個 slave 發來的同步鏈接命令,只會啓動一個進程來寫數據庫鏡像,而後發送給全部 slave。

完整複製的問題:

在 redis2.8 以前從 redis 每次同步都會從主 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開發人員提高本身,突破瓶頸,相信你來學習,會有提高和收穫。在這個羣裏會有你須要的內容  朋友們請抓緊時間加入進來吧。

相關文章
相關標籤/搜索