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