1. 程式人生 > 其它 >Redis An unhandled exception has occurred while executing the request. MISCONF Redis is configured to save RDB snapshots, but it is currently not able to persist on disk.

Redis An unhandled exception has occurred while executing the request. MISCONF Redis is configured to save RDB snapshots, but it is currently not able to persist on disk.

錯誤資訊:

Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware|ERROR|
An unhandled exception has occurred while executing the request.
MISCONF Redis is configured to save RDB snapshots,
but it is currently not able to persist on disk.
Commands that may modify the data set are disabled,
because this instance is configured to report errors during writes if RDB snapshotting fails (stop-writes-on-bgsave-error option).
Please check the Redis logs for details about the RDB error.

原因:

強制把redis快照關閉了導致不能持久化的問題。(BGSAVE失敗導致,而導致其失敗的大多數原因是fork 無法分配記憶體)。

關於記憶體的大概原因如下:

1,磁碟出現損壞(很少出現)

2,寫持久化資料的磁碟滿了

3,磁碟訪問不到了(針對遠端儲存)

4,對磁碟的訪問許可權不足(應該是最多發生的)

5,磁碟空間不足

具體的原因可檢視redis的日誌可在配置檔案中搜索“logfile”檢視儲存位置

解決方法:

1.臨時解決的方式,在Redis的配置檔案 redis.windows.conf上將stop-writes-on-bgsave-error值配置為no(預設值為yes),重啟redis服務

設定為yes表示redis 會建立一個新的後臺程序dump rdb。

假如建立快照(硬碟上,產生一個新的rdb檔案),期間redis的主程序仍然接受客戶端的請求,但此快照建立失敗了,多數為記憶體原因引起,此時就會丟擲如上異常,

那麼,redis會,拒絕新的寫入,也就是說,它認為你當下的持久化資料出現了問題,就停止操作了

no:表示bgsave快照操作出錯時停止寫資料到磁碟。

2.針對系統空間足夠,但還是提示記憶體不足的情況(fork程序分配不到記憶體是因為跟作業系統的優化相沖突)可以使用如下方式:

vm.overcommit_memory設定為1,預設值是0

0:表示核心將檢查是否有足夠的可用記憶體供應用程序使用;如果有足夠的可用記憶體,記憶體申請允許;否則,記憶體申請失敗,並把錯誤返回給應用程序。
1:表示核心允許分配所有的實體記憶體,而不管當前的記憶體狀態如何。
2: 表示核心允許分配超過所有實體記憶體和交換空間總和的記憶體。

關於BGSAVE:

在後臺非同步(Asynchronously)儲存當前資料庫的資料到磁碟。

BGSAVE 命令執行之後立即返回OK,然後 Redis fork 出一個新子程序,原來的 Redis 程序(父程序)繼續處理客戶端請求,而子程序則負責將資料儲存到磁碟,然後退出。

客戶端可以通過LASTSAVE命令檢視相關資訊,判斷BGSAVE命令是否執行成功。

地址:http://redisdoc.com/persistence/bgsave.html#bgsave

關於問題解釋的詳細帖子:

https://stackoverflow.com/questions/60110452/using-redis-with-docker-compose-misconf-redis-is-configured-to-save-rdb-snapsho