如何使用Nginx负载平衡更新一个Web服务器,而另一个正在响应?

我正在寻找我公司项目的选项和解决scheme,我们可以在多个服务器上托pipe我们的网站,我们可以使用负载平衡。 主要的问题是,当我更新网站,我需要重新启动服务器。 我们的Web项目是用Djanog / Python编写的,每次推送更新时都需要重启uWSGI。 目前,我们正在单台服务器上运行我们的网站,并且在客户端使用应用程序时很难更新/重新启动。 我一直在寻找互联网上的解决scheme,我在DigitalOcean的网站上find了一篇很好的文章。 你可以在这里阅读更多。

我们也希望将我们的数据库从运行在同一个应用程序服务器上的数据库中分离出来,并在特定的机器上使用,还需要使用主从设置进行复制 所以我的问题是,例如,我们的网站example.com运行在Web服务器/ IP 101和102.这两个站点都连接到数据库IP 201.所以现在,当我推动更新服务器101,并重新启动应用程序,我希望102能够处理所有的请求而不会抛出任何错误或任何东西。 101更新后,我希望它能够重新启动并处理所有的请求,而我更新服务器102.我也将有相同的数据库设置,所以201和202作为主人,一个正在更新,另一个正在进行。

我们目前的服务器运行Ubuntu和Nginx,MySQL提供Django应用程序。 我可能不熟悉行业术语,所以我正在解释这个问题。 我不是在谈论像谷歌,微软或Facebook这样的公司,因为我知道他们有这个问题的定制解决scheme,但任何人都可以引导我寻找条款或任何解释,文章,post或教程,我可以阅读处理这个解决scheme

谢谢

你有两个主要的select来closures服务器

  • 您可以将服务器从Nginx负载平衡器中取出并重新加载configuration
  • 您可以依靠运行状况检查来停止向不可用的服务器发送stream量。 信息在这里 。

您可能需要小心数据库。

  • 它会成为主/奴隶吗? 如果是这样,当主人closures,你不能做更新
  • 你会在两个数据库之间复制吗? 这会造成一致性问题吗? 你需要粘稠的会议吗?
  • 将一个数据库专用于一个Web服务器? 这使更新更容易,但复制更困难。
  • 如果您在一个数据库上更新数据库模式,那么将其恢复为如何与复制一起工作?
  • 你可以使用蓝色/绿色的环境? 即一个networking/数据库服务器更新为新的应用程序版本,那么您将越来越多的stream量发送给它。 这只适用于无状态的Web服务器。

我可能会做Nginx健康检查,应用程序服务器知道两个数据库与故障转移代码,数据库复制和蓝/绿色部署。 一定要testing失败的情况。

在AWS中,您只需使用:

  • 一个弹性负载平衡器
  • 两个无状态的Web服务器
  • AWS关系数据库服务。 这保持一个主和一个同步备份。 但是,它不能解决数据库模式更新的问题。 蓝/绿在这里会有所帮助。

更新

数据库应该位于app / web服务器的相同位置以减less延迟。 如果您愿意,您可以将整个环境转移到云服务,但是您需要了解环境,而不是充电,希望获得最佳效果。

关于数据库主/从设置,我可能不是合适的人build议。 你必须考虑多主,主/从,没有主人的环境。 然后是NoSQL的考虑,在某些情况下,这可能是一个很好的select。

我可能会看看主/从,两个应用程序服务器看着一个数据库,另一个保持最新。 当你想更新模式(希望很less)时,你可以停止复制,更新从机,然后将新版本的应用程序指向旧的从机,即新主机。 在云中,您可能只需为每个部署构build新的环境 – 服务器就像牛,而不是宠物。

更新一台服务器,而另一台服务器仍在服务的方法称为“蓝绿色部署”。 您可以在这里阅读Martin Fowler博客的相关信息: https : //martinfowler.com/bliki/BlueGreenDeployment.html

假设你有web1和web2服务器

您需要采取的步骤是:

  1. 从nginx负载平衡器中移除/禁用web1,这样您的客户将只能访问web2
  2. 用新代码更新您的web2服务器,然后重新启动web2 webserver。 在web2中testing应用程序,确保它正在提供最新的代码
  3. 将web2添加/启用到nginx负载平衡器。 现在您的客户有50/50的机会获得新网站或旧网站。
  4. 对web1服务器重复步骤1-3
  5. 现在你的客户只会得到新的网站

我对数据库并不熟悉,但是如果您使用主从风格进行数据库设置,则可以将您的网站configuration为只能读取数据的维护模式,而不能从从属服务器写入数据。 更新主设备后,将应用程序中的某个variables指向主设备,然后启用读/写操作