Redis什麼是主從複製

什麼是主從複製

持久化保證了即使 redis 服務重啓也會丟失數據,因爲 redis 服務重啓後會將硬盤上持久化的數據恢復到內存中,但是當 redis 服務器的硬盤損壞了可能會導致數據丟失,如果通過 redis 的主從複製機制就可以避免這種單點故障,如下圖:
在這裏插入圖片描述
說明:

  • 主 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 同步部分數據。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章