Django1.x使用Celery+redis哨兵模式


好的!下面是针对 Django 1.11 + Celery 4.4 + Kombu 4.6 + redis-py 3.5 + Redis Sentinel 的完整配置示例,包括 celery.py 和必要的说明,确保你能正确连接 Redis Sentinel 作为 Broker。



一、安装依赖

pip install Django==1.11.29
pip install celery==4.4.7
pip install kombu==4.6.11
pip install redis==3.5.3


二、项目结构(示例)

apitest/
├── __init__.py
├── celery.py        # Celery 配置文件
├── settings.py      # Django 设置
├── tasks.py         # 你的任务
└── ...


三、celery.py

from __future__ import absolute_import
import os
from celery import Celery
from redis.sentinel import Sentinel

# 设置 Django settings 模块
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'apitest.settings')

# 通过 Redis Sentinel 发现主节点
sentinel = Sentinel(
    [('43.166.2.211', 26379), ('sentinel2_host', 26379), ('sentinel3_host', 26379)],
    socket_timeout=0.1,
    password='tq113211',  # Redis 密码,如果无密码则去掉
)

# 获取当前主节点地址
master = sentinel.discover_master('mymaster')
redis_host, redis_port = master

# 构造 broker URL
broker_url = 'redis://:{}@{}:{}/0'.format('tq113211', redis_host, redis_port)

app = Celery('apitest', broker=broker_url)

# 从 Django settings.py 中加载配置(命名空间 CELERY)
app.config_from_object('django.conf:settings')

# 自动发现所有 app 中 tasks.py 文件里的任务
app.autodiscover_tasks()

# 可选:定义一个任务,方便测试
@app.task(bind=True)
def debug_task(self):
    print('Request: {0!r}'.format(self.request))


四、在 apitest/__init__.py 中加入

from .celery import app as celery_app

__all__ = ['celery_app']

这样 -A apitest 时,Celery CLI 能找到 app 实例。



五、Django settings.py 相关配置示例

# Celery 配置
CELERY_ACCEPT_CONTENT = ['json']
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_BACKEND = 'redis://:tq113211@43.166.2.211:6379/1'  # 结果存储,可以和 broker 不同端口
CELERY_TIMEZONE = 'Asia/Shanghai'
CELERY_ENABLE_UTC = False


六、任务示例 tasks.py

from celery import shared_task

@shared_task
def add(x, y):
    return x + y


七、启动命令

Windows 开发环境(单线程池,避免权限问题):

celery -A apitest worker --loglevel=info --pool=solo

Linux 生产环境(多进程):

celery -A apitest worker --loglevel=info


八、总结说明

  • Redis Sentinel 的主节点地址由 redis.sentinel.Sentinel 自动发现并写入 broker_url,避免写死 IP。
  • Celery 4.4 + Kombu 4.6 + redis-py 3.5 完美支持这种方式。
  • 你需要保证 Redis Sentinel 集群和主节点名称 mymaster 正确无误。
  • 任务调度和结果存储可用 Redis 的不同数据库或节点。


如果你需要,我还能帮你写 celery beat 定时任务配置或 Django 集成示例,告诉我哦!

文章标签:

评论(0)