11

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

我读到的大多数答案都是“使用南方”或“使用织物”,但恕我直言,这些答案非常模糊。我实际上两者都用,但我仍然想知道如何尽可能地实现零停机时间。

一些细节:

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

我有一个...

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

  2. 实时服务器,随着用户帐户和用户数据而不断变化——所有这些都记录在 PostgreSQL 中。

当前部署策略:

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

停机时间开始。

实时克隆服务器迁移到与登台服务器相同的架构版本(使用南)。只创建了我希望从实时中保留的表和序列的转储(特别是用户帐户及其数据)。完成此操作后,转储将上传到登台克隆服务器。从实时保留的表被截断并插入数据。随着我直播服务器中数据的增长,这个时间显然在不断增加

加载完成后,活动服务器的弹性 IP 将更改为临时克隆(因此它已被提升为新活动)。实时实例和实时克隆实例被终止。

停机时间结束

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

你会推荐我看什么?

更新

我有一个典型的 Django 单节点应用程序。我希望有一个更深入地解决 django 特定问题的解决方案。例如,使用 Django 对具有自定义路由器和复制的多个数据库的支持的想法已经闪过我的脑海。有一些与我希望回答会涉及的问题相关的问题。

4

4 回答 4

4

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

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

于 2012-05-23T06:55:34.990 回答
2

不应迁移实时服务器。该服务器应该可以从两个登台服务器 server0 和 server1 访问。最初,server0 处于活动状态,并且对 server1 进行了更改。当您想更改软件时,请切换实时服务器。至于新内容,不应该在登台服务器上。那应该在实时服务器上。将包含内容表版本号的列添加到表中,并修改您的代码库以使用正确的内容版本号。开发软件以根据需要将旧版本复制到具有更新版本号的新行。将当前版本号放在 server0 和 server1 上的 settings.py 中,这样您就可以在选择数据时有一个中心位置供软件参考,或者创建一个可以更新以获得正确版本内容的数据库访问应用程序。当然,

这种方法将消除任何停机时间。您将不得不重写您的一些软件,但是如果您找到一种通用的访问方法,例如您可以修改的数据库访问方法,您可能会发现它的工作量并不大。从长远来看,创建一个专门支持系统即时切换的系统的前期投资将大大减少工作量,并且可以扩展到任何内容大小。

于 2012-05-25T23:10:35.017 回答
1

如果我理解正确,问题似乎是您的应用程序已关闭,而数据正在与架构一起恢复到新数据库。

为什么你首先要创建一个新服务器?为什么不就地迁移数据库(当然,在您对迁移进行广泛测试之后),一旦完成,更新代码并“重新启动”您的进程(例如,gunicorn 可以接受 HUP 信号,这将使它重新加载应用程序而不丢弃队列中的连接)。

许多迁移根本不需要锁定数据库表,所以这是安全的。对于其余的,还有其他方法可以做到这一点。例如,如果您想添加一个必须首先填充正确数据的新列,您可以按照以下步骤进行操作(简要说明):

  1. 将列添加为接受 NULL 值并使 django 开始写入该列,以便新条目将具有正确的数据。
  2. 填充现有条目。
  3. 让 django 也从新列开始阅读。
于 2012-05-23T16:30:58.797 回答
0

要实现 0 停机时间,您必须至少拥有 2 台服务器 + 平衡器。并按顺序更新它们。如果你想同时更新——数据库和应用程序——并且停机时间为 0——你必须有 2 个数据库服务器。没有奇迹,没有灵丹妙药,django 不会让你摆脱部署问题。

于 2012-06-01T10:02:28.123 回答