Redis 提供了多種機(jī)制來確保實(shí)時(shí)同步過程中的數(shù)據(jù)不丟失,主要包括持久化機(jī)制、主從復(fù)制以及哨兵模式。以下是具體的介紹:
持久化機(jī)制
- RDB(Redis Database)持久化:通過創(chuàng)建數(shù)據(jù)集的時(shí)間點(diǎn)快照來保存數(shù)據(jù)。RDB 持久化在指定的時(shí)間間隔內(nèi)將內(nèi)存中的數(shù)據(jù)集快照寫入磁盤,適用于備份和災(zāi)難恢復(fù)場景。
- AOF(Append Only File)持久化:記錄Redis服務(wù)器所執(zhí)行的寫操作命令來記錄數(shù)據(jù)庫狀態(tài)。AOF 持久化通過保存Redis服務(wù)器所執(zhí)行的寫操作命令來記錄數(shù)據(jù)庫狀態(tài),適用于對數(shù)據(jù)丟失有嚴(yán)格要求的應(yīng)用。
- 混合持久化:結(jié)合了 RDB 和 AOF 的優(yōu)點(diǎn),首先以 RDB 格式保存當(dāng)前數(shù)據(jù)狀態(tài),然后繼續(xù)以 AOF 格式記錄新的寫操作,確保數(shù)據(jù)完整性并優(yōu)化恢復(fù)速度。
主從復(fù)制
- 全量復(fù)制:從節(jié)點(diǎn)在啟動(dòng)時(shí),會(huì)向主節(jié)點(diǎn)發(fā)送一個(gè) SYNC 命令,主節(jié)點(diǎn)接收到 SYNC 命令后,會(huì)執(zhí)行 BGSAVE 操作生成 RDB 文件,并將當(dāng)前的偏移量記錄下來,然后主節(jié)點(diǎn)將 RDB 文件和偏移量發(fā)送給從節(jié)點(diǎn),從節(jié)點(diǎn)接收到 RDB 文件后,會(huì)載入到內(nèi)存中,并從偏移量開始進(jìn)行增量復(fù)制。
- 增量復(fù)制:在全量復(fù)制的基礎(chǔ)上,從節(jié)點(diǎn)通過發(fā)送 PING 命令給主節(jié)點(diǎn),攜帶自己當(dāng)前的偏移量,主節(jié)點(diǎn)收到 PING 命令后,會(huì)比較從節(jié)點(diǎn)的偏移量和自己的偏移量,如果從節(jié)點(diǎn)的偏移量小于自己的偏移量,那么主節(jié)點(diǎn)會(huì)將從節(jié)點(diǎn)的偏移量到自己的偏移量之間的數(shù)據(jù)發(fā)送給從節(jié)點(diǎn),從節(jié)點(diǎn)接收到數(shù)據(jù)后,會(huì)將這些數(shù)據(jù)追加到自己的數(shù)據(jù)集中。
- 部分重同步:是 Redis 2.8 版本引入的一種優(yōu)化策略,它結(jié)合了全量復(fù)制和增量復(fù)制的優(yōu)點(diǎn),當(dāng)從節(jié)點(diǎn)啟動(dòng)時(shí),會(huì)向主節(jié)點(diǎn)發(fā)送 PSYNC 命令,攜帶自己當(dāng)前的偏移量和運(yùn)行 ID,主節(jié)點(diǎn)收到 PSYNC 命令后,會(huì)比較從節(jié)點(diǎn)的運(yùn)行 ID 和自己的運(yùn)行 ID,如果相同,則判斷從節(jié)點(diǎn)的偏移量是否在可接受范圍內(nèi)(可接受范圍由 replicapassivelimit 配置項(xiàng)控制),如果在可接受范圍內(nèi),則進(jìn)行部分重同步。
哨兵模式
- 哨兵模式:哨兵模式是一種用于實(shí)現(xiàn) Redis 高可用性的機(jī)制。它通過監(jiān)控主節(jié)點(diǎn)和從節(jié)點(diǎn)的狀態(tài),并在發(fā)現(xiàn)故障時(shí)自動(dòng)進(jìn)行故障轉(zhuǎn)移,確保 Redis 集群在主節(jié)點(diǎn)出現(xiàn)故障時(shí)仍然能夠繼續(xù)提供服務(wù)。
數(shù)據(jù)保護(hù)
- 哨兵模式:哨兵模式通過監(jiān)控主節(jié)點(diǎn)和從節(jié)點(diǎn)的狀態(tài),并在發(fā)現(xiàn)故障時(shí)自動(dòng)進(jìn)行故障轉(zhuǎn)移,確保 Redis 集群在主節(jié)點(diǎn)出現(xiàn)故障時(shí)仍然能夠繼續(xù)提供服務(wù)。哨兵模式是一個(gè)分布式系統(tǒng),可以在一個(gè)架構(gòu)中運(yùn)行多個(gè)哨兵進(jìn)程,可以做到哨兵的高可用。
通過合理配置和使用上述機(jī)制,可以有效地避免 Redis 實(shí)時(shí)同步過程中的數(shù)據(jù)丟失,確保數(shù)據(jù)的安全性和可靠性。