redis replication環(huán)形緩沖區(qū)算法詳解
Redis 的復(fù)制環(huán)形緩沖區(qū)(Replication Backlog)是實(shí)現(xiàn)主從節(jié)點(diǎn)增量同步(Partial Resynchronization)的核心機(jī)制。
它的本質(zhì)是一個(gè)固定大小的內(nèi)存環(huán)形隊(duì)列,用于臨時(shí)存儲(chǔ)主節(jié)點(diǎn)最近傳播的寫(xiě)命令。
當(dāng)從節(jié)點(diǎn)短暫斷開(kāi)后重連時(shí),如果所需數(shù)據(jù)仍在緩沖區(qū)中,主節(jié)點(diǎn)可以直接發(fā)送增量數(shù)據(jù),避免全量同步的開(kāi)銷(xiāo)。
一、環(huán)形緩沖區(qū)的作用
- 增量同步
從節(jié)點(diǎn)斷線重連時(shí),優(yōu)先嘗試從緩沖區(qū)中恢復(fù)丟失的數(shù)據(jù),避免全量同步(RDB 傳輸)。 - 降低網(wǎng)絡(luò)抖動(dòng)影響
在網(wǎng)絡(luò)不穩(wěn)定時(shí),緩沖區(qū)保留最近的數(shù)據(jù),提高系統(tǒng)的容錯(cuò)性。 - 高效內(nèi)存管理
固定大小的環(huán)形結(jié)構(gòu)避免內(nèi)存無(wú)限增長(zhǎng),舊數(shù)據(jù)會(huì)被新數(shù)據(jù)覆蓋。
二、環(huán)形緩沖區(qū)的核心字段
在 Redis 的 INFO replication 輸出中,與環(huán)形緩沖區(qū)相關(guān)的字段包括:
| 字段 | 作用 |
|---|---|
| repl_backlog_active:1 | 緩沖區(qū)是否啟用(1=啟用)。 |
| repl_backlog_size:1048576 | 緩沖區(qū)總大?。J(rèn) 1MB,可配置)。 |
| repl_backlog_first_byte_offset:1 | 緩沖區(qū)中第一個(gè)字節(jié)對(duì)應(yīng)的全局復(fù)制偏移量(標(biāo)識(shí)緩沖區(qū)的起點(diǎn))。 |
| repl_backlog_histlen:979768 | 緩沖區(qū)中實(shí)際存儲(chǔ)的數(shù)據(jù)長(zhǎng)度(從起點(diǎn)到最新數(shù)據(jù)的距離)。 |
| master_repl_offset:979768 | 主節(jié)點(diǎn)當(dāng)前最新的復(fù)制偏移量(標(biāo)識(shí)數(shù)據(jù)寫(xiě)入進(jìn)度)。 |
三、環(huán)形緩沖區(qū)算法原理
1. 數(shù)據(jù)結(jié)構(gòu)
緩沖區(qū)是一個(gè)字符數(shù)組,邏輯上視為環(huán)形(類(lèi)似循環(huán)隊(duì)列)。
通過(guò)兩個(gè)指針隱式管理:
- 寫(xiě)指針:對(duì)應(yīng)
master_repl_offset,表示主節(jié)點(diǎn)最新寫(xiě)入的位置。 - 起點(diǎn)指針:對(duì)應(yīng)
repl_backlog_first_byte_offset,表示緩沖區(qū)中最早數(shù)據(jù)的起始位置。
2. 寫(xiě)入數(shù)據(jù)
主節(jié)點(diǎn)每次傳播寫(xiě)命令時(shí):
- 將命令追加到緩沖區(qū)。
- 更新
master_repl_offset(增加命令的字節(jié)長(zhǎng)度)。 - 如果緩沖區(qū)已滿(
repl_backlog_histlen == repl_backlog_size),則覆蓋舊數(shù)據(jù),并向前移動(dòng)起點(diǎn)指針(repl_backlog_first_byte_offset遞增)。
3. 覆蓋機(jī)制
- 觸發(fā)條件:當(dāng)
master_repl_offset - repl_backlog_first_byte_offset > repl_backlog_size。 - 覆蓋行為:新數(shù)據(jù)覆蓋舊數(shù)據(jù),
repl_backlog_first_byte_offset向前推進(jìn),確保緩沖區(qū)大小固定。
4. 從節(jié)點(diǎn)重連時(shí)的同步邏輯
當(dāng)從節(jié)點(diǎn)重連主節(jié)點(diǎn)時(shí):
發(fā)送自己的 slave_repl_offset(已復(fù)制的最后偏移量)。
主節(jié)點(diǎn)檢查:
- 如果
slave_repl_offset在[repl_backlog_first_byte_offset, master_repl_offset]范圍內(nèi): - 增量同步:從緩沖區(qū)中提取
slave_repl_offset + 1到master_repl_offset之間的數(shù)據(jù)發(fā)送給從節(jié)點(diǎn)。 - 否則:
- 全量同步:生成 RDB 快照并傳輸全部數(shù)據(jù)。
四、配置優(yōu)化建議
緩沖區(qū)大小 (repl-backlog-size)
- 需根據(jù)網(wǎng)絡(luò)環(huán)境和數(shù)據(jù)寫(xiě)入速率調(diào)整。
- 公式建議:
緩沖區(qū)大小 ≥ 斷線最大時(shí)間 × 平均寫(xiě)入速率。 - 例如:若網(wǎng)絡(luò)最長(zhǎng)可能斷開(kāi) 60 秒,主節(jié)點(diǎn)每秒寫(xiě)入 10KB,則緩沖區(qū)至少設(shè)置為
60s × 10KB = 600KB(實(shí)際建議略大)。
緩沖區(qū)保留時(shí)間 (repl-backlog-ttl)
- 默認(rèn) 3600 秒(1 小時(shí)),表示主節(jié)點(diǎn)在沒(méi)有從節(jié)點(diǎn)連接時(shí),保留緩沖區(qū)的時(shí)間。
- 若所有從節(jié)點(diǎn)長(zhǎng)期斷開(kāi),超時(shí)后緩沖區(qū)會(huì)被釋放以節(jié)省內(nèi)存。
五、示例場(chǎng)景
假設(shè)緩沖區(qū)大小為 1000 字節(jié),初始狀態(tài):
repl_backlog_first_byte_offset = 1 master_repl_offset = 1 repl_backlog_histlen = 0
寫(xiě)入 500 字節(jié)數(shù)據(jù)
master_repl_offset變?yōu)?501,repl_backlog_histlen = 500。- 緩沖區(qū)未滿,起點(diǎn)指針不變。
再寫(xiě)入 600 字節(jié)數(shù)據(jù)
- 總需空間
500 + 600 = 1100,超過(guò)緩沖區(qū)大?。?000)。 - 覆蓋舊數(shù)據(jù),起點(diǎn)指針前進(jìn)到
101(覆蓋前 100 字節(jié))。 repl_backlog_first_byte_offset = 101,master_repl_offset = 1101,repl_backlog_histlen = 1000。
從節(jié)點(diǎn)斷線重連
- 若從節(jié)點(diǎn)的
slave_repl_offset = 800: - 在
[101, 1101]范圍內(nèi),觸發(fā)增量同步。 - 若從節(jié)點(diǎn)的
slave_repl_offset = 50: - 不在范圍內(nèi),觸發(fā)全量同步。
六、總結(jié)
Redis 的環(huán)形緩沖區(qū)通過(guò)高效的內(nèi)存管理和偏移量追蹤機(jī)制,顯著提升了主從復(fù)制的健壯性和性能。
合理配置 repl-backlog-size 和監(jiān)控 repl_backlog_histlen 是避免全量同步的關(guān)鍵。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
redis計(jì)數(shù)器與數(shù)量控制的實(shí)現(xiàn)
使用Redis計(jì)數(shù)器可以輕松地解決數(shù)量控制的問(wèn)題,同時(shí)還能有效地提高應(yīng)用的性能,本文主要介紹了redis計(jì)數(shù)器與數(shù)量控制的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2023-12-12
gem install redis報(bào)錯(cuò)的解決方案
今天小編就為大家分享一篇關(guān)于gem install redis報(bào)錯(cuò)的解決方案,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-01-01
redis實(shí)現(xiàn)分布式的方法總結(jié)
在本篇文章中小編給大家整理了關(guān)于redis分布式怎么做的具體內(nèi)容以及知識(shí)點(diǎn)總結(jié),有興趣的朋友們參考下。2019-06-06
Redis對(duì)批量數(shù)據(jù)實(shí)現(xiàn)分布式鎖的實(shí)現(xiàn)代碼
為了防止多人多電腦同時(shí)操作一條數(shù)據(jù),我們自己開(kāi)發(fā)了一個(gè)簡(jiǎn)單的基于Redis實(shí)現(xiàn)的分布式鎖,Redis對(duì)批量數(shù)據(jù)實(shí)現(xiàn)分布式鎖相關(guān)知識(shí)感興趣的朋友一起看看吧2022-03-03
淺析對(duì)redis?hashtable?的sizemask理解
在?Redis?的哈希表實(shí)現(xiàn)中,index?=?hash?&?dict->ht[0].sizemask?是計(jì)算鍵值對(duì)應(yīng)存儲(chǔ)位置的核心操作,本文給大家介紹redis?hashtable?的sizemask理解,感興趣的朋友一起看看吧2025-03-03
在Centos?8.0中安裝Redis服務(wù)器的教程詳解
由于考慮到linux服務(wù)器的性能,所以經(jīng)常需要把一些中間件安裝在linux服務(wù)上,今天通過(guò)本文給大家介紹下在Centos?8.0中安裝Redis服務(wù)器的詳細(xì)過(guò)程,感興趣的朋友一起看看吧2022-03-03
windows下通過(guò)批處理腳本啟動(dòng)redis的操作
本文主要給大家介紹了windows下通過(guò)批處理腳本啟動(dòng)redis的操作,windows下redis啟動(dòng),需要進(jìn)入redis安裝目錄,然后shift+右鍵,選擇“在此處打開(kāi)命令窗口”,然后輸入redis-server.exe redis.conf,就可以啟動(dòng)redis了,文中有詳細(xì)的圖文參考,感興趣的朋友可以參考下2023-12-12

