最近在某个现场发现,当 Redis 快照失败后,Redis 服务会自动重启,进而导致服务端宕机。经过排查,问题的根源在于:服务端在使用 Redis 组件的线程内抛出了异常,但没有被正确拦截,最终导致了服务端宕机。简单来说,问题是由于启动的新线程内抛出了异常,且没有 try-catch
,导致整个程序崩溃,尽管线程外有 try-catch
,也无法捕获到。
解决方法很简单:只需要在该线程内加上 try-catch
,就能正确拦截异常,防止程序突然挂掉。
正常情况下,Redis 作为缓存组件,不应影响程序的正常运行。即使 Redis 宕机,后端程序依然应能通过直接访问数据库继续正常工作,而不至于导致整个服务崩溃。
我们已经解决了程序突然挂掉的问题,但接下来我们需要调优 Redis,分析为什么 Redis 会自动重启。经过排查,发现问题出在 Redis 设置stop-writes-on-bgsave-error=yes默认打开,快照失败后会停止写入,并触发服务的自动重启,所以现在只需要设置no,然后重启redis即可解决问题。