1. 程式人生 > >Redis面試篇 -- Redis主從複製原理

Redis面試篇 -- Redis主從複製原理

    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主從架構的高可用。
&nbs