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
dexbol
V2EX  ›  Python

如何重新部署 Python(tornado)服务?

  •  
  •   dexbol ·
    dexbol · 2014-12-26 11:58:09 +08:00 · 5263 次点击
    这是一个创建于 3647 天前的主题,其中的信息可能已经有所发展或是发生改变。
    英文太烂,搜不到答案,只能请教v友了。

    目前我采用的方案是:使用 git hooks checkout 最新的代码,然后使用 start-stop-daemon 逐一的 stop 再 start 所有的 python 进程。运营同事说这个方案不是最优方案,如果用户已经被分配到这个服务,赶上我发布代码时把进程 kill 了,就会产生震荡。

    请教各位有没有类似的问题,如何解决?
    18 条回复    2014-12-30 14:47:29 +08:00
    tokki
        1
    tokki  
       2014-12-26 12:01:48 +08:00   ❤️ 1
    dexbol
        2
    dexbol  
    OP
       2014-12-26 12:30:00 +08:00
    @tokki 大致看了一下 tutorial . 没有找到关于“软重启”的内容,请指点。
    est
        3
    est  
       2014-12-26 12:47:00 +08:00   ❤️ 1
    @tokki fab这个只是工具吧。如何做到无缝重启,还得自己搞原理。


    https://groups.google.com/forum/m/#!topic/python-tornado/jveZAfNNAPo
    tokki
        4
    tokki  
       2014-12-26 12:57:52 +08:00   ❤️ 1
    没看清楚你的问题 我以为你是要部署多台
    我个人目前还是会中断服务一瞬间 等别人解答这个震荡的问题
    felixzhu
        5
    felixzhu  
       2014-12-26 14:20:53 +08:00   ❤️ 1
    你要的是一个平滑重启。
    python进程一般来说是用supervisord来守护,重启的时候确实会停止一小段时间,这是没办法的

    如果实在想要无缝切换,可以起多个进程,比方说两个进程监听8000和9000端口,首先nginx的upstream指向8000端口,部署的时候新代码部署到9000端口的进程上,然后部署脚本修改nginx的配置upstream指向9000端口。这样不知道能不能满足lz的需求
    tokki
        6
    tokki  
       2014-12-26 14:30:34 +08:00   ❤️ 1
    多进程我是用 http://gunicorn.org/ 来启动的 你也可以试试
    roricon
        7
    roricon  
       2014-12-26 15:23:05 +08:00   ❤️ 1
    这个真得根据具体的业务来分析。
    tornado这种异步得框架,基本上瞬间就把Response返回给用户了。所以先停止转发Request到准备重启的实例上,等待所有处理完成之后再kill。
    当然还需要考虑用户Session的保持等等。
    humiaozuzu
        8
    humiaozuzu  
       2014-12-26 15:36:48 +08:00   ❤️ 1
    @felixzhu 说的挺对的
    如果在线用户没过w,直接 supervisorctl restart 就行了,我们目前就是这样,在线用户没有感觉的
    如果用户很多,可以参考搜狐的方案,也就是 nginx -s reload 指向新的 upstream,然后 stop 掉旧的 instence,传送门 https://github.com/SohuTech/essay
    felixzhu
        9
    felixzhu  
       2014-12-26 18:04:08 +08:00
    @humiaozuzu 哈哈,我就是搜狐的
    humiaozuzu
        10
    humiaozuzu  
       2014-12-26 18:06:21 +08:00
    @felixzhu 2333 你是负责后端吗?
    felixzhu
        11
    felixzhu  
       2014-12-26 18:13:18 +08:00
    humiaozuzu
        12
    humiaozuzu  
       2014-12-26 19:33:56 +08:00
    @felixzhu 方便加一下IM吗,平时可以交流下,QQ Hangout 都行
    felixzhu
        13
    felixzhu  
       2014-12-26 19:40:27 +08:00
    @humiaozuzu 461731776
    humiaozuzu
        14
    humiaozuzu  
       2014-12-26 19:44:42 +08:00
    @felixzhu 要求回答问题。。。加一下我的把 511967867
    est
        15
    est  
       2014-12-26 20:24:09 +08:00
    @felixzhu 没那么麻烦。。。nginx指向多个upstream一个作为failback。重启的时候新代码跑failback,kill掉老的,然后再启动一个新的到upstream,搞定。
    sujin190
        16
    sujin190  
       2014-12-26 20:36:32 +08:00   ❤️ 1
    https://gist.github.com/snower/d0edf8731b8acbce332e
    如歌优雅的重启tornado服务,supervisor有个进程组模式,搭配这个可以实现一键重启
    likang
        17
    likang  
       2014-12-26 21:17:30 +08:00   ❤️ 1
    思路:
    1、应用程序停止接收新的请求
    2、给应用程序一段时间(几秒左右)处理已经 hold 住的请求

    具体可参考这位仁兄的帖子(貌似要翻墙) http://www.keakon.net/2012/12/17/%E7%94%9F%E4%BA%A7%E7%8E%AF%E5%A2%83%E4%B8%8B%E5%A6%82%E4%BD%95%E4%BC%98%E9%9B%85%E5%9C%B0%E9%87%8D%E5%90%AFTornado
    1989922yan
        18
    1989922yan  
       2014-12-30 14:47:29 +08:00
    @felixzhu

    supervisord
    可以逐一kill掉tornado进程
    然后依次重启tornado进程
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1187 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 18:14 · PVG 02:14 · LAX 10:14 · JFK 13:14
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.