Solr周期性停止服务的调试与自动恢复方案咨询
Solr周期性不可用问题调试与自动恢复方案
一、问题调试步骤
- 确认Solr实际进程状态:执行
ps aux | grep solr,查看是否存在Solr对应的Java进程。service状态显示active (exited)说明init脚本已退出,但实际Solr进程可能已被终止。 - 排查系统层面日志:
- 查看Solr服务的系统日志:
journalctl -u solr.service --since "1 week ago",寻找进程异常终止的原因。 - 检查内核日志是否有OOM(内存不足)杀进程记录:
dmesg | grep -i kill,若存在Out of memory: Killed process相关信息,说明Solr因内存耗尽被系统终止。
- 查看Solr服务的系统日志:
- 修复Solr日志记录异常:
- 检查Solr日志目录权限:确保
solr用户对/var/www/solr/logs有读写权限,执行ls -ld /var/www/solr/logs查看权限设置。 - 调整日志级别:修改Solr的
log4j2.xml配置文件(通常位于Solr安装目录或solr_home下),将日志级别从WARN调整为INFO或DEBUG,确保捕获进程退出前的详细信息。
- 检查Solr日志目录权限:确保
- 检查资源限制:
- 查看JVM内存配置:检查
solr.in.sh中的SOLR_HEAP参数,若设置过小,容易引发内存溢出,建议根据服务器内存调整(例如服务器内存8G时,可设置为4G)。 - 验证文件句柄限制:执行
ulimit -n查看当前用户的文件句柄上限,Solr运行需要足够的文件句柄,可在systemd服务配置中添加LimitNOFILE=65535参数提升限制。
- 查看JVM内存配置:检查
- 排查定时任务干扰:检查系统cron任务(
crontab -l)或其他定时脚本,确认是否存在会终止Solr进程或清理相关文件的任务。
二、故障检测与自动重启方案
1. 利用systemd自动重启
修改Solr的systemd服务配置文件(路径通常为/lib/systemd/system/solr.service或/etc/systemd/system/solr.service),在[Service]段添加以下配置:
Restart=on-failure RestartSec=5s
执行以下命令使配置生效:
systemctl daemon-reload systemctl restart solr
此后systemd会在Solr进程异常终止时自动重启服务。
2. 自定义Shell监控脚本
编写简单的监控脚本monitor_solr.sh:
#!/bin/bash # 检查Solr服务是否可访问 if ! curl -s --connect-timeout 10 http://localhost:8983/solr/ > /dev/null; then echo "$(date): Solr服务不可用,尝试重启..." >> /var/log/solr_monitor.log service solr restart # 验证重启是否成功 sleep 10 if curl -s --connect-timeout 10 http://localhost:8983/solr/ > /dev/null; then echo "$(date): Solr重启成功" >> /var/log/solr_monitor.log else echo "$(date): Solr重启失败,请手动干预" >> /var/log/solr_monitor.log fi fi
赋予脚本执行权限:chmod +x monitor_solr.sh,然后添加到cron定时任务,每5分钟执行一次:
crontab -e # 添加以下内容 */5 * * * * /path/to/monitor_solr.sh
3. 补充说明
- 若使用systemd方案,建议同时开启进程监控,确保systemd能准确检测到Solr进程状态。
- 监控脚本可根据实际需求调整检查频率和验证逻辑,例如增加进程存在性检查。
内容的提问来源于stack exchange,提问作者Will
相关产品推荐
相关产品推荐

