redis RDB快照失敗導致redis命令執行錯誤


概述

  • 問題
  • 解決

問題

環境:window10 內存16G 4核
場景:使用redis存儲一些高並發讀寫的數據,並發測試的時候偶發RDB快照失敗,導致redis命令無法執行。

客戶端報錯:

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 server的日志詳細了解關於這個RDB error(當時我的redis是裝在自己電腦上的,默認情況下redis log文件在redis安裝文件的根級目錄下,和redis-server.exe一個目錄,redis-server.log)

=== REDIS BUG REPORT START: Cut & paste starting from here ===
Redis version: 5.0.9
[16668] 16 Oct 20:52:03.200 # --- EXCEPTION_ACCESS_VIOLATION
[16668] 16 Oct 20:52:03.201 # --- STACK TRACE
redis-server.exe!StackTraceInfo(D:\dev\GitHub\redis\src\Win32_Interop\Win32_StackTrace.cpp:153)(0x14018CBB0, 0x0014FF60, 0x1400DD020, 0x0014DF00)
redis-server.exe!UnhandledExceptiontHandler(D:\dev\GitHub\redis\src\Win32_Interop\Win32_StackTrace.cpp:186)(0x0014DF00, 0x1400DD001, 0x00000000, 0x7FCD35004F57)
KERNELBASE.dll!UnhandledExceptionFilter(D:\dev\GitHub\redis\src\Win32_Interop\Win32_StackTrace.cpp:186)(0x00000000, 0x7FF996AC43B8, 0x00000000, 0x0014FEF0)
ntdll.dll!memset(D:\dev\GitHub\redis\src\Win32_Interop\Win32_StackTrace.cpp:186)(0x00000000, 0x00000000, 0x0014E4C8, 0x0014E550)
ntdll.dll!_C_specific_handler(D:\dev\GitHub\redis\src\Win32_Interop\Win32_StackTrace.cpp:186)(0x00000000, 0x0014E4B0, 0x0014EB70, 0x0014EB70)
ntdll.dll!_chkstk(D:\dev\GitHub\redis\src\Win32_Interop\Win32_StackTrace.cpp:186)(0x00000001, 0x7FF996980000, 0x00000000, 0x7FF996AEE9E4)
ntdll.dll!RtlRaiseException(D:\dev\GitHub\redis\src\Win32_Interop\Win32_StackTrace.cpp:186)(0x00000000, 0x00000000, 0x0001D389, 0x00000000)
ntdll.dll!KiUserExceptionDispatcher(D:\dev\GitHub\redis\src\Win32_Interop\Win32_StackTrace.cpp:186)(0x7FCD29C28850, 0x41D7E265DC800000, 0x00148563, 0x0001D36E)
redis-server.exe!rdbSaveObject(D:\dev\GitHub\redis\src\rdb.c:869)(0x00000001, 0x140048105, 0x00000009, 0x0014F1F0)
redis-server.exe!rdbSaveKeyValuePair(D:\dev\GitHub\redis\src\rdb.c:1072)(0x0014F1F0, 0x00000000, 0x06C00000, 0x00000009)
redis-server.exe!rdbSaveRio(D:\dev\GitHub\redis\src\rdb.c:1216)(0x018BDDC0, 0x00DC0000, 0x00000000, 0x0000411C)
redis-server.exe!rdbSave(D:\dev\GitHub\redis\src\rdb.c:1318)(0x02098A08, 0x00DC0000, 0x00DC0000, 0x0000009D)
redis-server.exe!QForkChildInit(D:\dev\GitHub\redis\src\Win32_Interop\Win32_QFork.cpp:297)(0x00000210, 0x00000000, 0x00000210, 0x0045F4D0)
redis-server.exe!main(D:\dev\GitHub\redis\src\Win32_Interop\Win32_QFork.cpp:1136)(0x00000000, 0x00000000, 0x004450D0, 0x00000000)
redis-server.exe!__scrt_common_main_seh(d:\agent_work\4\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl:288)(0x00000000, 0x00000000, 0x00000000, 0x00000000)
KERNEL32.DLL!BaseThreadInitThunk(d:\agent_work\4\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl:288)(0x00000000, 0x00000000, 0x00000000, 0x00000000)
ntdll.dll!RtlUserThreadStart(d:\agent_work\4\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl:288)(0x00000000, 0x00000000, 0x00000000, 0x00000000)
ntdll.dll!RtlUserThreadStart(d:\agent_work\4\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl:288)(0x00000000, 0x00000000, 0x00000000, 0x00000000)

解決

通過日志我們可以知道這是因為RDB快照失敗導致的命令無法執行,在redis中我們可以設置忽略這個錯誤,即快照失敗依然可以進行執行命令。

redis配置項中關於這個的配置項名稱為stop-writes-on-bgsave-error,默認值為yes,我們需要改為no。
可以直接在client上執行命令:

config set stop-writes-on-bgsave-error no

這個修改是一次性的,只會修改redis當前運行的內存中的配置項的值,如果需要永久修改我們需要在redis配置文件redis.conf中修改stop-writes-on-bgsave-error的值。

解決RDB快照失敗:

原因

一:快照文件當前登錄用戶無寫權限
二:磁盤空間不足
三:因為bgsave需要fork一個子進程,如果內存不足以fork子進程的話也會報錯

根據以上三個原因的解決方案有:

一:設置快照文件的寫權限
二:清理磁盤空間
三:清理內存或者設置系統參數允許放行fork子進程當內存不足的時候,在linux內核中的vm.overcommit_memory參數(window暫時不知道怎么改)

如果 vm.overcommit_memory = 1,直接放行
vm.overcommit_memory = 0:則比較 此次請求分配的虛擬內存大小和系統當前空閑的物理內存加上swap,決定是否放行。
vm.overcommit_memory = 2:則會比較 進程所有已分配的虛擬內存加上此次請求分配的虛擬內存和系統當前的空閑物理內存加上swap,決定是否放行。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM