推荐学习书目
› 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 · Dec 26, 2014 · 6146 views
    This topic created in 4341 days ago, the information mentioned may be changed or developed.
    英文太烂,搜不到答案,只能请教v友了。

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

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


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

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

    supervisord
    可以逐一kill掉tornado进程
    然后依次重启tornado进程
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   2138 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 49ms · UTC 05:16 · PVG 13:16 · LAX 21:16 · JFK 00:16
    ♥ Do have faith in what you're doing.