使用 systemd 的原生功能来实现 Redis 的自动监控和重启,而不是依赖额外的脚本最佳实践方案
方案 1:配置 systemd 服务文件(推荐)
Redis 通常已经自带 systemd 服务文件(如 /lib/systemd/system/redis-server.service),我们只需优化它以实现自动重启。
1. 检查/创建 Redis 的 systemd 服务文件
sudo systemctl edit redis-server # 创建覆盖配置(推荐)
# 或直接编辑(如果文件不存在)
sudo vim /etc/systemd/system/redis-server.service
2. 配置关键参数(覆盖配置示例)
[Service]
Restart=always
RestartSec=5s
StartLimitInterval=0 # 禁用重启频率限制(根据需求调整)
ExecStartPre=/bin/sh -c 'echo "Redis 启动前检查: $(date)" >> /var/log/redis/restart.log'
ExecStopPost=/bin/sh -c 'echo "Redis 停止事件: $(date)" >> /var/log/redis/restart.log'
[Install]
WantedBy=multi-user.target

3. 重载 systemd 并启用服务
sudo systemctl daemon-reload
sudo systemctl enable redis-server # 开机自启
sudo systemctl start redis-server # 立即启动
4. 验证配置
sudo systemctl show redis-server -p RestartUSec,RestartSec # 查看重启策略
journalctl -u redis-server -f # 实时查看日志
方案 2:通过 systemd 定时器监控(替代 crontab)
如果需要更复杂的监控逻辑(如依赖检查),可以创建单独的监控服务:
1. 创建监控服务
sudo vim /etc/systemd/system/redis-monitor.service
内容:
[Unit]
Description=Redis 存活监控
After=network.target
[Service]
Type=oneshot
ExecStart=/bin/bash -c 'if ! systemctl is-active --quiet redis-server; then systemctl restart redis-server; fi'
2. 创建定时器
sudo vim /etc/systemd/system/redis-monitor.timer
内容:
[Unit]
Description=每30秒检查一次Redis状态
[Timer]
OnBootSec=1min
OnUnitActiveSec=30s
[Install]
WantedBy=timers.target
3. 启用定时器
sudo systemctl daemon-reload
sudo systemctl enable --now redis-monitor.timer
关键优势说明
1.原生 systemd 集成:
Restart=always 实现崩溃自动重启
通过 journalctl 集中管理日志
避免 crontab + shell 脚本的冗余架构
2.进程管理优化:
systemd 会跟踪 Redis 主进程
支持 cgroup 资源限制(可在服务文件中添加 MemoryLimit 等)
3.依赖管理:
可通过 After= 和 Requires= 配置服务依赖
故障排查命令
# 检查服务状态(重点关注 Active 和 Main PID)
sudo systemctl status redis-server
# 查看最近100条日志
journalctl -u redis-server -n 100 --no-pager
# 测试手动重启
sudo systemctl restart redis-server
# 检查依赖关系
systemctl list-dependencies redis-server
注意事项
1.如果 Redis 频繁重启,建议:
检查 /var/log/redis/redis-server.log
调整 RestartSec 避免频繁重启导致雪崩
考虑添加 SuccessExitStatus 匹配非零退出码
2.生产环境建议搭配监控系统(如 Prometheus + node_exporter)实现可视化告警。
这种方案比 shell 脚本更可靠,因为:
由 init 系统直接管理进程生命周期
避免 crontab 最小间隔(1分钟)的限制
更好的进程控制和资源隔离


418

被折叠的 条评论
为什么被折叠?



