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主從架構的高可用。
相關文章
相關標籤/搜索