Redis高可用之主從復制原理演進分析( 三 )


Redis高可用之主從復制原理演進分析

文章插圖
四、Redis4.0的同源增量同步先看兩個問題
1.從節點重啟后丟失了原主節點的節點編號和復制偏移量 , 這導致重啟后需要全量復制,這個很好辦,把這些信息保存下來
2.主從切換后,主節點信息變化了,導致從節點需要全量數據同步,這個也好辦,只要能確認新主節點數據是從原主節點復制過來就可以了
Redis4.0 后,對 PSYNC 進行了改進,提出了同源增量復制解決方案,來解決上面提到的兩個全量復制問題 。
第1個:從節點重啟后 , 需要跟主節點全量數據同步,為什么?本質原因 , 是從節點丟失了主節點的編號信息和偏移量信息 。Redis4.0后 , 就把主節點的編號信息寫入到 RDB 中持久化保存 。
第2個:主從切換后,從節點需要和主節點全量同步,為什么?原因就是新的主節點不認識原來主節點的編號信息 。切換后怎么才能識別到呢?Redis4.0 后,主從切換后,新的主節點會將先前的主節點信息記錄下來,這樣新主節點就知道自己原先數據是從哪個舊主節點同步來的,大家都是從同一個地方出來的,應該接受部分數據同步策略 。
五、Redis6.0無盤同步復制什么叫無盤?
原先的同步復制是通過 fork 一個子進程生成 RDB 快照文件,RDB 存儲在磁盤上,然后傳輸 RDB 文件,從節點服務器在恢復 RDB 文件數據 。
無盤,就是說不生成 RDB 文件,不通過 RDB 來傳輸數據 。而是直接通過網絡來傳輸數據 。
怎么做到無盤呢?
Redis6.0 后 , 它也是先 fork 一個子進程,這個子進程 dump 數據,它通過管道回寫給主節點,主節點在將數據發送給從節點,這樣的過程就是無盤傳輸 。
六、Redis7.0共享復制緩沖區6.1 多從庫時主庫占用內存過多問題
Redis高可用之主從復制原理演進分析

文章插圖
(from: https://mp.weixin.qq.com/s/UlHksrqFq0yfKh1uMFvYNg 作者:shooterIT)
如圖所示,對于 Redis 主庫,當用戶的寫請求到達時,主庫會將變更命令分別寫入所有從庫的緩沖區(OutputBuffer),以及復制積壓緩沖區(ReplicationBacklog) 。全量同步也會執行該邏輯 。所以在全量同步階段經常會觸發 client-output-buffer-limit,主庫斷開與從庫的連接 , 導致主從同步失敗,甚至出現循環持續失敗的情況 。
所有從庫的連接在主庫上是獨立的,也就是說每個從庫 OutputBuffer 占用的內存空間也是獨立的,那么主從復制消耗的內存就是所有從庫緩沖區內存大小之和 。如果我們設定從庫的 client-output-buffer-limit 為 1GB,如果有三個從庫,則在主庫上可能會消耗 3GB 的內存用于主從復制 。另外,真實環境中從庫的數量不是確定的,這也導致 Redis 實例的內存消耗不可控 。
from: https://mp.weixin.qq.com/s/UlHksrqFq0yfKh1uMFvYNg 作者:shooterIT
6.2 OutputBuffer 拷貝和釋放的堵塞問題
  • ReplicationBacklog 的限制
  • OutputBuffer 拷貝和釋放的堵塞問題
具體內容請看這里:https://mp.weixin.qq.com/s/UlHksrqFq0yfKh1uMFvYNg
6.3 解決方案:共享復制緩沖區
Redis高可用之主從復制原理演進分析

文章插圖
具體方案請看這里:https://mp.weixin.qq.com/s/UlHksrqFq0yfKh1uMFvYNg 作者:shooterIT
七、參考
  • https://redis.io/docs/manual/replication/ redis 復制功能
  • https://mp.weixin.qq.com/s/a4JTKKTCEyz1W0FIF5fVZA Redis 主從復制的演進歷程與百度實踐 - 百度
  • https://mp.weixin.qq.com/s/UlHksrqFq0yfKh1uMFvYNg Redis 7.0 共享復制緩沖區的設計與實現-ShooterIT
  • 《Redis設計與實現》

推薦閱讀