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

2014-12-26 11:58:09 +08:00
 dexbol
英文太烂,搜不到答案,只能请教v友了。

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

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


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

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

supervisord
可以逐一kill掉tornado进程
然后依次重启tornado进程

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/156828

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX