Redis无法写入故障排查过程

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Redis无法写入故障排查过程相关的知识,希望对你有一定的参考价值。

一、故障表现
1、新增一个key失败
127.0.0.1:6379> set lion 2
(error) MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk. Commands that may modify the data set are disabled. Please check Redis logs for details about the error.

2、无法关闭服务
service redis-server restart
service redis-server stop
两个命令都是一直卡在stop那一步,一直无法关闭

kill ps aux|grep ‘redis-server ‘|grep -v grep|awk ‘{print $2}‘ #无法杀掉
kill -9 ps aux|grep ‘redis-server ‘|grep -v grep|awk ‘{print $2}‘ #强行杀掉
强行杀掉后无法启动,原来还有个pid的文件没有删除
/run/redis/redis-server.pid
rm /run/redis/redis-server.pid #手动删除它之后才能启动Redis

补充:
下面是无法关闭redis-server的原因
8576:signal-handler (1527833505) Received SIGTERM scheduling shutdown...
8576:M 01 Jun 14:11:45.180 # User requested shutdown...
8576:M 01 Jun 14:11:45.180 * Saving the final RDB snapshot before exiting.
8576:M 01 Jun 14:11:45.180 # Failed opening .rdb for saving: Permission denied
8576:M 01 Jun 14:11:45.180 # Error trying to save the DB, can‘t exit.
8576:M 01 Jun 14:11:45.180 # SIGTERM received but errors trying to shut down the server, check the logs for more information

二、搜索解决方法
1、关闭”当持久化出错时停止写入硬盘“
127.0.0.1:6379> config set stop-writes-on-bgsave-error no
2、修改目录及持久化权限为755
本来该目录就是755,所以与此无关。
看了几篇基本上和这两个相关。

三、老老实实看日志解决办法
1、在调试过程中一直监控日志
tail -f /var/log/redis/redis-server.log #文件目录及文件名请按自己配置文件,有两行有用的信息
27915:C 01 Jun 14:12:14.038 # Failed opening .rdb for saving: Permission denied
8576:M 01 Jun 14:12:14.138 # Background saving error
2、将dump.rdb所在目录权限修改为777,并将原来的dump.rdb删除,杀掉redis-server并删除redis-server.pid后启动redis-server,奇迹出现了。
ll
-rw-rw---- 1 redis redis 41 Jun 1 14:42 dump.rdb
看到亮点了吧,用户和用户组都是redis,为啥?

3、再来看服务启动的脚本
vi /etc/init.d/redis-server
其中有一段
Run_parts () {
if [ -d /etc/redis/${NAME}.${1}.d ]
then
su redis -s /bin/sh -c "run-parts --exit-on-error /etc/redis/${NAME}.${1}.d"
fi
}

su redis 就在这。

四、最终解决
chown redis:redis -R dir #dir 为redis配置文件中dir的目录
chmod 755 dir #dir 为redis配置文件中dir的目录,最后要将前面改为777的权限恢复回来。

五、总结
在这个事件中本来是很简单的问题,但在此过程中花费了挺长时间,前前后后花了半天。究其原因有二,一是心急,没有好好看日志;二是意外,没有想到会使用redis这个用户来启动,因为启动的时候是在root权限下。

以上是关于Redis无法写入故障排查过程的主要内容,如果未能解决你的问题,请参考以下文章

redis数据库持久化问题处理

Redis故障排查「连接失败问题排查和解决」带你总体分析和整理Redis的问题故障实战开发指南及方案

K8S故障排查指南:部分节点无法启动Pod资源-Pod处于ContainerCreating状态

Redis 故障排查「连接失败问题排查和解决」带你总体分析CPU及内存的使用率高问题排查指南及方案

思科7600系列设备VTT故障排查流程

Redis 故障排查「连接失败问题排查和解决」带你总体分析CPU及内存的使用率高问题排查指南及方案