解讀redis?slaveof命令執(zhí)行后為什么需要清庫(kù)重新同步
在 Redis 中,執(zhí)行 SLAVEOF
(或 REPLICAOF
)命令后,從節(jié)點(diǎn)需要清空現(xiàn)有數(shù)據(jù)并重新同步的主要原因如下:
1. 保證數(shù)據(jù)一致性
核心目標(biāo):確保從節(jié)點(diǎn)的數(shù)據(jù)與主節(jié)點(diǎn) 完全一致。
問(wèn)題場(chǎng)景:
- 如果從節(jié)點(diǎn)之前有其他數(shù)據(jù)(例如曾是其他主節(jié)點(diǎn)的副本,或自身是獨(dú)立主節(jié)點(diǎn)),直接保留數(shù)據(jù)會(huì)導(dǎo)致新舊數(shù)據(jù)混合。
- 主節(jié)點(diǎn)的數(shù)據(jù)狀態(tài)可能與從節(jié)點(diǎn)存在沖突(例如相同的鍵但值不同),導(dǎo)致數(shù)據(jù)邏輯錯(cuò)誤。
2. 全量同步的觸發(fā)條件
當(dāng)從節(jié)點(diǎn)執(zhí)行 SLAVEOF
連接到主節(jié)點(diǎn)時(shí),Redis 會(huì)觸發(fā)以下兩種同步機(jī)制:
(1) 全量同步(Full Sync)
觸發(fā)條件:
- 從節(jié)點(diǎn)是首次連接到主節(jié)點(diǎn)。
- 主從的復(fù)制 ID 不匹配(例如主節(jié)點(diǎn)發(fā)生過(guò)故障轉(zhuǎn)移)。
- 從節(jié)點(diǎn)的復(fù)制偏移量(
repl_offset
) 不在主節(jié)點(diǎn)的復(fù)制積壓緩沖區(qū)(repl_backlog
)范圍內(nèi)。
操作流程:
- 主節(jié)點(diǎn)生成當(dāng)前數(shù)據(jù)的 RDB 快照,發(fā)送給從節(jié)點(diǎn)。
- 從節(jié)點(diǎn)清空自身數(shù)據(jù),加載 RDB 文件。
- 主節(jié)點(diǎn)將生成 RDB 期間的新寫(xiě)入命令緩存,待 RDB 傳輸完成后發(fā)送給從節(jié)點(diǎn)(增量同步)。
(2) 部分同步(Partial Sync)
觸發(fā)條件:
- 主從的復(fù)制 ID 一致。
- 從節(jié)點(diǎn)的復(fù)制偏移量仍在主節(jié)點(diǎn)的
repl_backlog
范圍內(nèi)。
操作流程:
- 主節(jié)點(diǎn)直接發(fā)送從節(jié)點(diǎn)缺失的增量命令(無(wú)需清空數(shù)據(jù))。
- 從節(jié)點(diǎn)應(yīng)用這些命令,追上主節(jié)點(diǎn)狀態(tài)。
3. 清空數(shù)據(jù)的必要性
- 全量同步必須清空數(shù)據(jù):
從節(jié)點(diǎn)需要以主節(jié)點(diǎn)的 RDB 快照為基準(zhǔn)重建數(shù)據(jù)集,若保留原有數(shù)據(jù),會(huì)導(dǎo)致數(shù)據(jù)不一致。
# 示例:從節(jié)點(diǎn)加載 RDB 前自動(dòng)執(zhí)行 FLUSHALL [從節(jié)點(diǎn)日志] MASTER <-> REPLICA sync: Flushing old data
- 部分同步無(wú)需清空數(shù)據(jù):
增量命令是基于從節(jié)點(diǎn)已有的數(shù)據(jù)狀態(tài)追加的,因此保留數(shù)據(jù)是安全的。
4. 數(shù)據(jù)一致性的風(fēng)險(xiǎn)
場(chǎng)景 | 風(fēng)險(xiǎn) |
---|---|
不清空數(shù)據(jù) + 全量同步 | 主節(jié)點(diǎn) RDB 數(shù)據(jù)與從節(jié)點(diǎn)舊數(shù)據(jù)混合,導(dǎo)致鍵覆蓋、過(guò)期時(shí)間錯(cuò)亂等問(wèn)題。 |
不清空數(shù)據(jù) + 部分同步 | 僅當(dāng)復(fù)制 ID 和偏移量匹配時(shí)安全,否則數(shù)據(jù)可能不完整或邏輯沖突。 |
如何避免全量同步(減少清庫(kù)開(kāi)銷(xiāo))
(1) 合理配置 repl-backlog-size
- 增大主節(jié)點(diǎn)的復(fù)制積壓緩沖區(qū)(默認(rèn) 1MB),允許更長(zhǎng)時(shí)間的斷線(xiàn)后仍能觸發(fā)部分同步:
# 主節(jié)點(diǎn)配置(redis.conf) repl-backlog-size 64mb # 根據(jù)業(yè)務(wù)寫(xiě)入量調(diào)整
(2) 避免頻繁主從切換
- 減少主節(jié)點(diǎn)故障轉(zhuǎn)移次數(shù)(如優(yōu)化 Sentinel 參數(shù)
down-after-milliseconds
),避免復(fù)制 ID 變更。
(3) 持久化復(fù)制 ID 和偏移量
- 從節(jié)點(diǎn)重啟時(shí),若復(fù)制 ID 和偏移量仍有效,可觸發(fā)部分同步:
# 從節(jié)點(diǎn)配置(redis.conf) repl-diskless-sync no # 啟用磁盤(pán)備份(默認(rèn))
示例:同步流程的日志分析
(1) 全量同步日志
# 主節(jié)點(diǎn)日志
[19042] 01 Jan 12:00:00.123 * Replica 127.0.0.1:6380 asks for synchronization
[19042] 01 Jan 12:00:00.123 * Full resync requested by replica 127.0.0.1:6380
[19042] 01 Jan 12:00:00.123 * Starting BGSAVE for SYNC with target: disk# 從節(jié)點(diǎn)日志
[19043] 01 Jan 12:00:00.125 * MASTER <-> REPLICA sync started
[19043] 01 Jan 12:00:00.125 * MASTER <-> REPLICA sync: Flushing old data
[19043] 01 Jan 12:00:00.125 * MASTER <-> REPLICA sync: Loading DB in memory
(2) 部分同步日志
# 主節(jié)點(diǎn)日志
[19042] 01 Jan 12:00:00.123 * Replica 127.0.0.1:6380 requests partial resynchronization
[19042] 01 Jan 12:00:00.123 * Partial resynchronization request accepted# 從節(jié)點(diǎn)日志
[19043] 01 Jan 12:00:00.125 * MASTER <-> REPLICA sync: Master accepted a Partial Resynchronization
總結(jié)
- 全量同步必須清空數(shù)據(jù):確保從節(jié)點(diǎn)以主節(jié)點(diǎn)的 RDB 快照為基準(zhǔn),避免數(shù)據(jù)不一致。
- 部分同步無(wú)需清空:基于復(fù)制積壓緩沖區(qū)的增量命令追加,保留數(shù)據(jù)安全。
- 優(yōu)化建議:通過(guò)調(diào)整
repl-backlog-size
和減少主從切換頻率,盡量避免全量同步,降低清庫(kù)對(duì)服務(wù)的影響。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Redis整合SpringBoot的RedisTemplate實(shí)現(xiàn)類(lèi)(實(shí)例詳解)
這篇文章主要介紹了Redis整合SpringBoot的RedisTemplate實(shí)現(xiàn)類(lèi),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01Jackson2JsonRedisSerializer和GenericJackson2JsonRedisSerializ
本文主要介紹了Jackson2JsonRedisSerializer和GenericJackson2JsonRedisSerializer區(qū)別,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04SpringBoot3+Redis實(shí)現(xiàn)分布式鎖的配置方法
這篇文章主要介紹了SpringBoot3+Redis實(shí)現(xiàn)分布式鎖,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧2024-07-07聊聊使用RedisTemplat實(shí)現(xiàn)簡(jiǎn)單的分布式鎖的問(wèn)題
這篇文章主要介紹了使用RedisTemplat實(shí)現(xiàn)簡(jiǎn)單的分布式鎖問(wèn)題,文中給大家介紹在SpringBootTest中編寫(xiě)測(cè)試模塊的詳細(xì)代碼,需要的朋友可以參考下2021-11-11Redis配合SSDB實(shí)現(xiàn)持久化存儲(chǔ)代碼示例
這篇文章主要介紹了Redis配合SSDB實(shí)現(xiàn)持久化存儲(chǔ)代碼示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11window環(huán)境redis通過(guò)AOF恢復(fù)數(shù)據(jù)的方法
這篇文章主要介紹了window環(huán)境redis通過(guò)AOF恢復(fù)數(shù)據(jù)的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11