Redis在Ubuntu上的故障排查指南
1. 检查Redis服务状态
首先确认Redis服务是否正在运行,使用以下命令查看服务状态:
sudo systemctl status redis-server
若服务未运行(显示“inactive”或“failed”),需进一步排查;若正在运行但仍有问题,可尝试重启服务:sudo systemctl restart redis-server。
2. 查看Redis日志定位具体错误
Redis日志是排查故障的核心依据,默认日志文件路径为/var/log/redis/redis-server.log。使用以下命令实时查看最新日志:
tail -f /var/log/redis/redis-server.log
或通过journalctl查看系统日志:
sudo journalctl -u redis-server.service
日志中会明确提示错误原因(如端口占用、配置文件错误、权限问题等)。
3. 检查配置文件语法与参数
Redis配置文件/etc/redis/redis.conf的错误会导致服务无法启动。重点检查以下参数:
- 端口设置:默认
port 6379,确保未被注释且数值合法; - 绑定地址:
bind 127.0.0.1(仅本地访问)或bind 0.0.0.0(允许远程访问,生产环境需谨慎); - 数据目录:
dir /var/lib/redis,确保目录存在且Redis用户(通常为redis)有读写权限; - 守护进程模式:
daemonize no(与systemd服务配合,若为“yes”可能导致冲突)。
修改配置文件后,需重启服务使更改生效:sudo systemctl restart redis-server。
4. 排查端口占用问题
Redis默认使用6379端口,若该端口被其他进程占用,会导致启动失败。使用以下命令检查端口占用情况:
sudo ss -ltnp | grep 6379
或
sudo lsof -i :6379 -sTCP:LISTEN
若端口被占用,可通过以下方式解决:
- 终止占用进程:
sudo kill -9(替换为实际进程ID); - 修改Redis端口:编辑
/etc/redis/redis.conf,将port改为其他数值(如6380),然后重启服务。
5. 验证系统资源是否充足
Redis是内存数据库,系统内存不足会导致启动失败或性能下降。使用以下命令检查内存使用情况:
free -m
若内存不足,可尝试以下方法:
- 增加系统内存;
- 调整Redis内存限制:编辑
/etc/redis/redis.conf,修改maxmemory参数(如maxmemory 2gb); - 启用内存淘汰策略:设置
maxmemory-policy(如volatile-lru,淘汰最近最少使用的键)。
6. 检查权限与SELinux/AppArmor
6.1 文件/目录权限
Redis需要访问配置文件、数据目录和日志文件的权限。确保redis用户对以下路径有读写权限:
- 配置文件:
/etc/redis/redis.conf; - 数据目录:
/var/lib/redis; - 日志目录:
/var/log/redis。
使用以下命令修正权限:
sudo chown -R redis:redis /var/lib/redis
sudo chmod 755 /var/lib/redis
6.2 SELinux/AppArmor
若系统启用了SELinux或AppArmor,可能会拦截Redis的操作。
- 检查AppArmor状态:
sudo aa-status; - 若Redis被拦截,可临时设置为“complain”模式(允许但记录违规):
sudo aa-complain /etc/apparmor.d/usr.sbin.redis-server; - 生产环境建议修改AppArmor规则(编辑
/etc/apparmor.d/usr.sbin.redis-server),添加所需权限,然后重启AppArmor:sudo systemctl restart apparmor。
7. 处理客户端常见错误
7.1 连接问题
- NOAUTH Authentication required:Redis设置了密码,但客户端未提供。使用
AUTH命令认证(密码在/etc/redis/redis.conf的requirepass参数中设置); - Connection refused:Redis服务未运行或端口被防火墙拦截。检查服务状态(
systemctl status),并开放端口:sudo ufw allow 6379; - WRONGPASS invalid username-password pair:密码错误,检查
requirepass参数并重新认证。
7.2 命令错误
- WRONGTYPE Operation against a key holding the wrong kind of value:命令与数据类型不匹配(如对String类型执行
HGET)。检查键的数据类型(TYPE),使用正确命令; - ERR unknown command:命令不存在或被禁用(如
FLUSHALL被rename-command禁用)。检查配置文件中的rename-command设置。
7.3 内存问题
- OOM command not allowed when used memory > ‘maxmemory’:内存耗尽。增加
maxmemory限制,或启用淘汰策略(如volatile-lru); - LOADING Redis is loading the dataset in memory:Redis正在加载RDB/AOF文件,等待加载完成即可。
8. 其他常见问题排查
- 数据目录问题:若数据目录不存在或权限不足,Redis无法启动。创建目录并赋权:
sudo mkdir -p /var/lib/redis,sudo chown -R redis:redis /var/lib/redis; - 配置文件重复指令:检查
/etc/redis/redis.conf中是否有重复的port、bind等指令,删除重复项; - 持久化失败:若AOF/RDB文件损坏,可尝试删除旧文件(
/var/lib/redis/dump.rdb或appendonly.aof),重启Redis后会生成新文件(注意:删除前需备份数据)。