一、措施
當(dāng)向redis主節(jié)點(diǎn)添加從節(jié)點(diǎn)時(shí),可以采取以下措施以最大程度地減少對(duì)主節(jié)點(diǎn)的阻塞和影響:
- 使用初始同步:在添加從節(jié)點(diǎn)之前,可以先使用初始同步功能將主節(jié)點(diǎn)的數(shù)據(jù)復(fù)制到從節(jié)點(diǎn)。這樣,在將從節(jié)點(diǎn)添加到主節(jié)點(diǎn)之前,從節(jié)點(diǎn)已經(jīng)具有與主節(jié)點(diǎn)相同的數(shù)據(jù)集。通過這種方式,可以避免在添加從節(jié)點(diǎn)時(shí)對(duì)主節(jié)點(diǎn)進(jìn)行復(fù)制,減少對(duì)主節(jié)點(diǎn)的阻塞。
- 使用復(fù)制積壓緩沖區(qū):Redis提供了復(fù)制積壓緩沖區(qū)(repl-backlog)的配置選項(xiàng)。通過適當(dāng)調(diào)整該選項(xiàng)的大小,可以在添加從節(jié)點(diǎn)時(shí)允許主節(jié)點(diǎn)保存一定數(shù)量的復(fù)制命令,而不會(huì)阻塞主節(jié)點(diǎn)。復(fù)制積壓緩沖區(qū)可以在一定程度上緩解主節(jié)點(diǎn)與從節(jié)點(diǎn)之間的網(wǎng)絡(luò)延遲和傳輸速率不匹配的問題。
- 配置合理的復(fù)制延遲:可以通過調(diào)整從節(jié)點(diǎn)的復(fù)制延遲(replica-replica-lag)來減輕主節(jié)點(diǎn)的壓力。將復(fù)制延遲設(shè)置為適當(dāng)?shù)闹担梢允箯墓?jié)點(diǎn)稍微滯后于主節(jié)點(diǎn),從而減少對(duì)主節(jié)點(diǎn)的復(fù)制負(fù)載。
- 增加主節(jié)點(diǎn)的資源:如果主節(jié)點(diǎn)的負(fù)載較重,而添加從節(jié)點(diǎn)會(huì)進(jìn)一步加重主節(jié)點(diǎn)的負(fù)擔(dān),可以考慮增加主節(jié)點(diǎn)的資源,如增加內(nèi)存、CPU等。這樣可以提高主節(jié)點(diǎn)的處理能力,使其能夠更好地處理復(fù)制請(qǐng)求和其他客戶端請(qǐng)求。
- 控制并發(fā)復(fù)制連接數(shù):可以通過限制從節(jié)點(diǎn)的并發(fā)復(fù)制連接數(shù),以控制對(duì)主節(jié)點(diǎn)的并發(fā)復(fù)制請(qǐng)求。通過適當(dāng)設(shè)置最大連接數(shù),可以確保主節(jié)點(diǎn)不會(huì)過載。
- 調(diào)整其他復(fù)制相關(guān)參數(shù): 通過加大復(fù)制相關(guān)參數(shù)的值,可以使得在大數(shù)據(jù)量復(fù)制過程中不會(huì)因?yàn)闀r(shí)間過長或數(shù)據(jù)在緩沖區(qū)中被刷掉導(dǎo)致初始化失敗。
二、具體操作
1、配置復(fù)制積壓緩沖區(qū)
通過配置復(fù)制積壓緩沖區(qū)大小,我們可以在添加從節(jié)點(diǎn)時(shí)緩解主從節(jié)點(diǎn)之間的網(wǎng)絡(luò)延遲。
在主節(jié)點(diǎn)的redis.conf文件中添加以下配置:
repl-backlog-size 10mb # 適當(dāng)調(diào)整大小,根據(jù)需求設(shè)置
或 通過config set 命令進(jìn)行設(shè)置。
config set repl-backlog-size 10mb
這個(gè)緩沖區(qū)將保存歷史復(fù)制數(shù)據(jù),確保即使在添加從節(jié)點(diǎn)期間也能保留完整的復(fù)制記錄。
2、配置復(fù)制延遲
調(diào)整從節(jié)點(diǎn)的復(fù)制延遲,以確保從節(jié)點(diǎn)稍微滯后于主節(jié)點(diǎn),減輕主節(jié)點(diǎn)的復(fù)制壓力。執(zhí)行以下命令:
CONFIG SET replica-replica-lag 5 # 適當(dāng)調(diào)整延遲時(shí)間
這樣可以確保從節(jié)點(diǎn)不會(huì)對(duì)主節(jié)點(diǎn)造成過大的負(fù)擔(dān)。
3、增加主節(jié)點(diǎn)資源
如果主節(jié)點(diǎn)負(fù)載較重,考慮增加主節(jié)點(diǎn)的資源。增加內(nèi)存、CPU等可以提高主節(jié)點(diǎn)的處理能力,使其更好地處理復(fù)制請(qǐng)求和其他客戶端請(qǐng)求。不過,在現(xiàn)實(shí)情況下,一般沒有操作空間,因?yàn)橹鲙熘鳈C(jī)在使用,無法擴(kuò)容CPU或內(nèi)存(非絕對(duì),有的虛擬化方式可以做到在線擴(kuò)容)
4、控制并發(fā)復(fù)制連接數(shù)
通過限制從節(jié)點(diǎn)的并發(fā)復(fù)制連接數(shù),可以避免主節(jié)點(diǎn)過載。在從節(jié)點(diǎn)上執(zhí)行以下命令:
CONFIG SET replica-max-replication-jobs 5 # 適當(dāng)調(diào)整連接數(shù)
這有助于確保添加從節(jié)點(diǎn)時(shí)的流量控制,避免對(duì)主節(jié)點(diǎn)的并發(fā)請(qǐng)求過多。
5、從節(jié)點(diǎn)的磁盤寫入延遲
通過配置repl-diskless-sync-delay參數(shù),可以調(diào)整從節(jié)點(diǎn)在同步期間的磁盤寫入頻率。這對(duì)于降低從節(jié)點(diǎn)對(duì)磁盤的寫入負(fù)載很有幫助。
CONFIG SET repl-diskless-sync-delay 5 # 適當(dāng)調(diào)整延遲時(shí)間
6、從節(jié)點(diǎn)的最大內(nèi)存限制
Redis從節(jié)點(diǎn)可以配置一個(gè)最大使用的內(nèi)存量,以確保不會(huì)占用過多系統(tǒng)資源。
CONFIG SET maxmemory 8gb # 適當(dāng)調(diào)整內(nèi)存限制
7、從節(jié)連接超時(shí)時(shí)間設(shè)置
根據(jù)系統(tǒng)的需要,你可能需要調(diào)整從節(jié)點(diǎn)的連接超時(shí)等設(shè)置。
CONFIG SET repl-timeout 60 # 適當(dāng)調(diào)整超時(shí)時(shí)間
8、從節(jié)點(diǎn)檢活時(shí)間修改
repl-ping-slave-period:該參數(shù)定義主節(jié)點(diǎn)定期檢查從節(jié)點(diǎn)是否存活的時(shí)間間隔。增加這個(gè)間隔可能減輕主節(jié)點(diǎn)的負(fù)載,但會(huì)使主從節(jié)點(diǎn)之間的同步變得更加滯后。
CONFIG SET repl-ping-slave-period 60 # 適當(dāng)調(diào)整間隔時(shí)間
9、復(fù)制積壓緩沖區(qū)存活時(shí)間
repl-backlog-ttl:該參數(shù)定義復(fù)制積壓緩沖區(qū)中數(shù)據(jù)的最大存活時(shí)間。適當(dāng)調(diào)整可以在一定程度上控制主從節(jié)點(diǎn)之間的延遲。
CONFIG SET repl-backlog-ttl 3600 # 適當(dāng)調(diào)整 TTL 時(shí)間
10、repl-disable-tcp-nodelay:
默認(rèn)情況下,Redis使用TCP_NODELAY選項(xiàng)來減少傳輸延遲。但在某些情況下,你可能希望禁用這個(gè)選項(xiàng)以減輕網(wǎng)絡(luò)負(fù)擔(dān)。
CONFIG SET repl-disable-tcp-nodelay yes
11、復(fù)制刷盤同步參數(shù)設(shè)置
repl-diskless-sync:在磁盤同步時(shí),Redis默認(rèn)會(huì)寫入一個(gè)臨時(shí)文件。通過啟用磁盤同步,你可以選擇避免寫入磁盤。
CONFIG SET repl-diskless-sync yes
12、從節(jié)點(diǎn)寫入延遲
涉及min-replicas-to-write和min-replicas-max-lag,這兩個(gè)參數(shù)用于在高可用性(HA)設(shè)置中,定義最小數(shù)量的從節(jié)點(diǎn)確認(rèn)寫入操作以及最大的允許延遲。
CONFIG SET min-replicas-to-write 3
CONFIG SET min-replicas-max-lag 10
三、建議
Redis 單個(gè)實(shí)例內(nèi)存使用過大可能會(huì)導(dǎo)致系統(tǒng)性能下降,甚至影響整個(gè)系統(tǒng)的穩(wěn)定性。以下是一些方式可以避免Redis單個(gè)實(shí)例內(nèi)存使用過大:
- 設(shè)置合理的過期時(shí)間:如果你的數(shù)據(jù)集中有很多過期的鍵,確保設(shè)置了合理的過期時(shí)間,以便Redis可以自動(dòng)清理不再需要的鍵。使用 EXPIRE 命令或在 SET 命令中添加 EX 選項(xiàng)來設(shè)置過期時(shí)間。
- 優(yōu)化數(shù)據(jù)結(jié)構(gòu):選擇適當(dāng)?shù)臄?shù)據(jù)結(jié)構(gòu),以減小存儲(chǔ)空間。例如,如果可以使用 HASH 代替 STRING,或者使用 ZSET 代替 SET,就可以有效地減小內(nèi)存占用。
- 使用合理的數(shù)據(jù)存儲(chǔ)方式:使用 HASH 或 ZSET 等數(shù)據(jù)結(jié)構(gòu)存儲(chǔ)多個(gè)相關(guān)字段,而不是使用多個(gè)獨(dú)立的 STRING 類型。這可以減少內(nèi)存的開銷。
- 啟用壓縮功能:Redis 6.0 以后的版本支持對(duì)字符串進(jìn)行壓縮。啟用壓縮可以減小存儲(chǔ)空間,特別是當(dāng)存儲(chǔ)的是文本數(shù)據(jù)時(shí)。
# 在redis.conf文件中啟用壓縮
activate-key-compression yes
- 分片(Sharding):將數(shù)據(jù)分散到多個(gè)Redis實(shí)例中,以減小每個(gè)實(shí)例的內(nèi)存使用。這種方式需要對(duì)應(yīng)用程序進(jìn)行修改以支持分片。
- 使用內(nèi)存淘汰策略:Redis 提供了多種內(nèi)存淘汰策略,例如 volatile-lru、allkeys-lru、volatile-ttl 等。選擇適合你業(yè)務(wù)場(chǎng)景的淘汰策略,確保及時(shí)清理不再需要的鍵。
- 限制每個(gè)數(shù)據(jù)集的大小:設(shè)置 maxmemory 參數(shù),限制Redis使用的內(nèi)存總量。當(dāng)內(nèi)存達(dá)到這個(gè)限制時(shí),Redis會(huì)根據(jù)所配置的淘汰策略自動(dòng)刪除一些鍵。
# 在redis.conf文件中設(shè)置最大內(nèi)存限制
maxmemory 8gb
- 做好監(jiān)控和優(yōu)化:定期監(jiān)控Redis的內(nèi)存使用情況,使用Redis自帶的 INFO 命令或者監(jiān)控工具。根據(jù)監(jiān)控結(jié)果,及時(shí)采取優(yōu)化措施。






