Redis(一)---主從複製

Redis主從複製

#1 Redis爲什麼需要主從複製 ?

在單機版(僅有一個Redis)的Redis中,數據的讀寫操作都只能靠一個Redis完成,當數據量大的時候,無法滿足我們的需求

#2 什麼是Redis主從 ?

Redis主從同步。數據可以從主服務器向任意數量的從服務器上同步,從服務器可以是關聯其他從服務器的主服務器。這使得Redis可執行單層樹複製。存盤可以有意無意的對數據進行寫操作。由於完全實現了發佈/訂閱機制,使得從數據庫在任何地方同步樹時,可訂閱一個頻道並接收主服務器完整的消息發佈 記錄。同步對讀取操作的可擴展性和數據冗餘很有幫助。

#3 Redis主從工作原理

Redis的主從結構可以採用一主多從或者級聯結構,Redis主從複製可以根據是否是全量分爲全量同步和增量同步。

#3.1 全量同步

Redis全量複製一般發生在Slave初始化階段,這時Slave需要將Master上的所有數據都複製一份。具體步驟如下:

  1. 從服務器連接主服務器,發送SYNC命令;
  2. 主服務器接收到SYNC命名後,開始執行BGSAVE命令生成RDB文件並使用緩衝區記錄此後執行的所有寫命令;
  3. 主服務器BGSAVE執行完後,向所有從服務器發送快照文件,並在發送期間繼續記錄被執行的寫命令;
  4. 從服務器收到快照文件後丟棄所有舊數據,載入收到的快照;
  5. 主服務器快照發送完畢後開始向從服務器發送緩衝區中的寫命令;
  6. 從服務器完成對快照的載入,開始接收命令請求,並執行來自主服務器緩衝區的寫命令;

#3.2 增量同步

Redis增量複製是指Slave初始化後開始正常工作時主服務器發生的寫操作同步到從服務器的過程。 增量複製的過程主要是主服務器每執行一個寫命令就會向從服務器發送相同的寫命令,從服務器接收並執行收到的寫命令。

#3.3 Redis主從同步策略

主從剛剛連接的時候,進行全量同步;全同步結束後,進行增量同步。當然,如果有需要,slave 在任何時候都可以發起全量同步。redis 策略是,無論如何,首先會嘗試進行增量同步,如不成功,要求從機進行全量同步。

注意:

如果多個Slave斷線了,需要重啓的時候,因爲只要Slave啓動,就會發送sync請求和主機全量同步,當多個同時出現的時候,可能會導致Master IO劇增宕機。

存在的問題:

Redis的主從複製下,一旦主節點由於故障不能提供服務,需要人工將從節點晉升爲主節點,同時還要通知應用方更新主節點地址,對於很多應用場景這種故障處理的方法是無法接受的。但是Redis從2.8開始正式提供了Redis Sentinel(哨兵)架構來解決這個問題。

#4 Redis 哨兵

Redis Sentinel是一個分佈式架構,其中包含若干個Sentinel節點和Redis數據節點,每個Sentinel節點會對數據節點和其餘Sentinel節點進行監控,當它發現節點不可達時,會對節點做下線標識。如果被標識的是主節點,它還會和其他Sentinel節點進行“協商”,當大多數Sentinel節點都認爲主節點不可達時,它們會選舉出一個Sentinel節點來完成自動故障轉移的工作,同時會將這個變化通知給Redis應用方。整個過程完全是自動的,不需要人工來介入,所以這套方案很有效地解決了Redis的高可用問題。

實現原理:

  • 三個定時監控任務
  1. 每隔10秒,每個Sentinel節點會向主節點和從節點發送info命令獲取最新的拓撲結構。
  2. 每隔2秒,每個Sentinel節點會向Redis數據節點的__sentinel__:hello頻道上發送該Sentinel節點對於主節點的判斷以及當前Sentinel節點的信息,同時每個Sentinel節點也會訂閱該頻道,來了解其他Sentinel節點以及它們對主節點的判斷。
  3. 每隔一秒,每個Sentinel節點會向主節點、從節點、其餘Sentinel節點發送一條ping命令做一次心跳檢測,來確認這些節點當前是否可達。
  • 主觀下線

因爲每隔一秒,每個Sentinel節點會向主節點、從節點、其餘Sentinel節點發送一條ping命令做一次心跳檢測,當這些節點超過down-after-milliseconds沒有進行有效回覆,Sentinel節點就會對該節點做失敗判定,這個行爲叫做主觀下線。

  • 客觀下線

當Sentinel主觀下線的節點是主節點時,該Sentinel節點會向其他Sentinel節點詢問對主節點的判斷,當超過個數,那麼意味着大部分的Sentinel節點都對這個主節點的下線做了同意的判定,於是該Sentinel節點認爲主節點確實有問題,這時該Sentinel節點會做出客觀下線的決定。

  • 領導者Sentinel節點選舉

Raft算法:假設s1(sentinel-1)最先完成客觀下線,它會向其餘Sentinel節點發送命令,請求成爲領導者;收到命令的Sentinel節點如果沒有同意過其他Sentinel節點的請求,那麼就會同意s1的請求,否則拒絕;如果s1發現自己的票數已經大於等於某個值,那麼它將成爲領導者。

  • 故障轉移
  1. 領導者Sentinel節點在從節點列表中選出一個節點作爲新的主節點
  2. 上一步的選取規則是與主節點複製相似度最高的從節點
  3. 領導者Sentinel節點讓剩餘的從節點成爲新的主節點的從節點
  4. Sentinel節點集合會將原來的主節點更新爲從節點,並保持着對其關注,當其恢復後命令它去複製新的主節點
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章