日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

redis主从复制原理、断点续传、无磁盘化复制、过期key处理

發布時間:2024/10/6 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 redis主从复制原理、断点续传、无磁盘化复制、过期key处理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.主從架構的核心原理:

當啟動一個salve node時會發送PSYNC 命令到master。
salve第一次連接master時master會根據當前數據復制一份RDB(full resynchronization 全量復制)到slave,slave會將本地數據寫入磁盤,然后從本地磁盤加載到內存中,master會將內存中的數據發送給slave,slave會同步這些數據。如果master與slave發生故障master,會自動重連

2.主從復制斷點續傳

概念:主從復制過程中如果網絡斷掉了,可以從上次復制的地方繼續復制而不是從頭復制

原理:master會在自己內存里維護一個backlog,master和salve都會保存一個復制數據的replica offset ,offset里有一個master的id,offset保存在backlog中,如果網絡斷掉的話,salve會從master 的offset開始復制

(1).maste和slave都會維護offset

  • master和slave都會不斷累加offset
  • slave會每秒上傳自己的offset,master也會保存每一個slave的offset
  • slave和master都知道各自的offset,才知道各自數據不一致的情況
  • (2).backlog

  • master node有一個backlog默認是1MB,
  • master node給slave復制數據時也會給把backlog同步一份,
  • backlog主要用來做全量復制中斷的時增量復制的
  • (3).master run id
    info server 可以看到master run id
    根據host+ip定位到master node是不靠譜的,如果master node重啟或數據發生變化,那么slave node 會根據不同的run id進行分區,run id不同做全量復制,如果不更改run id 重啟redis 則可以用 redis-cli debug reload

    (4).psync

  • 從節點使用psync到maser node,進行復制,psync run id
  • master node根據自身情況進行響應,可能是FULLRESTYNC run id offset,也可能是CONTINUE觸發增量復制
  • (5)全量復制

  • master 執行BGSAVE,在本地生成RDB快照
  • master node會將RDB快照文件發送給slave node,如果RDB再復制過程中時間超過60s(repl-timeout),slave-node會認為復制失敗,可以適當調大復制時間參數(repl-timeout)
    3.對于千兆網卡的機器來說1s傳輸100MB,6G時間可能超過60s
  • master node生成RDB時,會將所有的命令緩存到內存中,在slave node保存rdb后,再將新的命令復制到slave node中
  • client-output-buffer-limit slave 256MB 64MB 60,如果再復制期間內存緩沖區消耗超過64MB,或一次性超過256MB則復制失敗
  • slave node在接收到rdb后會清空自己的舊數據,然后重新加載rdb到自己內存中,同時基于舊的數據提供服務
    7.如果slave node開啟了AOF會立即執行BGRERITEAOF,重寫AOF
  • 如果復制數據在4-6G之間,很可能全量復制的時間在1.5-2分鐘

    (6)增量復制

  • 如果在全量復制的過程中master-slave網絡斷掉,salve node在重新連接master node時會觸發增量復制
  • master 直接從backlog獲取部分丟失數據,發送給slave node,默認backlog是1MB
  • master會根據slave發送的psync中的offset獲取數據
  • (7)heartbeat

  • 主從節點相互發送heartbeat信息
  • master每隔10s發送一次heartbeat信息,slave每隔1s發送一次heartbeat信息
  • (8)異步復制
    master接收到命令后在內部寫入,異步發送給slave node

    3.無磁盤化復制

  • master直接在內存中創建RDB,然后發送給slave不會落到本地磁盤
    repl-diskless-sync no
  • 等待一段時間在開始復制因為要等待更多的slave連進來
    repl-diskless-sync-delay 5
  • 4.Redis過期策略

    (1)定期刪除+惰性刪除

  • 每個100ms檢查key是否過期如果過期則刪除
  • 惰性刪除可能會導致很多過期的key沒有被刪除,如果查詢時到某個key過期則刪除
  • (2)redis內存淘汰策略

  • noeviction:當內存不足以容納新的數據時,寫入操作就會報錯
  • allkeys-lru:當內存不足以容納新的數據時,就會淘汰最近最少使用的key
  • allkeys-random:當內存不足以容納新的數據時,就會隨機刪除key
  • volatile-lru:當內存不足以容納新的數據時,在過期key刪除中刪除最近最少使用的
  • volatile-ttl:當內存數據不足以容納新的數據時,刪除那些即將過期的key
  • 5.redis哨兵的多個核心底層原理的深入解析(包含slave選舉算法)

  • sdown和odown轉換機制
    sdown是主觀宕機,一個slave覺得自己的master宕機了就是主觀宕機
    • odown是客觀宕機,如果quorum的數量的哨兵覺得maser宕機了就是客觀宕機,sdown達成條件很簡單,如果一個哨兵ping master超過了is-master-down-after-milliseconds指定毫秒數就認為master宕機了
    • sdown到odown的轉換條件比較簡單,如果一個哨兵在指定時間內也收到quorum的數量的哨兵覺的是sdown宕機,那么就認為是odown,客觀認為master宕機
  • 哨兵和slave的自動發現機制
    哨兵之間相互發現通過pub/sub系統實現,每個兩秒鐘哨兵都會監控自己的master+slaves對應的_sentinel_:hello channel發送消息,內容主要是hos、IP、run id還有master對應的監控配置,感知同樣監聽master+slaves哨兵的存在,哨兵間還會交換master監控配置,實現監控配置的同步

  • slave配置的自動糾正
    哨兵模式會負責糾正slave的一些配置,比如slave要成為master的潛在候選人,哨兵會確保slave會復制master現有的數據,如果slave連接到一個錯誤的master上故障轉移后哨兵會保證它連接到正確的master上

  • slave->master選舉算法

    • 如果master被認為是odown而且majoitry哨兵都允許主備切換,此時哨兵就會執行主備切換,選舉slave需要考慮的信息

    • 跟master斷開連接的時長
    • slave優先級
    • 復制offset
    • run id
    • 如果一個slave與master斷開時長超過down-after-milliseconds的10倍,外加master宕機時長此時就會認為不適合選舉為master
      (down-after-milliseconds *10)+milliseconds_since_master_is_in_sdown

    • 接下來會對slave進行排序

  • 按照slave優先級進行排序,slave priority越小優先級越高
  • 如果兩個slave priority相同,則查看那個offset復制數據多,offset越靠后優先級越高
  • 如果上面兩個條件都相同那就查看那個run id比較小
    • quorum和majority
      每次主備切換,首先確認quorum數量的odown,然后選舉出一個哨兵進行切換,這個哨兵還必須得到majority哨兵的授權,才能被正式授權
      如果quorum<majority比如5個哨兵,majority是3,quorum的數量是2,那么3哨兵授權就可以切換
      但如果quorum>=majority,那么必須所有的quorum都必須授權,比如 quorum是5必須5個哨兵都授權才能切換

    • configuration epoch
      執行切換的哨兵,要切換到新的master需要得到一個configuration epoch這就是一個版本號,每次版本號必須唯一
      如果第一個哨兵切換失敗,那么其他哨兵會等待faliover-timeout時間,然后繼續執行切換獲得一個新的configuration epoch,作為新的版本號

    • configuration傳播
      哨兵切換完成后會將本地跟新為最新的master配置,然后pub/sub機制同步給其他哨兵
      這里之前的version就很重要,因為消息都是通過一個channel發布監聽,完成主備切換后新的master跟著新的version,其他哨兵也跟著version大小更新自己的master

    總結

    以上是生活随笔為你收集整理的redis主从复制原理、断点续传、无磁盘化复制、过期key处理的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。