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 同步部分資料。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31545684/viewspace-2213629/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- mysql的主從複製延遲問題--看這一篇就夠了MySql
- mongoDB看這篇就夠了MongoDB
- 學Redis這篇就夠了Redis
- 學透 Redis HyperLogLog,看這篇就夠了Redis
- Redis基礎命令彙總,看這篇就夠了Redis
- Android View繪製流程看這篇就夠了AndroidView
- Oracle索引,看這篇就夠了Oracle索引
- 入門Webpack,看這篇就夠了Web
- Android Fragment看這篇就夠了AndroidFragment
- OAuth授權|看這篇就夠了OAuth
- Zookeeper入門看這篇就夠了
- Git 看這一篇就夠了Git
- React入門看這篇就夠了React
- JavaScript正則,看這篇就夠了JavaScript
- 小程式分享,看這篇就夠了
- 面試中關於Redis的問題看這篇就夠了面試Redis
- Flutter DataTable 看這一篇就夠了Flutter
- 小程式入門看這篇就夠了
- Java 動態代理,看這篇就夠了Java
- vue 元件通訊看這篇就夠了Vue元件
- java序列化,看這篇就夠了Java
- 代理模式看這一篇就夠了模式
- EFCore 6.0入門看這篇就夠了
- ZooKeeper分散式配置——看這篇就夠了分散式
- Java 集合看這一篇就夠了Java
- 學習Less-看這篇就夠了
- [收藏]學習sed,看這篇就夠了
- 瞭解 MongoDB 看這一篇就夠了MongoDB
- 關於SwiftUI,看這一篇就夠了SwiftUI
- 前端er瞭解GraphQL,看這篇就夠了前端
- 入門Hbase,看這一篇就夠了
- macOS 安裝 Nebula Graph 看這篇就夠了Mac
- HashMap的實現原理(看這篇就夠了)HashMap
- jQuery入門看這一篇就夠了jQuery
- Elasticsearch入門,看這一篇就夠了Elasticsearch
- ActiveMq 之JMS 看這一篇就夠了MQ
- MySQL入門看這一篇就夠了MySql
- flex佈局看這一篇就夠了Flex