Redis 集群模式優(yōu)化和備份策略
現(xiàn)有系統(tǒng)環(huán)境
- 操作系統(tǒng):Rocky Linux release 9.5
- 內(nèi)存:16G
- CPU:8核心
- SSD 存儲(chǔ)
系統(tǒng)參數(shù)調(diào)優(yōu)建議
內(nèi)存管理
vm.swappiness
將vm.swappiness降低,以減少對 swap 的依賴。默認(rèn)值是較高(通常 60),可以調(diào)成10或5,根據(jù)你的工作負(fù)載決定。較低值能使系統(tǒng)更傾向于使用內(nèi)存,而不是 swap。
vm.swappiness=10
永久設(shè)置可以寫入 /etc/sysctl.d/99-sysctl.conf 或者 /etc/sysctl.conf。
vm.dirty_ratio和vm.dirty_background_ratio
控制內(nèi)核將多少臟頁 (dirty pages) 寫回磁盤。對于 SSD,可以適當(dāng)調(diào)高,以減少頻繁的寫回,但也不能太高。
例如:
vm.dirty_background_ratio = 5 vm.dirty_ratio = 20
這兩個(gè)值需要結(jié)合實(shí)際 I/O 壓力測試。
關(guān)閉或限制 swap(視具體情況)
- 如果應(yīng)用對內(nèi)存需求很大、且對 swap 延遲敏感,可以考慮關(guān)閉 swap(
swapoff+從 fstab 移除 swap)。 - 或者使用 zram(壓縮內(nèi)存)來代替 swap。
- 如果應(yīng)用對內(nèi)存需求很大、且對 swap 延遲敏感,可以考慮關(guān)閉 swap(
文件句柄 & 進(jìn)程數(shù)
fs.file-max
提高系統(tǒng)能打開的最大文件描述符數(shù)
fs.file-max = 2000000
這個(gè)值要根據(jù)并發(fā)連接數(shù)和負(fù)載調(diào)整。
- 用戶級別的 file descriptors
修改/etc/security/limits.d/下的配置(例如99-nofile.conf),對于服務(wù)賬號 (如應(yīng)用進(jìn)程) 提高nofile限制。
網(wǎng)絡(luò) / TCP 調(diào)優(yōu)
net.core.somaxconn
增加監(jiān)聽 socket 的 backlog 隊(duì)列長度。
net.core.somaxconn = 1024
net.ipv4.tcp_fin_timeout
調(diào)低 TIME_WAIT 狀態(tài)持續(xù)時(shí)間(視場景慎用)
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_tw_reuse
允許重用處于 TIME_WAIT 的 TCP socket
net.ipv4.tcp_tw_reuse = 1
- 接收 / 發(fā)送緩沖區(qū)
可以適當(dāng)調(diào)大rmem和wmem:
net.core.rmem_default = 262144 net.core.wmem_default = 262144 net.core.rmem_max = 16777216 net.core.wmem_max = 16777216 net.ipv4.tcp_rmem = 4096 87380 16777216 net.ipv4.tcp_wmem = 4096 65536 16777216
CPU 調(diào)度與頻率
- CPU 調(diào)頻策略 (governor)
根據(jù)負(fù)載選擇合適的調(diào)頻策略 (governor),例如performance(高性能) 或schedutil/ondemand。如果負(fù)載是較為穩(wěn)定且追求響應(yīng)性,可以設(shè)置為performance。
# 安裝 cpupower(如果還沒裝) dnf install kernel-tools # 設(shè)置 governor cpupower frequency-set --governor performance
- CPU 親和性 (Affinity)
- 對關(guān)鍵服務(wù) (應(yīng)用進(jìn)程 /關(guān)鍵線程) 設(shè)置 CPU 親和性 (affinity),使它們跑在專門的核心上,減少調(diào)度開銷。
- 調(diào)度器調(diào)優(yōu) (Scheduler)
- 默認(rèn) Linux 調(diào)度器 (CFS)對大多數(shù)場景不錯(cuò)。如果有特殊實(shí)時(shí)或延遲敏感任務(wù),可以深入調(diào)度器參數(shù) (但風(fēng)險(xiǎn)較高)
I/O 子系統(tǒng) (SSD) 優(yōu)化
- I/O 調(diào)度器 (Scheduler)
對于 SSD (尤其是 NVMe),推薦使用noop或mq-deadline等輕量調(diào)度器或者直接使用none(如果硬件和內(nèi)核版本支持)。其實(shí)在現(xiàn)代內(nèi)核中,NVMe 的默認(rèn)調(diào)度器就非常高效。
echo none > /sys/block/nvme0n1/queue/scheduler
(替換為實(shí)際使用的設(shè)備名)
- 隊(duì)列深度 (nr_requests / queue_depth)
- 可以調(diào)優(yōu)每個(gè)塊設(shè)備的 I/O 隊(duì)列深度 (取決于硬件)。
- 刷盤 (flush) 策略
- 根據(jù)你的 SSD 特性和寫負(fù)載,可以調(diào)整
dirty_*參數(shù)(見上文)以控制內(nèi)核何時(shí)將緩存寫回磁盤。
- 根據(jù)你的 SSD 特性和寫負(fù)載,可以調(diào)整
- 文件系統(tǒng)選擇與掛載選項(xiàng)
- 如果使用 XFS / EXT4 /其他文件系統(tǒng),掛載時(shí)選擇適合 SSD 的 mount 參數(shù) (如
noatime,nodiratime)。 - 可以考慮啟用 discard / fstrim (手動(dòng)或定時(shí)),但 discard 對性能的影響依設(shè)備而異。
- 如果使用 XFS / EXT4 /其他文件系統(tǒng),掛載時(shí)選擇適合 SSD 的 mount 參數(shù) (如
日志 & 服務(wù)調(diào)優(yōu)
- 關(guān)閉或禁用不必要的 systemd 服務(wù)
- 用
systemd-analyze blame查看啟動(dòng)和運(yùn)行時(shí)開銷,禁用不必要的服務(wù)。
- 用
- 日志輪詢 /日志級別
- 如果日志非常頻繁 (例如大量
rsyslog或journal),考慮減少日志寫頻率或級別。長期高頻日志會(huì)對 SSD 寫入造成壓力。
- 如果日志非常頻繁 (例如大量
整理參數(shù)
一定要先備份自己系統(tǒng)當(dāng)前的參數(shù)在修改,萬一有問題方便回退。
# /etc/sysctl.d/99-performance.conf # === 內(nèi)存管理 === vm.swappiness = 10 vm.dirty_ratio = 20 vm.dirty_background_ratio = 5 # 可能還加 dirty_expire / writeback,根據(jù)具體測試調(diào)優(yōu) # vm.dirty_expire_centisecs = 500 # vm.dirty_writeback_centisecs = 100 # 可選:如果你知道內(nèi)存不是特別緊張,可設(shè)置 overcommit # vm.overcommit_memory = 1 # === 文件句柄限制 === fs.file-max = 2000000 # === 網(wǎng)絡(luò) / TCP 參數(shù) === net.core.somaxconn = 8192 # 監(jiān)聽 backlog net.core.netdev_max_backlog = 50000 # 接收 / 發(fā)送緩沖 net.core.rmem_default = 262144 net.core.wmem_default = 262144 net.core.rmem_max = 16777216 net.core.wmem_max = 16777216 net.ipv4.tcp_rmem = 4096 87380 16777216 net.ipv4.tcp_wmem = 4096 65536 16777216 # TIME_WAIT 和連接重用 net.ipv4.tcp_fin_timeout = 30 net.ipv4.tcp_tw_reuse = 1 # Keepalive net.ipv4.tcp_keepalive_time = 600 net.ipv4.tcp_keepalive_intvl = 30 net.ipv4.tcp_keepalive_probes = 3 # 網(wǎng)絡(luò)安全相關(guān) kernel.sysrq = 0 net.ipv4.ip_forward = 0 net.ipv4.conf.all.send_redirects = 0 net.ipv4.conf.default.send_redirects = 0 net.ipv4.conf.all.accept_source_route =0 net.ipv4.conf.default.accept_source_route = 0 net.ipv4.conf.all.accept_redirects = 0 net.ipv4.conf.default.accept_redirects = 0 net.ipv4.conf.all.secure_redirects = 0 net.ipv4.conf.default.secure_redirects = 0 net.ipv4.icmp_echo_ignore_broadcasts = 1 net.ipv4.icmp_ignore_bogus_error_responses = 1 net.ipv4.conf.all.rp_filter = 1 net.ipv4.conf.default.rp_filter = 1 net.ipv4.tcp_syncookies = 1 kernel.dmesg_restrict = 1 net.ipv6.conf.all.accept_redirects = 0 net.ipv6.conf.default.accept_redirects = 0 kernel.threads-max = 655350 # === 其他網(wǎng)絡(luò) /系統(tǒng)選項(xiàng) === # 可以根據(jù)需要打開更多,但這里是基礎(chǔ)
應(yīng)用這個(gè)配置
sysctl --system
參數(shù)說明
- 上面 sysctl 設(shè)置中,
vm.swappiness=10是為了讓系統(tǒng)盡量少用 swap。 - Redis 的
maxmemory設(shè)置 (12 GB) 是示例,根據(jù) Redis 實(shí)例所在機(jī)器上同時(shí)運(yùn)行的其他進(jìn)程 +操作系統(tǒng)需求來決定。如果 Redis 是主要服務(wù),可以設(shè)置得更高,但建議不要占用所有內(nèi)存。 allkeys-lru淘汰策略是業(yè)界常用策略,適合緩存 +熱點(diǎn)數(shù)據(jù)混合類型場景。lazyfree-lazy-eviction等異步釋放設(shè)置,可以減少 Redis 主線程因內(nèi)存回收 (刪除大對象) 的阻塞。- AOF 重寫策略 (
auto-aof-rewrite-percentage和min-size) 設(shè)置,能平衡磁盤寫入和文件大小。 hz參數(shù) (心跳 /后臺任務(wù)頻率) 控制周期性后臺任務(wù) (如過期檢查) 的頻率。調(diào)高可以更快響應(yīng)但會(huì)增加 CPU 開銷。
注意事項(xiàng)
- 過度調(diào)優(yōu)風(fēng)險(xiǎn):如果參數(shù)設(shè)置不當(dāng)(如非常低的
swappiness或非常高的dirty_ratio),可能導(dǎo)致系統(tǒng)內(nèi)存壓力過大或頻繁寫盤。 - SSD 寫壽命:調(diào)高內(nèi)存中的 “臟頁” 寫回策略會(huì)增加寫量,需要權(quán)衡。
- 系統(tǒng)穩(wěn)定性:部分調(diào)優(yōu) (如 CPU governor 改為 performance) 會(huì)增加功耗和溫度,需要監(jiān)控硬件狀態(tài)。
- 版本兼容性:不同內(nèi)核版本 (RHEL / Rocky) 對某些內(nèi)核參數(shù)的默認(rèn)值或支持可能不一樣,調(diào)優(yōu)前要確認(rèn)。
- 監(jiān)控覆蓋盲點(diǎn):調(diào)優(yōu)后必須有監(jiān)控和報(bào)警機(jī)制,以便及時(shí)發(fā)現(xiàn)調(diào)優(yōu)帶來的副作用。
Redis 應(yīng)用參數(shù)調(diào)優(yōu)建議
調(diào)優(yōu)方案
- 集群模式:Redis Cluster
- 節(jié)點(diǎn):6 節(jié)點(diǎn) —— 3 主 + 3 從
- 每節(jié)點(diǎn)資源:16 GB 內(nèi)存,8 核 CPU
- 業(yè)務(wù)特性:混合讀寫,讀略多于寫;有較大的緩存空間需求;容許偶爾 key 淘汰(cache 模式)
- 持久化需求:需要 AOF + RDB 混合以兼顧數(shù)據(jù)持久性和恢復(fù)速度
具體配置建議
下面是建議寫入 redis.conf
| 配置 | 建議值 / 設(shè)置 | 說明與理由 | |
|---|---|---|---|
maxmemory | 大約 48 GB(64 GB 節(jié)點(diǎn)的 ~75%) | 留出一部分給操作系統(tǒng) + fork 過程中的開銷。 | |
maxmemory-policy | allkeys-lru | 選擇 LRU 淘汰策略,以便在滿內(nèi)存時(shí)清除最少使用的 key。 | |
maxmemory-samples | 5 | 控制 LRU 近似采樣的樣本數(shù),默認(rèn)是 5,通常夠用。 | |
lazyfree-lazy-eviction | yes | 使用后臺異步釋放內(nèi)存(異步刪除),減少主線程停頓。 | |
lazyfree-lazy-expire | yes | 異步過期 key 的內(nèi)存釋放。 | |
appendonly | yes | 啟用 AOF。保證持久性。 | |
appendfsync | everysec | 每秒 fsync,一般來說在可靠性與性能之間是一個(gè)比較好的折中。 | |
auto-aof-rewrite-percentage | 100 | 當(dāng) AOF 大小增長到 100%(翻倍)時(shí)觸發(fā)重寫。這個(gè)值可根據(jù)實(shí)際 AOF 增長速度調(diào)整。 | |
auto-aof-rewrite-min-size | 64mb | 最小 AOF 重寫大小限制(避免過小文件頻繁重寫) | |
aof-load-truncated | yes | 啟動(dòng)時(shí)如果 AOF 被截?cái)?,可以繼續(xù)加載(更健壯)。 ([codingnote.cc][3]) | |
lua-time-limit | 5000(ms) | 限制 Lua 腳本最大執(zhí)行時(shí)間,防止長腳本阻塞。 | |
| 集群相關(guān) | |||
cluster-enabled | yes | 開啟集群。 | |
cluster-config-file | nodes.conf(具體路徑根據(jù)部署) | 保存集群節(jié)點(diǎn)配置。 | |
cluster-node-timeout | 15000(ms) | 節(jié)點(diǎn)互連超時(shí)閾值,較常用值。 | |
cluster-replica-validity-factor | 10(默認(rèn)或視情況設(shè)) | 決定從節(jié)點(diǎn)是否有資格做 failover(與 node-timeout 和 ping 周期有關(guān))。 | |
cluster-migration-barrier | 1 | 控制當(dāng)主節(jié)點(diǎn)只有一個(gè)從節(jié)點(diǎn)時(shí),從節(jié)點(diǎn)是否可以遷移到其他主上。 | |
cluster-require-full-coverage | no | 即使某些 slot 沒覆蓋,也允許讀寫,提升容錯(cuò)性。 | |
| 網(wǎng)絡(luò) & 性能 | |||
timeout | 3000(秒或 ms,根據(jù)版本) | 客戶端連接超時(shí)設(shè)置(視具體版本配置) | |
tcp-keepalive | 60 | 保持空閑連接,避免連接過早關(guān)閉。 | |
| 慢日志 | slowlog-log-slower-than | 比如 10000(微秒或微秒級,視版本) | 記錄慢命令,有助于調(diào)優(yōu)。 |
slowlog-max-len | 128 | 保存慢日志條數(shù)上限。 | |
| 數(shù)據(jù)結(jié)構(gòu)內(nèi)存優(yōu)化 | |||
hash-max-ziplist-entries / hash-max-ziplist-value | 512 / 64(示例) | 對小 hash 使用 ziplist 編碼節(jié)省內(nèi)存。類似配置常見于實(shí)踐。 ([CNDBA][4]) | |
list-max-ziplist-entries / list-max-ziplist-value | 512 / 64 | 同上,對 list 優(yōu)化。 | |
| 客戶端 & 連接 | |||
| 使用連接池 | 是 | 建議客戶端使用連接池(如 JedisPool、Lettuce 等),避免頻繁建立連接。 | |
| 使用 Pipeline(批量命令) | 是 | 減少往返開銷。 | |
| 命令建模 | |||
避免 KEYS * | 使用 SCAN | KEYS 是阻塞命令,在大數(shù)據(jù)量下嚴(yán)重影響性能。 | |
| 優(yōu)化 Lua 腳本 | 簡短、快速 | 防止腳本阻塞主線程,特別是在集群中。 |
Redis 配置整理
######################################## # Redis 性能 +集群 配置示例 # 這個(gè)配置文件只做參考 不能直接拿來用 Redis 是不允許再參數(shù)后買你添加注釋的直接使用會(huì)報(bào)錯(cuò) ######################################## # 內(nèi)存管理 maxmemory 12gb # 假設(shè)節(jié)點(diǎn)內(nèi)存 16G,為 Redis 留約 12G maxmemory-policy allkeys-lru # 使用 LRU 淘汰所有鍵(適合緩存 + 數(shù)據(jù)混合場景) maxmemory-samples 5 # 延遲釋放 lazyfree-lazy-eviction yes lazyfree-lazy-expire yes lazyfree-lazy-server-del yes # 持久化 (RDB + AOF) appendonly yes appendfilename "appendonly.aof" appendfsync everysec no-appendfsync-on-rewrite no auto-aof-rewrite-percentage 100 auto-aof-rewrite-min-size 64mb aof-load-truncated yes # RDB 快照 (可根據(jù)需要) save 900 1 save 300 10 save 60 10000 # 集群配置 (如果是 Redis Cluster) cluster-enabled yes cluster-config-file nodes.conf cluster-node-timeout 15000 cluster-replica-validity-factor 10 cluster-migration-barrier 1 cluster-require-full-coverage no # 性能 /調(diào)度相關(guān) hz 10 dynamic-hz yes # Lua 腳本執(zhí)行限制 lua-time-limit 5000 # 毫秒 # 慢日志 (監(jiān)控慢命令) slowlog-log-slower-than 10000 # 微秒 (10 ms) — 根據(jù)業(yè)務(wù)調(diào)整 slowlog-max-len 128 # 內(nèi)存碎片 / 編碼優(yōu)化 hash-max-ziplist-entries 512 hash-max-ziplist-value 64 list-max-ziplist-entries 512 list-max-ziplist-value 64 zset-max-ziplist-entries 128 zset-max-ziplist-value 64 # 安全性 (可選,根據(jù)場景啟用) # requirepass yourpassword # rename-command FLUSHALL "" # 其他 (可選,根據(jù)需求) notify-keyspace-events ""
注意事項(xiàng)
- fork 延遲風(fēng)險(xiǎn):RDB 快照或 AOF 重寫時(shí)會(huì) fork,如果數(shù)據(jù)量很大,fork 可能占用大量內(nèi)存 + 導(dǎo)致延遲波動(dòng)。
- 內(nèi)存碎片:頻繁刪除 / 寫入大對象可能導(dǎo)致內(nèi)存碎片化。要監(jiān)控
used_memory_rssvsused_memory。 - AOF 重寫失敗:如果磁盤 I/O 不夠快,重寫可能失敗或耗時(shí)過長。
- 誤配置淘汰策略:如果設(shè)置不當(dāng)(例如
noeviction),可能寫入失?。∣OM),或策略太激進(jìn)導(dǎo)致重要數(shù)據(jù)被淘汰。 - 客戶端不 cluster-aware:如果客戶端不是集群感知 (cluster-aware),可能頻繁
MOVED重定向,影響性能。 - 監(jiān)控盲點(diǎn):如果沒有全面監(jiān)控,可能看不出調(diào)優(yōu)的負(fù)面影響(如重寫延遲、failover 異常、內(nèi)存碎片)。
Redis 備份
優(yōu)先備份主節(jié)點(diǎn)
- 只對主節(jié)點(diǎn) (master) 做快照 /持久化備份,因?yàn)楦北?(replica) 節(jié)點(diǎn)上只是復(fù)制,備份主節(jié)點(diǎn)就可以恢復(fù)完整數(shù)據(jù)。
使用 RDB (快照) + AOF 組合
- RDB 用于周期性冷備 (point-in-time snapshot)。
- AOF 用于更高的數(shù)據(jù)持久性 (命令日志),減少數(shù)據(jù)丟失窗口。
- 混合使用可以兼顧恢復(fù)速度 (RDB) 和數(shù)據(jù)完整性 (AOF)
定期觸發(fā) BGREWRITEAOF 與 BGSAVE
- 對 AOF 做重寫 (rewrite),防止日志無限增長。
- 對 RDB 做快照 (BGSAVE),用于冷備
備份文件長期保留與版本管理
- 將 RDB/AOF 備份文件復(fù)制 /歸檔到異地存儲(chǔ) (如 NAS、對象存儲(chǔ))。
- 為備份文件打時(shí)間戳 /版本,方便恢復(fù)時(shí)回滾。
校驗(yàn)與恢復(fù)演練
- 使用
redis-check-aof/redis-check-rdb工具校驗(yàn)備份文件健康性 - 定期做恢復(fù)演練 (集群恢復(fù)、單節(jié)點(diǎn)恢復(fù)) 以驗(yàn)證備份策略有效。
操作方法
獲取主節(jié)點(diǎn)列表
獲取所有主節(jié)點(diǎn)
/usr/local/redis/bin/redis-cli -h 192.168.1.11 -p 6379 -a ugwFsSNuzgS4e62e CLUSTER NODES|grep master | grep -v "fail" | awk '{print $2}' | cut -d@ -f1這條命令會(huì)列出所有 master 節(jié)點(diǎn)的
備份所有主節(jié)點(diǎn) RDB和AOF
注意:此腳本需要現(xiàn)在測試環(huán)境中測試沒問題 再拿到生產(chǎn)環(huán)境中使用。
#!/bin/bash
REDIS_IP="192.168.1.11" # 任意一個(gè)集群節(jié)點(diǎn)(用于獲取節(jié)點(diǎn)列表)
REDIS_PORT="6379"
REDIS_PWD="ugwFsSNuzgS4e62e"
BACKUP_DIR="/root/backup/"
TIMEOUT=300
mkdir -p "$BACKUP_DIR" || { echo "ERROR: 無法創(chuàng)建備份目錄 $BACKUP_DIR"; exit 1; }
# 獲取所有 master 節(jié)點(diǎn)
nodes=$(redis-cli -c -h "$REDIS_IP" -p "$REDIS_PORT" -a "$REDIS_PWD" CLUSTER NODES | \
grep master | grep -v fail | awk '{print $2}' | cut -d@ -f1)
for node in $nodes; do
ip=$(echo "$node" | cut -d: -f1)
port=$(echo "$node" | cut -d: -f2)
echo "=== 開始備份:Redis 節(jié)點(diǎn) $ip:$port ==="
# 觸發(fā) BGSAVE (RDB)
redis-cli -h "$ip" -p "$port" -a "$REDIS_PWD" BGSAVE
if [ $? -ne 0 ]; then
echo "WARNING: BGSAVE 在 $ip:$port 執(zhí)行失敗"
fi
# 等待 BGSAVE 完成
start_time=$(date +%s)
while true; do
inprog=$(redis-cli -h "$ip" -p "$port" -a "$REDIS_PWD" INFO persistence | \
grep rdb_bgsave_in_progress | cut -d: -f2 | tr -d '\r')
if [ "$inprog" = "0" ]; then
echo "BGSAVE 完成:$ip:$port"
break
fi
now=$(date +%s)
elapsed=$(( now - start_time ))
if [ $elapsed -gt $TIMEOUT ]; then
echo "ERROR: BGSAVE 超時(shí) ($elapsed 秒) 在 $ip:$port" >&2
break
fi
echo "等待 BGSAVE 完成 ($elapsed 秒) ..."
sleep 5
done
# 獲取 RDB 文件路徑
DIR=$(redis-cli -h "$ip" -p "$port" -a "$REDIS_PWD" CONFIG GET dir | awk 'NR==2')
DBFILE=$(redis-cli -h "$ip" -p "$port" -a "$REDIS_PWD" CONFIG GET dbfilename | awk 'NR==2')
src_rdb="${DIR}/${DBFILE}"
if [ ! -f "$src_rdb" ]; then
echo "ERROR: 未找到 RDB 文件: $src_rdb" >&2
else
dst_rdb="${BACKUP_DIR}/${ip}_${port}_$(date +%Y%m%d_%H%M%S).rdb"
cp "$src_rdb" "$dst_rdb" && echo "RDB 備份保存到 $dst_rdb"
fi
aof_enabled=$(redis-cli -h "$ip" -p "$port" -a "$REDIS_PWD" CONFIG GET appendonly | awk 'NR==2')
if [ "$aof_enabled" = "yes" ]; then
AOFDIR=$(redis-cli -h "$ip" -p "$port" -a "$REDIS_PWD" CONFIG GET appenddirname | awk 'NR==2')
AOFNAME=$(redis-cli -h "$ip" -p "$port" -a "$REDIS_PWD" CONFIG GET appendfilename | awk 'NR==2')
if [ -z "$AOFDIR" ]; then
src_aof="${DIR}/${AOFNAME}"
if [ -f "$src_aof" ]; then
dst_aof="${BACKUP_DIR}/${ip}_${port}_$(date +%Y%m%d_%H%M%S).aof"
cp "$src_aof" "$dst_aof" && echo "AOF 備份保存到 $dst_aof"
else
echo "ERROR: AOF 文件未找到: $src_aof" >&2
fi
else
# Multi-Part AOF 模式 (Redis 7+)
aof_dir_full="${DIR}/${AOFDIR}"
if [ -d "$aof_dir_full" ]; then
dst_mp_dir="${BACKUP_DIR}/${ip}_${port}_AOF_$(date +%Y%m%d_%H%M%S)"
mkdir -p "$dst_mp_dir"
cp "${aof_dir_full}"/* "$dst_mp_dir"/ && echo "MP-AOF 備份到 $dst_mp_dir"
else
echo "ERROR: AOF 目錄不存在: $aof_dir_full" >&2
fi
fi
else
echo "AOF 未啟用在 $ip:$port,跳過 AOF 備份"
fi
done
echo "=== 所有節(jié)點(diǎn)備份完成 ==="Redis 集群恢復(fù) (恢復(fù) / 回滾) 操作命令
單節(jié)點(diǎn)恢復(fù)
- 停止要恢復(fù)的節(jié)點(diǎn)
# 或者停止對應(yīng)的 Redis 服務(wù) / systemd 單元 redis-cli -h <ip> -p <port> SHUTDOWN
- 將備份文件 (RDB / AOF) 放回該節(jié)點(diǎn)的數(shù)據(jù)目錄
cp /backup/redis/cluster/<ip>_<port>_YYYYMMDD_HHMMSS.rdb /var/lib/redis/$port/dump.rdb # 如果是 aof cp /backup/redis/cluster/<ip>_<port>_YYYYMMDD_HHMMSS.aof /var/lib/redis/$port/appendonly.aof
- 設(shè)置正確權(quán)限
確保文件所有者和權(quán)限與 Redis 進(jìn)程一致,比如:
chown redis:redis /var/lib/redis/$port/dump.rdb chown redis:redis /var/lib/redis/$port/appendonly.aof
- 啟動(dòng) Redis 節(jié)點(diǎn)
- 啟動(dòng) Redis,查看日志確認(rèn)是否加載了 RDB / AOF。
- 如果優(yōu)先加載 AOF:在 redis.conf 中
appendonly yes,那么 Redis 啟動(dòng)時(shí)會(huì)優(yōu)先用 AOF 恢復(fù)- 如果你先還原 RDB,再開 AOF,可以臨時(shí)關(guān)閉 AOF,加載 RDB 后再打開
具體命令 (如果是 systemd):
systemctl start redis
- (可選)觸發(fā) BGREWRITEAOF
redis-cli -h <ip> -p <port> BGREWRITEAOF
集群級恢復(fù) /重新加入集群
恢復(fù)一個(gè)節(jié)點(diǎn)之后,如果這個(gè)節(jié)點(diǎn)之前屬于集群 (有 slot),你需要讓它重新加入 (如果它是孤立恢復(fù)):
- 與集群中的一個(gè)存活節(jié)點(diǎn)做
CLUSTER MEET
redis-cli -h <恢復(fù)節(jié)點(diǎn) IP> -p <恢復(fù)節(jié)點(diǎn) 端口> CLUSTER MEET <任意健康節(jié)點(diǎn) IP> <端口>
- 確認(rèn)節(jié)點(diǎn)狀態(tài)
在恢復(fù)節(jié)點(diǎn)上運(yùn)行:
redis-cli -h <恢復(fù)節(jié)點(diǎn) IP> -p <恢復(fù)端口> CLUSTER NODES
看它是否成為了集群的一員 (節(jié)點(diǎn)狀態(tài)應(yīng)該是 slave 或 master 等)。
- 如果恢復(fù)的是主節(jié)點(diǎn),并且有 slot,需要重新分配 slot
- 如果是原來的 master,要把 slot 分回去 (如果 slot 被遷移了)。
- 使用
redis-cli --cluster reshard進(jìn)行 slot 重分布 (reshard):將部分 slot 從其他節(jié)點(diǎn)遷移給該節(jié)點(diǎn)。
redis-cli --cluster reshard <一個(gè)集群節(jié)點(diǎn) IP:端口> --from <其他節(jié)點(diǎn)列表,用逗號分隔> --to <恢復(fù)節(jié)點(diǎn) id> --slots <slot 數(shù)量> --yes
注意事項(xiàng)
- 恢復(fù)時(shí)間:如果集群節(jié)點(diǎn)很多、數(shù)據(jù)量大,恢復(fù) (尤其是 AOF 重寫) 可能比較慢。
- 數(shù)據(jù)一致性:如果只是用 RDB 快照恢復(fù),可能丟失最后一次快照后的寫入。AOF 可以減少但也不能保證零丟失 (取決于
appendfsync策略)。 - 重寫 (rewrite) 期間性能影響:AOF 重寫是 fork 子進(jìn)程,會(huì)占用內(nèi)存和 CPU。
- 磁盤空間:備份 RDB + AOF 文件可能占用大量磁盤空間,備份存儲(chǔ)要規(guī)劃好。
- 安全:備份文件 (RDB / AOF) 本身也很敏感,應(yīng)保證備份存儲(chǔ)路徑權(quán)限、安全傳輸 (如 SFTP、對象存儲(chǔ)加密)。
到此這篇關(guān)于Redis 集群模式優(yōu)化和備份的文章就介紹到這了,更多相關(guān)redis 集群模式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python腳本實(shí)現(xiàn)Redis未授權(quán)批量提權(quán)
這篇文章主要給大家介紹了關(guān)于利用python腳本實(shí)現(xiàn)redis未授權(quán)批量提權(quán)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2017-09-09
解讀Redis秒殺優(yōu)化方案(阻塞隊(duì)列+基于Stream流的消息隊(duì)列)
該文章介紹了使用Redis的阻塞隊(duì)列和Stream流的消息隊(duì)列來優(yōu)化秒殺系統(tǒng)的方案,通過將秒殺流程拆分為兩條流水線,使用Redis緩存緩解數(shù)據(jù)庫壓力,并結(jié)合Lua腳本進(jìn)行原子性判斷,使用阻塞隊(duì)列和消息隊(duì)列異步處理訂單,有效提高了系統(tǒng)的并發(fā)處理能力和可用性2025-02-02
Redis集群節(jié)點(diǎn)通信過程/原理流程分析
這篇文章主要介紹了Redis集群節(jié)點(diǎn)通信過程/原理,詳細(xì)介紹了Cluster(集群)的節(jié)點(diǎn)通信的流程,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-03-03
Redis客戶端連接遠(yuǎn)程Redis服務(wù)器方式
這篇文章主要介紹了Redis客戶端連接遠(yuǎn)程Redis服務(wù)器方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-06-06

