6

我想我并不完全了解部署过程。这是我所知道的:

  • 当我们需要进行热部署时——这意味着我们需要更改实时代码——我们可以通过重新加载模块来实现,但是
  • imp.reload是个坏主意,我们应该重新启动应用程序而不是重新加载更改的模块
  • 理想情况下,运行代码应该是您的代码存储库的克隆,并且在您需要部署的任何时候,您只需拉取更改

现在,假设我有多个wsgi应用程序实例在反向代理后面运行nginx(在 8011、8012 等端口上)。而且,我们还假设我5每秒收到请求。

现在在这种情况下,我应该如何在应用程序的所有运行实例中更新我的代码。

  • 如果我停止所有实例,然后更新所有实例,然后重新启动它们——我肯定会丢失一些请求
  • 如果我一个一个地更新每个实例——那么实例将处于不一致的状态(一些将运行旧代码,一些将运行新代码),直到所有实例都被更新。现在,如果一个请求命中一个更新的实例,然后一个后续(和相关的)请求命中一个较旧的实例(尚未更新)——那么我会得到错误的结果。

有人可以彻底解释像这样繁忙的应用程序是如何热部署的吗?

4

2 回答 2

2

对于在像nginx这样的负载均衡器后面的几个热实例的部署,我喜欢使用像Fabric这样的工具进行滚动部署。

  1. Fabric 将您连接到服务器 1
  2. 关闭网络服务器
  3. 通过使用您的 VCS 或使用新应用程序传输 tarball 来部署更改
  4. 启动网络服务器
  5. GOTO1 并连接到下一个服务器。

这样你就永远不会脱机,而且它是无缝的,因为 nginx 知道当一个网络服务器在尝试循环到它时被关闭,并且会转移到下一个,并且一旦节点/实例备份它将重新投入生产使用。

编辑:

您可以使用 nginx 中的ip_hash模块来确保来自一个 IP 地址的所有请求在会话期间都发送到同一台服务器

该指令导致请求根据客户端的 IP 地址在上游之间分发。哈希的关键是客户端的 C 类网络地址。此方法保证客户端请求将始终传输到同一服务器。但是如果这个服务器被认为不工作,那么这个客户端的请求将被转移到另一个服务器。这使得客户端很可能总是连接到同一台服务器。

这对您意味着,一旦您的网络服务器更新并且客户端连接到新实例,该会话的所有连接将继续转发到同一服务器。

这确实使您处于以下情况

  1. 客户端连接到站点,从服务器 1 获得服务
  2. 在客户端完成他们正在做的任何事情之前更新服务器 1
  3. 客户可能处于不确定状态?

这种情况引出了一个问题,您是否从您的 API/站点中删除了可能使客户端处于不确定状态的内容?如果您所做的只是更新 UI 元素或添加页面等,但不更改任何后端 API,那么您应该没有任何问题。如果您要删除 API 函数,您最终可能会遇到问题。

于 2012-06-19T13:10:33.070 回答
0

你不能让一半的服务器离线(比如将它们从负载平衡池中拉出来)然后更新它们。然后让他们重新上线,同时拉下另一半。然后更新这些并将它们重新联机。

这将确保您保持在线状态,同时确保您永远不会同时在线拥有应用程序的旧版本和新版本。是的,这意味着您的网站在此期间将以一半的容量运行。但这可能没问题?

于 2014-07-12T11:00:40.413 回答