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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

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

1.主從架構(gòu)的核心原理:

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

2.主從復(fù)制斷點(diǎn)續(xù)傳

概念:主從復(fù)制過程中如果網(wǎng)絡(luò)斷掉了,可以從上次復(fù)制的地方繼續(xù)復(fù)制而不是從頭復(fù)制

原理:master會在自己內(nèi)存里維護(hù)一個backlog,master和salve都會保存一個復(fù)制數(shù)據(jù)的replica offset ,offset里有一個master的id,offset保存在backlog中,如果網(wǎng)絡(luò)斷掉的話,salve會從master 的offset開始復(fù)制

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

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

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

    (4).psync

  • 從節(jié)點(diǎn)使用psync到maser node,進(jìn)行復(fù)制,psync run id
  • master node根據(jù)自身情況進(jìn)行響應(yīng),可能是FULLRESTYNC run id offset,也可能是CONTINUE觸發(fā)增量復(fù)制
  • (5)全量復(fù)制

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

    (6)增量復(fù)制

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

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

    3.無磁盤化復(fù)制

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

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

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

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

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

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

  • slave->master選舉算法

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

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

    • 接下來會對slave進(jìn)行排序

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

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

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

    總結(jié)

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

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。