Redis系列04 - 主從複製

前言

Redis體系學習整理,點我點我
解決問題:
1:單點問題,機器宕機,服務不可用,數據丟失。
2:容量瓶頸。 簡而言之,保障Redis的HP和HA


主從複製三大步驟

如果我們要自己設計一個主從同步的系統,你會怎麼處理?
大家都能想到,最簡單的思路也是三步

  1. 機器建立連接
  2. 數據複製
  3. 後續新指令維護

我們來看下Redis的具體步驟。因爲都是人設計出來其實思路是一致的。

  1. 鏈接階段:Slave 向Master建立鏈接
  2. 數據同步階段:講Master的數據同步到Slave
    1. 全量複製
    2. 增量複製
  3. 命令傳播階段:後續指令持續同步

下面我們單獨針對各個階段進行說明

鏈接階段

slave主動去和master建立socket鏈接。

  1. Slave自我介紹 發送IP + Port 給Master
  2. Master接收到消息。返回master的運行ID(run_id )具體作用下面介紹
  3. 根據master的結果,開始建立socket
  4. 建立完成,互相檢測心跳(Ping master IP)。當然Slave頻率是遠遠大於Master的。
    在這裏插入圖片描述

對應命令
客戶端式:slaveof [IP] [port] 成爲執行機器的從服務器:如果該機器之前是其他master的slave那麼會丟棄之前的數據集。
在這裏插入圖片描述
啓動服務時:redis-service – slaveof 127.0.0.1 6379

配置式(推薦): redis.conf文件中添加配置 slaveof [IP] [port]

QA:
Q:爲什麼是Slave發起連接,發起同步請求,更頻繁的檢測心跳呢?
A:其實很簡單,因爲Master太忙了 【手動狗頭~】不僅要處理各種數據,還要管理和響應Slave。

數據同步階段

這一步涉及RDB和AOF相關的知識: 不熟悉的同學,先點這裏去了解一下

  • Slave發送同步請求

    • 1.0 sync
    • 2.8 psync
    • 4.0 psync < runid > < offset >
      • 第一次請求因爲沒有runid 會傳默認值 0 -1。master接受到默認參數時,判斷爲首次鏈接,會開闢 複製積壓緩衝區 用來把RDB後的數據進行存儲,防止指令丟失。
      • 複製積壓緩衝區的結構如下:偏移值,就是指令中的offset,master根據複製偏移量來決定同步的數據信息。圖片來源:https://www.cnblogs.com/lukexwang/p/4711977.html
  • 全量複製

    • master收到同步請求,運行 bgsave,得到RDB文件。後續指令存入複製積壓緩衝區。
    • RDB文件通過Socket同步給Slave
    • Slave接收到RDB文件。開始清除老數據flashdb。然後根據RDB文件恢復數據。
  • 增量複製

    • master從指令積壓緩衝區得到 AOF文件。發送給Slave
    • Slave 接收數據。執行bgrewriter,然後開始執行恢復。

    到這一步,數據就基本同步完畢了。

命令傳播階段

  • 互相Ping 心跳包
  • 根據複製積壓緩衝區的數據,進行後續的增量複製。

注意事項和遺留問題

注意事項

  • 生產環境主庫數據巨大,新增從庫應並開流量高峯期,避免阻塞影響高可用
  • 複製緩衝區大小默認是1mb。 如果你發現CPU持續走高,可能就是緩衝區大小設置的不合理。 在全複製時,如果檢測到複製積壓緩衝區滿了,系統會進行2次(3次甚至更多次)的全量複製。
  • 內存分配比例,要留30%左右給 bgsave和創建緩衝區。
  • 多Slave錯峯同步,避免帶寬壓崩。

遺留問題:
master宕機的怎麼辦?
數據不一致主從延遲怎麼辦?

相關解釋在集羣和哨兵模式中進行介紹

主從同步今天就總結到這裏~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章