Redis一般是用來支撐讀高並發的,為了分擔讀壓力,Redis支持主從復制。架構是主從架構,一主多從, 主負責寫,並且將數據復制到其它的 slave 節點,從節點負責讀。 所有的讀請求全部走從節點。這樣也可以很輕松實現水平擴容,支撐讀高並發。
redis主從復制的特點:
-
redis采用異步方式復制數據到slave節點,從redis2.8開始,slave節點會周期性地確認自己每次復制的數據量;
-
一個master節點可以配置多個slave節點;
-
slave節點可以連接其他的slave節點;
-
slave節點做復制的時候,不會阻塞master節點的正常工作;
-
slave節點做復制的時候,也不會阻塞對自己的查詢操作,它會用舊數據集來提供服務,但在復制完成時,需要刪除舊數據集,加載新數據集,這時會暫停對外服務;
-
slave節點主要用來橫向擴容,做讀寫分離,擴容的slave節點可以提高讀的吞吐量;
-
如果采用主從架構,必須開啟master節點的持久化,不建議用slave節點作master節點的數據熱備,因為如果一旦關掉master的持久化,可能在master宕機重啟時數據是空的,然后一經復制,slave節點也會隨之丟失。
主從復制
Redis主從復制分為全量復制和增量復制。
全量復制一般發生在Slave初始化階段,這時slave需要將master上的所有數據都復制一份。步驟如下:
-
從服務器連接主服務器,發送psync命令;
-
主服務器接收到SYNC命名后,開始執行BGSAVE命令生成RDB文件並使用緩沖區記錄此后執行的所有寫命令;
-
主服務器BGSAVE執行完后,向所有從服務器發送快照文件,並在發送期間繼續記錄被執行的寫命令;
-
從服務器收到快照文件后丟棄所有舊數據,載入收到的快照;
-
主服務器快照發送完畢后開始向從服務器發送緩沖區中的寫命令;
-
從服務器完成對快照的載入,開始接收命令請求,並執行來自主服務器緩沖區的寫命令;
增量復制一般是
Slave初始化后開始正常工作時主服務器發生的寫操作同步到從服務器的過程。步驟如下:
-
如果全量復制過程中,master-slave 網絡連接斷掉,那么 slave 重新連接 master 時,會觸發增量復制。
-
master 直接從自己的 backlog 中獲取部分丟失的數據,發送給 slave node,默認 backlog 就是 1MB。
-
master 就是根據 slave 發送的 psync 中的 offset 來從 backlog 中獲取數據的。
其他知識點(可忽略)
Redis主從復制的核心原理
slave節點初次連接master節點,會發送psync命令並觸發全量復制。此時master開啟一個后台線程,開始生成一份RDB快照,同時將那些從外面接收到的寫命令緩存到緩沖區中。RDB文件生成完畢后,將此文件發送給slave節點,slave先寫入磁盤,再從磁盤加載到內存,接着master會將緩沖區中的寫命令發送給slave,slave執行寫命令並同步數據。如果slave節點和master節點因網絡故障斷開連接,會自動重連,連接之后master節點會復制缺少的數據給slave節點。
主從復制的斷點續傳
從redis2.8開始支持主從復制的斷點續傳,主從復制過程中網絡連接斷開了,會接着從上次斷開的地方繼續復制,而不是從頭開始復制。
master節點會在內存中維護一個backlog,master和slave都會保存一個replica offset和一個master run id,offset就在backlog中,master和slave斷開時,slave會讓master從上次replica offset開始繼續復制,如果沒找到對應的offset,就會執行一次
resynchronization。
無磁盤化復制
master在內存中創建RDB,然后發送給RDB,不會在自己本地落地磁盤了,只需要在配置文件中開始repl-diskless-sync-delay即可。
過期key處理
slave不會處理過期key,只能等待master處理。如果master處理了一個key,或者通過LRU淘汰了一個key,那么會模擬一條del命令發送給slave。
heartbeat
主從節點會相互發送heartbeat信息。master默認每隔10秒發送一次heartbeat,slave節點每隔1秒發送一次heartbeat。
異步復制
master每次接收到寫命令之后,先在內部寫入數據,然后異步發送給slave節點。
Redis如何做到高可用
如果系統99%的時間都用於對外服務,那么系統可以說是高可用的。
一個slave節點掛掉,並不會影響系統的高可用性,其他slave節點可以提供相同的數據對外服務。
但如果master節點掛掉了,就無法寫入數據了,導致slave節點得不到最新的數據,這時就相當於系統不可用了。Redis的高可用架構,叫做failover故障轉移,也就主備切換。master節點故障時會自動檢測,並將某個slave節點自動切換成master節點的過程,叫做主備切換。這個過程,實現了Redis主從架構的高可用。
