节点类型 | 配置建议 | 典型数量 |
---|---|---|
Broker节点 | 4核8G + SSD磁盘 | 3+ |
Worker节点 | 根据任务类型定制(见下文) | 动态调整 |
监控节点 | 2核4G + 大存储 | 2 |
启动命令示例:
# 节点1(CPU密集型)
celery -A proj worker \
--hostname=worker1@%h \
-Q video_processing \
-c $(nproc) \
--loglevel=info \
--pidfile=/var/run/celery_worker1.pid
# 节点2(I/O密集型)
celery -A proj worker \
--hostname=worker2@%h \
-Q data_export \
-P gevent \
-c 100 \
--loglevel=debug
关键参数说明:
-c
:并发数,CPU密集型建议设置为CPU核心数-P
:并发模型,I/O密集型推荐gevent/eventlet--hostname
:唯一节点标识符Dockerfile 示例:
FROM python:3.9-slim
RUN pip install celery[redis] flower
WORKDIR /app
COPY . .
CMD celery -A proj worker \
--hostname=worker_$(hostname) \
-Q ${CELERY_QUEUES} \
-c ${CONCURRENCY} \
-P ${POOL_TYPE}
启动命令:
# 启动10个Worker容器
docker run -d \
-e CELERY_QUEUES="high_priority" \
-e CONCURRENCY=8 \
-e POOL_TYPE=prefork \
your-image:latest
配置文件:/etc/systemd/system/celery.service
[Unit]
Description=Celery Service
After=network.target
[Service]
User=celery
Group=celery
WorkingDirectory=/opt/app
EnvironmentFile=/etc/celery.env
ExecStart=/usr/local/bin/celery -A proj worker \
--hostname=worker_%%h \
-Q high_priority,default \
-c 16 \
--loglevel=info
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target
管理命令:
# 重载配置
sudo systemctl daemon-reload
# 查看日志
journalctl -u celery.service -f
配置文件:/etc/supervisor/conf.d/celery.conf
[program:celery_worker]
directory=/opt/app
command=/usr/local/bin/celery -A proj worker \
--hostname=worker_%(host_node_name)s \
-Q high_priority \
-c 16
user=celery
numprocs=4
process_name=%(program_name)s_%(process_num)02d
autostart=true
autorestart=true
startsecs=10
stopwaitsecs=300
stdout_logfile=/var/log/celery/worker.log
redirect_stderr=true
environment=
CELERY_LOG_LEVEL="info",
BROKER_URL="redis://redis-ha:6379/0"
日志轮转配置:
# /etc/logrotate.d/celery
/var/log/celery/*.log {
daily
missingok
rotate 30
compress
delaycompress
notifempty
create 640 celery celery
sharedscripts
postrotate
supervisorctl restart celery_worker >/dev/null 2>&1 || true
endscript
}
基于队列长度的扩容脚本:
# auto_scaler.py
import redis
import subprocess
r = redis.Redis(host='redis-ha')
QUEUE_THRESHOLD = 1000
def scale_workers():
for queue in ['high_priority', 'default']:
length = r.llen(f'celery@{queue}')
if length > QUEUE_THRESHOLD:
scale_factor = length // 500 # 每500任务增加1个Worker
subprocess.run([
'docker', 'service', 'scale',
f'celery_worker_{queue}=+{scale_factor}'
])
Horizontal Pod Autoscaler 配置:
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: celery-worker
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: celery-worker
minReplicas: 3
maxReplicas: 20
metrics:
- type: External
external:
metric:
name: celery_queue_length
selector:
matchLabels:
queue: high_priority
target:
type: AverageValue
averageValue: 500
Prometheus 监控指标采集:
- job_name: 'celery_exporter'
static_configs:
- targets: ['celery-exporter:9808']
metrics_path: /metrics
环境隔离原则
版本控制策略
# 滚动更新示例
docker service update \
--image new-image:v2 \
--update-parallelism 2 \
--update-delay 30s \
celery_worker
网络优化建议
# Kubernetes NetworkPolicy
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
name: celery-network-policy
spec:
podSelector:
matchLabels:
app: celery-worker
policyTypes:
- Ingress
- Egress
ingress:
- from:
- podSelector:
matchLabels:
app: web-app
egress:
- to:
- podSelector:
matchLabels:
app: redis-ha
案例:Worker节点失联
检查步骤:
# 查看节点状态
celery -A proj inspect active
# 检查网络连通性
nc -zv broker-host 5672
# 查看进程资源限制
cat /proc/$(pgrep -f "celery worker")/limits
解决方案:
# alert_rules.yml
groups:
- name: celery-alerts
rules:
- alert: HighQueueBacklog
expr: celery_queue_messages > 10000
for: 10m
labels:
severity: critical
annotations:
summary: "Celery queue backlog alert"
description: "{{ $labels.queue }} has {{ $value }} pending messages"
成功部署特征验证:
架构演进路线:
通过合理的多节点部署方案配合自动化运维体系,Celery集群可以实现:
推荐工具链组合: