什麼是主從複制
持久化保證了即使 redis 服務重新開機也會丢失資料,因為 redis 服務重新開機後會将硬碟上持久化的資料恢複到記憶體中,但是當 redis 伺服器的硬碟損壞了可能會導緻資料丢失,如果通過 redis 的主從複制機制就可以避免這種單點故障,如下圖:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZlBnauMGNhZTYzIDN1kTYhdTOlNTM5MGNjZDNzUjNxQDMjNWMfdWbp9CXt92Yu4GZjlGbh5SZslmZxl3Lc9CX6MHc0RHaiojIsJye.jpeg)
說明:
主 redis 中的資料有兩個副本(replication)即從 redis1 和從 redis2,即使一台 redis 伺服器當機其它兩台 redis 服務也可以繼續提供服務。
主 redis 中的資料和從 redis 上的資料保持實時同步,當主 redis 寫入資料時通過主從複制機制會複制到兩個從 redis 服務上。
隻有一個主 redis,可以有多個從 redis。
主從複制不會阻塞 master,在同步資料時,master 可以繼續處理 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 的連接配接,發送 sync 指令。
master 啟動一個背景程序将資料庫快照儲存到 RDB 檔案中
注意:此時如果生成 RDB 檔案過程中存在寫資料操作會導緻 RDB 檔案和目前主 redis 資料不一緻,是以此時 master 主程序會開始收集寫指令并緩存起來。
master 就發送 RDB 檔案給 slave
slave 将檔案儲存到磁盤上,然後加載到記憶體恢複
master 把緩存的指令轉發給 slave
注意:後續 master 收到的寫指令都會通過開始建立的連接配接發送給 slave。
當 master 和 slave 的連接配接斷開時 slave 可以自動重建立立連接配接。如果 master 同時收到多個 slave 發來的同步連接配接指令,隻會啟動一個程序來寫資料庫鏡像,然後發送給所有 slave。
完整複制的問題:
在 redis2.8 之前從 redis 每次同步都會從主 redis 中複制全部的資料,如果從 redis 是新建立的從主 redis 中複制全部的資料這是沒有問題的,但是,如果當從 redis 停止運作,再啟動時可能隻有少部分資料和主 redis 不同步,此時啟動 redis 仍然會從主 redis 複制全部資料,這樣的性能肯定沒有隻複制那一小部分不同步的資料高。
2、部分複制
部分複制說明:
從機連接配接主機後,會主動發起 PSYNC 指令,從機會提供 master 的 runid(機器辨別,随機生成的一個串) 和 offset(資料偏移量,如果offset主從不一緻則說明資料不同步),主機驗證 runid 和 offset 是否有效,runid 相當于主機身份驗證碼,用來驗證從機上一次連接配接的主機,如果 runid 驗證未通過則,則進行全同步,如果驗證通過則說明曾經同步過,根據 offset 同步部分資料。
Java高架構師、分布式架構、高可擴充、高性能、高并發、性能優化、 Spring boot、Redis、ActiveMQ、Nginx、Mycat、Netty、Jvm大型分布式項 目實戰學習架構師視訊免費學習加群:835638062 點選連結加入群聊【Java 進階架構】:https://jq.qq.com/?_wv=1027&k=5S3kL3v