部署(单节点)Django Web应用程序,在EC2上几乎没有停机时间

rbu*_*hum 11 deployment django postgresql amazon-ec2 django-south

问题:使用Django时,实现0(或尽可能接近0)停机​​时间的好策略是什么?

我读到的大多数答案都说"使用南方"或"使用面料",但那些非常模糊的答案恕我直言.我实际上使用了两者,我仍然想知道如何尽可能地实现零停机.

一些细节:

我有一个体积适中的Django应用程序,我在EC2上主持.我使用South进行模式和数据迁移以及使用boto进行结构化,以自动执行通过一组Jenkins(持续集成服务器)任务触发的重复部署/备份任务.我使用的数据库是标准的PostgreSQL 9.0实例.

我有一个...

  1. 我们的团队不断编辑的暂存服务器,包含所有新内容,并加载了最新最好的代码和...

  2. 不断更改用户帐户和用户数据的实时服务器 - 全部记录在PostgreSQL中.

目前的部署策略:

部署新代码和内容时,会创建两个服务器(实时和暂存)的两个EC2快照.直播切换到"正在更新新内容"页面...

停工开始了.

实时克隆服务器迁移到与登台服务器相同的模式版本(使用南).仅创建我想要保存的表和序列的转储(特别是用户帐户及其数据).完成此操作后,转储将上载到登台克隆服务器.从实时保留的表将被截断并插入数据.随着我的实时服务器中的数据增长,这一次显然在不断增加.

加载完成后,实时服务器的弹性ips将更改为分段克隆(因此它已被提升为新的实时).实时实例和实时克隆实例终止.

停工结束.

是的,这有效,但随着数据的增长,我的"虚拟"零停机时间越来越远.当然,我想到的是以某种方式利用复制并开始研究PostgreSQL复制和"最终一致"的方法.我知道我可以使用负载平衡器做一些魔术,但同时创建的帐户问题使它变得棘手.

我建议你看什么?

更新:

我有一个典型的Django单节点应用程序.我希望有一个解决方案可以更深入地了解django特定问题.例如,我想到了使用Django支持多个数据库以及自定义路由器以及复制的想法.有些问题与我希望回答的问题有关.

Wes*_*ley 4

可能有兴趣看看一种称为金丝雀释放的技术。去年,我在阿姆斯特丹的一次软件会议上看到了 Jez Humble 的精彩演示;这是关于低风险版本的,幻灯片在这里

我们的想法是不要立即切换所有系统,而是将一小部分用户发送到新版本。只有当新系统的所有性能指标都符合预期时,其他系统才会进行切换。我知道像facebook这样的大网站也使用这种技术。