一文解決Redis后臺(tái)持久化失敗的問(wèn)題:內(nèi)存不足導(dǎo)致fork失敗
解決 Redis 后臺(tái)持久化失敗的問(wèn)題:內(nèi)存不足導(dǎo)致 fork 失敗
在生產(chǎn)環(huán)境中,有時(shí)你可能會(huì)在 Redis 日志中看到類似如下的錯(cuò)誤信息:
WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
本文將詳細(xì)介紹該問(wèn)題的原因以及如何通過(guò)調(diào)整內(nèi)核和 Redis 配置來(lái)解決此問(wèn)題。
問(wèn)題背景與成因
Redis 作為一個(gè)內(nèi)存數(shù)據(jù)庫(kù),在執(zhí)行后臺(tái)持久化(例如 BGSAVE 命令時(shí))需要 fork 一個(gè)子進(jìn)程來(lái)生成數(shù)據(jù)庫(kù)快照(RDB 文件)。在 fork 過(guò)程中,操作系統(tǒng)需要為子進(jìn)程分配與父進(jìn)程相同大小的內(nèi)存空間,盡管實(shí)際使用了 copy-on-write 技術(shù),但操作系統(tǒng)依然會(huì)預(yù)留相應(yīng)的虛擬內(nèi)存空間。
當(dāng)內(nèi)核參數(shù) vm.overcommit_memory
設(shè)置為 0(默認(rèn)值)時(shí),系統(tǒng)會(huì)在 fork 前檢查是否有足夠的物理內(nèi)存和 swap 空間可用。如果可用內(nèi)存不足,即使當(dāng)前看起來(lái)內(nèi)存空閑量還不錯(cuò),fork 操作也可能會(huì)失敗,從而導(dǎo)致 RDB 快照生成失敗,Redis 會(huì)報(bào)出上述警告信息,甚至在持久化失敗后停止接受寫(xiě)入,存在數(shù)據(jù)丟失風(fēng)險(xiǎn) .
解決方案
針對(duì)這個(gè)問(wèn)題,我們主要有以下幾種解決辦法:
修改內(nèi)核參數(shù) vm.overcommit_memory
通過(guò)將 vm.overcommit_memory
設(shè)置為 1,可以讓 Linux 內(nèi)核在執(zhí)行 fork 時(shí)更樂(lè)觀地分配內(nèi)存,即使當(dāng)前物理內(nèi)存不足也允許 fork 成功。
操作步驟如下:
臨時(shí)修改(重啟后失效):
echo 1 > /proc/sys/vm/overcommit_memory
永久修改:
編輯 /etc/sysctl.conf
文件,添加或修改如下行:
vm.overcommit_memory = 1
保存后,運(yùn)行以下命令使配置生效:
sysctl -p
這種方法適用于所有運(yùn)行在該主機(jī)上的 Redis 實(shí)例(注意:在 Docker 環(huán)境下,vm.overcommit_memory
是宿主機(jī)級(jí)別的設(shè)置。
增加系統(tǒng)內(nèi)存或 Swap 空間
如果你的服務(wù)器物理內(nèi)存不足,也可以考慮增加物理內(nèi)存或配置更大的 Swap 區(qū)域,從而在 fork 時(shí)能提供足夠的虛擬內(nèi)存。這種方法能夠在硬件上根本上解決問(wèn)題,但可能會(huì)增加系統(tǒng)成本。
調(diào)整 Redis 配置 stop-writes-on-bgsave-error
Redis 默認(rèn)配置 stop-writes-on-bgsave-error
為 yes,也就是當(dāng)后臺(tái)持久化(BGSAVE)失敗時(shí),Redis 會(huì)拒絕處理修改命令,防止數(shù)據(jù)不一致。
如果你有完善的監(jiān)控系統(tǒng),可以選擇暫時(shí)將此參數(shù)設(shè)置為 no,讓 Redis 即使在持久化失敗時(shí)也繼續(xù)工作,不過(guò)這會(huì)增加數(shù)據(jù)丟失的風(fēng)險(xiǎn)。
修改方法(在 redis.conf 中配置):
stop-writes-on-bgsave-error no
提示: 此方法僅作為臨時(shí)應(yīng)急方案,最好在確保內(nèi)存配置正確后使用。
在 Docker 環(huán)境中的注意事項(xiàng)
如果你的 Redis 部署在 Docker 容器中,需要注意:
vm.overcommit_memory
是內(nèi)核級(jí)別的參數(shù),不能只針對(duì)單個(gè)容器進(jìn)行設(shè)置,必須在宿主機(jī)上調(diào)整。- 對(duì)于容器化環(huán)境下的內(nèi)存管理,還要做好容器資源的限制和監(jiān)控,確保 Redis 在高負(fù)載下依然穩(wěn)定運(yùn)行。
總結(jié)
Redis 后臺(tái)持久化失敗通常是由于 fork 子進(jìn)程時(shí)內(nèi)存不足引起的。為了解決這一問(wèn)題,推薦:
- 修改內(nèi)核參數(shù)
vm.overcommit_memory
設(shè)置為 1,以便系統(tǒng)允許過(guò)度分配內(nèi)存; - 根據(jù)需求增加物理內(nèi)存或 Swap 空間;
- 如有必要,可調(diào)整
stop-writes-on-bgsave-error
參數(shù)以確保服務(wù)不中斷,但需權(quán)衡數(shù)據(jù)安全風(fēng)險(xiǎn)。
通過(guò)以上措施,可以有效降低 Redis 因內(nèi)存不足導(dǎo)致持久化失敗的風(fēng)險(xiǎn),保障數(shù)據(jù)的安全性和系統(tǒng)的穩(wěn)定運(yùn)行。
到此這篇關(guān)于一文解決Redis后臺(tái)持久化失敗的問(wèn)題:內(nèi)存不足導(dǎo)致fork失敗的文章就介紹到這了,更多相關(guān)Redis后臺(tái)持久化失敗內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
在Centos?8.0中安裝Redis服務(wù)器的教程詳解
由于考慮到linux服務(wù)器的性能,所以經(jīng)常需要把一些中間件安裝在linux服務(wù)上,今天通過(guò)本文給大家介紹下在Centos?8.0中安裝Redis服務(wù)器的詳細(xì)過(guò)程,感興趣的朋友一起看看吧2022-03-03Redis實(shí)現(xiàn)IP限流的2種方式舉例詳解
通俗的說(shuō)限流就是限制一段時(shí)間內(nèi)用戶訪問(wèn)資源的次數(shù),減輕服務(wù)器壓力,這篇文章主要給大家介紹了關(guān)于Redis實(shí)現(xiàn)IP限流的2種方式,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下2024-08-08Redis可視化工具Redis?Desktop?Manager的具體使用
本文主要介紹了Redis可視化工具Redis?Desktop?Manager的具體使用,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-12-12通過(guò)實(shí)例解析布隆過(guò)濾器工作原理及實(shí)例
這篇文章主要介紹了通過(guò)實(shí)例解析布隆過(guò)濾器工作原理及實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11Mac中Redis服務(wù)啟動(dòng)時(shí)錯(cuò)誤信息:NOAUTH Authentication required
這篇文章主要介紹了Mac中使用Redis服務(wù)啟動(dòng)時(shí)錯(cuò)誤信息:"NOAUTH Authentication required"問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08