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

在很久之前寫過一篇 Redis 主從復制原理的簡略分析,基本是一個筆記類文章 。
一、什么是主從復制1.1 什么是主從復制主從復制,從名字可以看出,至少需要 2 臺 Redis 服務器,一臺叫主 Redis 服務器,一臺叫從 Redis 服務器,也可以把他們叫做主節點(主 Redis 服務器)從節點(從 Redis 服務器) 。然后把主 Redis 服務器上的數據復制到從 Redis 服務器上 , 這就是主從復制 。后續也會源源不斷的把數據從主節點復制到從節點 。

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

文章插圖
1.2 怎么設置主從復制怎么設置主 Redis 服務器,怎么設置從 Redis 服務器?
比如有 2 臺 Redis 服務器,ip 分別為:192.168.1.100 和 192.168.1.101 。
  • 第一種方法
設置方法:在 Redis 的配置文件 redis.conf 中配置:replicaof masterip masterport
比如將 192.168.1.100 這臺服務器設置為主(master)服務器 , 那么就在服務器 192.168.1.101 的配置文件里設置如下:
replicaof 192.168.1.100 6379然后重啟服務器,這樣主服務器就是 192.168.1.100,從服務器就是 192.168.1.101 。
  • 第二種方法
還可以用 redis-cli 客戶端連接到 192.168.1.101,然后執行命令 replicaof 192.168.1.100 6379 。
這種方式如果從 Redis 重啟后,主從關系就消失了 。
  • 第三種方法
在 redis-server 啟動參數中增加 --replicaof 192.168.1.100 6379 參數
說明:Redis 5.0 后,replicaof 命令已經替換了 slaveof 命令,但是為了兼容 slaveof 還是可以用 。
一臺主服務器也可以有多臺從服務器,從服務器也可以有從服務器 。
二、為什么要主從復制主從復制后就有多份數據 , 相當于有多個副本,既是備份也是容災 。
為什么要有主從復制功能?
其實問的就是 Redis 主從復制有什么作用,帶來了啥好處 。
  • 負載均衡
數據量大的時候,為了減輕服務器壓力 , 會用讀寫分離模式來分攤流量 , 主服務器負責寫 , 從服務器負責讀 。當然主服務器也可以讀 。
  • 故障恢復
主服務器出現問題時候,從服務器還可以繼續提供服務 。并且也可以把從服務器提升為主服務器,這就是 Redis 的哨兵模式 。
高可用的數據冗余方式 。
  • 數據冗余
多了一份數據 , 故障了,就可以快速恢復數據 。
三、怎么進行主從復制
主從數據同步就是把主服務器生成的 RDB 數據文件復制到從服務器上,然后解析 RDB 文件,在從服務器上生成對應的數據 。或同步相關的命令 。
3.1 主從復制同步的演進在 Redis2.8 之前,都是全量數據復制 。也就是說,斷線重連后,也是重新全量復制數據 。這種方式把很多原來同步過了的數據又重新同步一次 , 這種方式的數據同步效率太低 。
在 Redis2.8 之后,增加了部分重同步模式,也就是增加增量數據同步 , 只同步需要同步的數據 。這就改進了之前的數據同步模式 。
什么時候進行全量數據同步?第一次數據同步時候就進行全量數據同步 。有時主從數據不一致時也需要全量同步 。
什么時候進行增量數據同步?比如斷線重連后,就進行增量數據同步 。
3.2 Redis2.8之前復制Redis2.8 之前主從同步有 2 個部分:全量同步,命令傳播 。
全量同步:主從節點建立連接,主節點回復后,從節點向主節點發送 SYNC 命令,把從節點服務器狀態更新到當前主節點服務器狀態 。主節點創建全量數據的 RDB 快照文件,然后發送給從節點,從節點加載 RDB 文件恢復對應的數據 。主節點再繼續發送復制過程中積壓在緩沖區內的新增命令到從節點,使從節點的數據到達和主節點數據一致 。
命令傳播:主節點和從節點保持連接,主節點將繼續向從節點發送命令流 , 保證主節點上的數據集發生了變更同樣在從數據集上也發生變更 。
流程圖:
Redis高可用之主從復制原理演進分析

文章插圖
3.3 Redis2.8之后復制
【Redis高可用之主從復制原理演進分析】以 redis6.0 版本來介紹 。
Redis2.8 之后全量復制與上面(Redis2.8之前)復制步驟差不多,SYNC 命令變成了 PSYNC 命令,之后增加了部分重同步 。部分重同步改進了之前的每次需要全量同步問題 。

推薦閱讀