redis-24.主從複製-實操

aliyeye發表於2021-03-10

階段一:連線

主從連線(slave連線master)

  • 方式一:客戶端傳送命令

    slaveof <masterip> <masterport>
  • 方式二:啟動伺服器引數

    redis-server -slaveof <masterip> <masterport>
  • 方式三:伺服器配置

    slaveof <masterip> <masterport>
  • slave系統資訊

    • master_link_down_since_seconds
    • masterhost
    • masterport
  • mater系統訊息

    • slave_listening_port(多個)

主從斷開連線(從)

  • 客戶端傳送命令
    slaveof no one

授權訪問

  • master配置檔案設定密碼

    requirepass <password>
  • master客戶端傳送命令設定密碼

    config set requirepass <password>
    config get requirepass
  • slave客戶端傳送命令設定密碼

    auth <password>
  • slave配置檔案設定密碼

    masterauth <password>
  • 啟動客戶端設定密碼

    redis-cli -a <password>

階段二:資料同步階段工作流程

  • 在slave初次連線master後,複製master中的所有資料到slave
  • 將slave的資料庫狀態更新成master當前的資料庫狀態

資料同步階段工作流程

  1. 請求同步資料
  2. 建立RDB同步資料
  3. 恢復RDB同步資料
  4. 請求部分同步資料
  5. 恢復部分同步資料
    至此,資料同步工作完成

狀態:
slave:具有master端全部資料,包含RDB過程接收的資料
master:保持slave當前資料同步的位置
總體:之間完成了資料克隆

GHHRj6LvLU.png!large

資料同步階段master說明

  1. 如果master資料量巨大,資料同步階段應避開流量高峰期,避免造成master阻塞,影響業務正常執行。
  2. 複製緩衝區大小設定不合理,會導致資料溢位。如進行全量複製週期太長,進行部分複製時發現資料已經存在丟失的情況,必須進行第二次全量複製,致使slave陷入死迴圈狀態。
    repl-backlog-size 1mb
  3. master單機記憶體佔用主機記憶體的比例不應過大,建議使用50%-70%的記憶體,留下30%-50%的記憶體用於執行bgsave命令和建立複製緩衝區。

資料同步階段slave說明

  1. 為避免slave進行全量複製、部分複製時伺服器響應阻塞或資料不同步,建議關閉此期間的對外服務
    slave-serve-stale-data yes | no
  2. 資料同步階段,master傳送給slave資訊可以理解master是slave的一個客戶端,主動向slave傳送命令
  3. 多個slave同時對master請求資料同步,master傳送的RDB檔案增多,會對頻寬造成巨大沖擊,如果master頻寬不足,因此資料同步需要根據業務需求,適量錯峰
  4. slave過多時,建議調整拓撲結構,由一主多從結構變為樹狀結構,中間的節點既是master,也是slave。注意使用樹狀結構時,由於層級深度,導致深度越高的slave與最頂層master間資料同步延遲較大,資料一致性變差,應謹慎選擇

階段三:命令傳播階段

  • 當master資料庫狀態被修改後,導致主從伺服器資料庫狀態不一致,此時需要讓主從資料同步到一致狀態,同步的動作稱為命令傳播
  • master將接收到的資料變更命令傳送給slave,slave接收命令後執行命令

命令傳播階段的部分複製

  • 命令傳播階段出現了斷網現象

    • 網路閃斷閃連 忽略
    • 短時間網路中斷 部分複製
    • 長時間網路中斷 全量複製
  • 部分複製的三個核心要素

    • 伺服器的執行id(run id)
    • 主伺服器的複製積壓緩衝區
    • 主從伺服器的複製偏移量

伺服器執行ID(runid)

  • 概念:伺服器執行ID是每一臺伺服器每次執行的身份識別碼,一臺伺服器多次執行可以生成多個執行id
  • 組成:執行id由40位字元組成,是一個隨機的十六進位制字元
  • 作用:執行id被用於在伺服器間進行傳輸,識別身份。如果想兩次操作均同一臺伺服器進行,必須每次操作攜帶對應的執行id,用於對方識別
  • 實現方式:執行id在每臺伺服器啟動時自動生成的,master在首次連線slave時,會將自己的執行id發給slave,slave儲存此id,透過info server命令,可以檢視節點的runid

複製緩衝區

  • 概念:複製緩衝區,又名複製積壓緩衝區,是一個先進先出(FIFO)的佇列,用於儲存伺服器執行過的命令,每次傳播命令,master都會將傳播的命令記錄下來,並儲存在複製緩衝區1KxEPyO9ha.png!large

複製緩衝區內部工作原理

  • 組成

    • 偏移量
    • 位元組值
  • 工作原理

    • 透過offset區分不同的slave當前資料傳播的差異
    • master記錄已傳送的資訊對應的offset
    • slave記錄已接收的資訊對應的offsetFlwQDkRNoQ.png!large
  • 概念:複製緩衝區,又名複製積壓緩衝區,是一個先進先出(FIFO)的佇列,用於儲存伺服器執行過的命令,每次傳播命令,master都會將傳播的命令記錄下來,並儲存在複製緩衝區。

    • 複製緩衝區預設資料儲存空間大小是1M,由於儲存空間大小是固定的,當入隊元素的數量大於佇列長度是,最先入隊的元素會被彈出,而新元素會被放入佇列。
  • 由來:每臺伺服器啟動時,如果開啟是AOF或被連線成為master節點,即建立複製緩衝區。

  • 作用:用於儲存master收到的所有指令(僅影響資料變更的指令,例如set,select)。

  • 資料來源:當master接收到主客戶端的指令時,除了將指令執行,會將該指令儲存到緩衝區中。

主從伺服器複製偏移量(offset)

  • 概念:一個數字,描述複製緩衝區中的指令位元組位置。
  • 分類:
    • master複製偏移量:記錄傳送給所有slave的指令位元組對應的位置(多個)。
    • slave複製偏移量:記錄slave接收master傳送過來的指令位元組對應的位置(一個)。
  • 資料來源:
    • master端:傳送一次記錄一次
    • slave端:接收一次記錄一次
  • 作用:同步資訊,比對master與slave的差異,當slave斷線後,恢復資料使用。

資料同步+命令傳播階段工作流程

tHpSDst3ou.png!large

心跳機制

  • 進入命令傳播階段候,master與slave間需要進行資訊交換,使用心跳機制進行維護,實現對方連線保持線上
  • master心跳:
    • 指令:PING
    • 週期:由repl-ping-slave-period決定,預設10秒
    • 作用:判斷slave是否線上
    • 查詢:INFO replication 獲取slave最後一次連線時間間隔,lag項維持在0或1視為正常
  • slave心跳任務
    • 指令:REPLCONF ACK{offset}
    • 週期:1秒
    • 作用1:回報slave自己的複製偏移量,獲取最新的資料變更指令
    • 作用2:判斷master是否線上

心跳階段注意事項

  • 當slave多數掉線,或延遲過高時,master位保障資料穩定性,將拒絕所有資訊同步操作
    min-slaves-to-write 2
    min-slaves-max-lag 8
    slave數量少於2個,或者所有slave的延遲都大於等於8秒時,強制關閉master寫功能,停止資料同步
  • slave數量由slave傳送REPLCONF ACF命令做確定
  • slave延遲由slave傳送REPLCONF ACF命令做確定

主從複製工作流程(完整)

Dpj42ARGcd.png!large

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章