天天看點

Redis主從複制看這篇就夠了

什麼是主從複制

持久化保證了即使 redis 服務重新開機也會丢失資料,因為 redis 服務重新開機後會将硬碟上持久化的資料恢複到記憶體中,但是當 redis 伺服器的硬碟損壞了可能會導緻資料丢失,如果通過 redis 的主從複制機制就可以避免這種單點故障,如下圖:

Redis主從複制看這篇就夠了

說明:

主 redis 中的資料有兩個副本(replication)即從 redis1 和從 redis2,即使一台 redis 伺服器當機其它兩台 redis 服務也可以繼續提供服務。

主 redis 中的資料和從 redis 上的資料保持實時同步,當主 redis 寫入資料時通過主從複制機制會複制到兩個從 redis 服務上。

隻有一個主 redis,可以有多個從 redis。

主從複制不會阻塞 master,在同步資料時,master 可以繼續處理 client 請求。

一個 redis 可以即是主又是從,如下圖:

Redis主從複制看這篇就夠了

主從配置

1、主 redis 配置

無需特殊配置。

2、從redis配置

修改從 redis 伺服器上的 redis.conf 檔案,添加 slaveof 主 redisip 主 redis 端口。

Redis主從複制看這篇就夠了

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

主從複制過程

1、完整複制過程

在 redis2.8 版本之前主從複制過程如下圖:

Redis主從複制看這篇就夠了

複制過程說明:

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、部分複制

Redis主從複制看這篇就夠了

部分複制說明:

從機連接配接主機後,會主動發起 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