V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
zhoudaiyu
V2EX  ›  Python

有做 Django+Celery 高可用的兄弟么?帮忙看看我想的这种架构

  •  
  •   zhoudaiyu · 2020-04-11 12:25:59 +08:00 via iPhone · 4467 次点击
    这是一个创建于 1716 天前的主题,其中的信息可能已经有所发展或是发生改变。
    我们现在在一台机器上起了 Nginx Django CeleryBeat CeleryWorker,有单点风险,因此我想做成高可用的架构。在最前面挂一套 LVS 做负载均衡+高可用并提供虚 IP,每台 Web 服务器上启 Nginx+Django+CeleryBeat,再用两台以上的机器跑 CeleryWorker 。我们的 Redis (作为 Celery 的 broker )是 sentinel 方式部署,且 Mysql 用的是 percona 的 3 主方式部署,这样看来就没有单点了。请问这样的架构是否可行?有哪些潜在风险呢?谢谢大家
    15 条回复    2020-04-20 11:37:24 +08:00
    Yeungsin
        1
    Yeungsin  
       2020-04-11 12:38:56 +08:00
    CeleryBeat 部署多个的话会导致重复执行任务, 其它的看起来我感觉没问题
    zhoudaiyu
        2
    zhoudaiyu  
    OP
       2020-04-11 12:42:11 +08:00 via iPhone
    @Yeungsin 那么这么看 Web 这一坨只能部署成单点?因为只能有一个 beat ?
    linnchord
        3
    linnchord  
       2020-04-11 12:58:39 +08:00
    CeleryBeat 为什么要跟着 web 启多台?应该用不着,独立一台 broker+beat,后面多台 worker 就行。
    zhoudaiyu
        4
    zhoudaiyu  
    OP
       2020-04-11 13:14:25 +08:00 via iPhone
    @linnchord Broker 就是 redis 啊
    Yeungsin
        5
    Yeungsin  
       2020-04-11 13:23:41 +08:00
    @zhoudaiyu web 和 beat 需要拆开,web 继续多个, 然后 beat 单独部署
    hushao
        6
    hushao  
       2020-04-11 15:27:42 +08:00 via iPhone
    多台 web 、单台 beat
    black11black
        7
    black11black  
       2020-04-11 16:18:58 +08:00
    我觉得你要做高可用,选用 django 这个时间点就已经出局了吧..
    zhoudaiyu
        8
    zhoudaiyu  
    OP
       2020-04-11 16:36:40 +08:00
    @black11black 莫得办法 老项目
    knktc
        9
    knktc  
       2020-04-11 16:46:44 +08:00
    担心部署多个 beat 会有重复任务的话可以看下这个项目: https://github.com/ybrs/single-beat
    或是用 uwsgi legion 来实现只启动一个 beat 的效果。
    zhoudaiyu
        10
    zhoudaiyu  
    OP
       2020-04-11 16:51:11 +08:00
    @knktc 十分感谢,我还看了一个用分布式锁实现只有一个 beat 在工作的项目 https://github.com/sibson/redbeat
    scriptB0y
        11
    scriptB0y  
       2020-04-11 17:16:26 +08:00   ❤️ 3
    https://github.com/sibson/redbeat 推荐直接用这个。我用了一年了,它用在 redis 里面加锁的方式,起 N 个 beat 进程但是只有一个在运行,其余的待命。一般的高可用是够了。

    之前这个锁有个 bug,不过我帮他 fix 了 XD https://github.com/sibson/redbeat/pull/128
    zhoudaiyu
        12
    zhoudaiyu  
    OP
       2020-04-11 17:35:34 +08:00 via iPhone
    @scriptB0y 大....大佬....请问这个支持 sentinel 吧,有啥坑么?谢谢
    scriptB0y
        13
    scriptB0y  
       2020-04-11 21:37:58 +08:00
    @zhoudaiyu 就遇到这一个,其他的没了。sentinel 应该是支持的,但是我没用过

    https://github.com/sibson/redbeat/blob/84743ca5272ceb74b165aa98875f250f877ac1e4/docs/config.rst#sentinel-support
    Allianzcortex
        14
    Allianzcortex  
       2020-04-11 23:39:22 +08:00
    @scriptB0y 厉害
    yeyuqiu
        15
    yeyuqiu  
       2020-04-20 11:37:24 +08:00
    我最近也在用 https://github.com/sibson/redbeat,遇到了 timezone 的 1 个坑,之前有人提交过 PR,但是还没被 merge
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2821 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 12:11 · PVG 20:11 · LAX 04:11 · JFK 07:11
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.