问: 什么是使用Django时达到0(或尽可能接近为0)的停机时间好策略?
最让我读的回答说:“用南”或“用布”,但这些都是非常模糊的回答恕我直言。 其实,我同时使用,而且我仍然不知道如何实现零停机时间尽可能。
一些细节:
我有我在EC2举办一个体面大小的Django应用程序。 我用南方的架构和数据迁移以及面料与博托自动化是打通一组触发重复部署/备份任务詹金斯(持续集成服务器)的任务。 我使用的数据库是一个标准的PostgreSQL 9.0实例。
我有一个...
阶段服务器被不断地通过我们的团队与所有的新内容编辑和被加载了最新和最伟大的代码和...
所有记录在PostgreSQL的- 即保持与用户帐户和用户数据变化实时服务器 。
当前部署策略:
在部署新的代码和内容,这两个服务器的两个EC2快照(生活和分期)创建。 现场切换到“更新新内容”页面...
停机时间开始。
活克隆服务器被迁移到相同的架构版本升级服务器(使用南)。 我想从现场只保留表和序列的转储被创建(特别是用户与他们的帐户资料一起)。 一旦做到这一点,转储被上传到临时克隆服务器。 从现场被保存下来,这些表格将被截断,得到的数据插入。 正如我在直播服务器的数据的增长,这个时候显然不断增加 。
一旦加载完成直播服务器的弹性IPS被改为分期克隆(因此它已经晋升为新活)。 现场实例和现场克隆实例就会被终止。
停机结束 。
是的,这工作,但随着数据的增长,我的“虚拟”零宕机得到越走越远。 当然,这东西掠过我脑海的就是以某种方式利用复制,并开始寻找到PostgreSQL的复制和“最终一致”的方法。 我知道有一些神奇的,我可以用负载均衡器也许做的,但在此期间创建的帐户的问题,并提出棘手。
你会建议我看看?
更新 :
我有一个典型的Django单节点应用。 我希望的解决办法,去更深入Django的具体问题。 例如,使用Django的支持的想法多个数据库与一起复制定制路由器已经越过我的脑海里。 有相关的,是我希望的答案将触及的问题。
什么可能会有兴趣看一个叫金丝雀释放技术。 我看到杰斯谦卑去年在阿姆斯特丹一个软件会议一个伟大的演示; 它是关于低风险的版本中,幻灯片是在这里 。
我们的想法是在一次不能切换所有系统,但一小部分用户发送到新版本。 只有当新系统的各项性能指标都像预期的那样,其他人被切换为好。 我知道,这种技术也被大的网站,如Facebook。
直播服务器不应该迁移。 该服务器应该从两个临时服务器,server0对server1的和可访问的。 最初,server0对上线,并更改到Server1制造。 如果你想改变软件,切换现场服务器。 至于新的内容,这不应该是临时服务器上。 这应该是活的服务器上。 添加一列与内容表版本号的表,并修改代码库使用的内容正确的版本号。 开发软件需要旧版本将新行与更新的版本号码复制。 把当前版本号在server0对server1的和你的settings.py,让你有软件的中央位置是指选择数据时,或创建一个可以更新以获得内容正确版本的数据库访问应用程序。 当然,对于模板文件那些可以在每个服务器上,将是合适的。
这种方法将消除任何停机时间。 你将不得不重写你的一些软件,但如果你发现一个共同的访问方法,比如,你可以修改数据库的访问方法,你可能会发现它是没有那么多的工作。 在创建专门支持系统即时切换将是长期的工作将大为减少,并会扩展到任何内容大小的系统的预先投资。
如果我理解正确的话,这个问题似乎是您的应用程序了,而数据恢复到新的数据库架构一起。
为什么你创建摆在首位新的服务器? 为什么不迁移数据库就地(当然,以后你已经广泛使用的迁移),一旦这样做,更新的代码,并“重新启动”你的流程(gunicorn,例如,可以接受HUP信号,这将使它重新加载该应用程序,而不在队列中丢弃连接)。
许多迁移将不会有在所有锁定数据库表,所以这是安全的。 对于剩下的,还有其他的方式来做到这一点。 举例来说,如果你想补充一点,必须与正确的数据填充第一个新列,你可以做的是,在下面的步骤(简要说明):
- 添加列接受NULL值,使Django的开始写入该列,使新的项目将有正确的数据。
- 填充exsiting条目。
- 让Django的开始来自新列读书了。
要实现0停机,你必须至少有2台服务器+平衡器。 并依次更新。 如果你想同时更新 - 数据库和应用程序 - 并且有0停机时间 - 你必须有2台数据库服务器。 没有奇迹,没有银弹,和Django的你会不会从部署问题脱身。
文章来源: Deploying a (single node) Django Web application with virtually zero downtime on EC2