启动Redis broker后出现僵尸Django Q集群,如何彻底清除?
问题原因
Django Q的集群存活状态完全依赖Redis中存储的注册信息,你遇到的僵尸集群本质是旧的qcluster进程异常退出时,没有向Redis发送删除自身注册记录的指令,导致Redis中一直残留该集群的元数据,只要Redis服务运行,qinfo就会读取到这条残留记录并将其识别为运行中集群。
清理步骤
- 首先确认当前没有正在运行的qcluster进程,以及无需要保留的待执行/运行中任务。
- 连接到你的Redis实例,删除Django Q存储的集群注册键:
# 默认无密码、端口6379的本地Redis执行这条 redis-cli DEL django-q:clusters # 有自定义配置的话替换对应参数,示例: # redis-cli -p 自定义端口 -a 密码 -n 库号 DEL django-q:clusters
- 如果需要清空所有Django Q相关残留数据(包括待处理任务、失败任务记录等),执行以下命令:
# Redis 4.0以下版本 redis-cli KEYS "django-q:*" | xargs redis-cli DEL # Redis 4.0+ 推荐用UNLINK避免阻塞主进程 redis-cli KEYS "django-q:*" | xargs redis-cli UNLINK
- 验证清理结果:运行
python manage.py qinfo,此时僵尸集群已经消失。后续正常启动python manage.py qcluster只会显示一个活跃集群。
后续预防方案
- 终止qcluster进程时不要使用
kill -9强制杀死,优先用Ctrl+C或者kill <进程PID>的方式,正常退出的qcluster会主动删除Redis中的自身注册信息 - 在Django配置文件中添加
cluster_timeout参数,自动剔除超时无心跳的集群记录,示例配置:
Q_CLUSTER = { # 保持你原有配置不变,新增以下参数 'cluster_timeout': 30, # 单位为秒,30秒无心跳的集群会被自动判定为失效 }
如果你在Django Q配置中自定义了Redis的键前缀,需要将上述命令中的
django-q:替换为你自己设置的前缀。
内容的提问来源于stack exchange,提问作者lorenc
相关产品推荐
相关产品推荐

