Redis主從複製看這篇就夠了

Java大蝸牛發表於2018-09-05

什麼是主從複製

持久化保證了即使 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主從複製看這篇就夠了

 

複製過程說明:

  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 複製全部資料,這樣的效能肯定沒有隻複製那一小部分不同步的資料高。

2、部分複製

Redis主從複製看這篇就夠了

 

部分複製說明:

從機連線主機後,會主動發起 PSYNC 命令,從機會提供 master 的 runid(機器標識,隨機生成的一個串) 和 offset(資料偏移量,如果offset主從不一致則說明資料不同步),主機驗證 runid 和 offset 是否有效,runid 相當於主機身份驗證碼,用來驗證從機上一次連線的主機,如果 runid 驗證未透過則,則進行全同步,如果驗證透過則說明曾經同步過,根據 offset 同步部分資料。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31545684/viewspace-2213629/,如需轉載,請註明出處,否則將追究法律責任。

相關文章