redis主从复制原理、断点续传、无磁盘化复制、过期key处理
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
(2).backlog
(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
(5)全量復(fù)制
3.對于千兆網(wǎng)卡的機(jī)器來說1s傳輸100MB,6G時間可能超過60s
7.如果slave node開啟了AOF會立即執(zhí)行BGRERITEAOF,重寫AOF
如果復(fù)制數(shù)據(jù)在4-6G之間,很可能全量復(fù)制的時間在1.5-2分鐘
(6)增量復(fù)制
(7)heartbeat
(8)異步復(fù)制
master接收到命令后在內(nèi)部寫入,異步發(fā)送給slave node
3.無磁盤化復(fù)制
repl-diskless-sync no
repl-diskless-sync-delay 5
4.Redis過期策略
(1)定期刪除+惰性刪除
(2)redis內(nèi)存淘汰策略
5.redis哨兵的多個核心底層原理的深入解析(包含slave選舉算法)
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)行排序
-
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)容,希望文章能夠幫你解決所遇到的問題。