将通用 Web 应用程序代码共享到多个 Web 服务器

Ari*_*e K 1 php web-server load-balancing

将通用 Web 应用程序代码共享到多个 Web 服务器的最佳方式是什么?

例如,我有一个包含用 PHP 编写的 Web 应用程序的目录。现在,我有多台机器可以提供相同的内容,每台机器都运行一个网络服务器,使用 TCP/IP 平衡器进行负载平衡。

对于这种情况,我还没有尝试过 NFS。但是根据Slow NFS transfer performance of small files,传输性能会很慢,因为涉及到很多[小]文件。

编辑:我想将所有文件集中存储在一个位置,因此网络服务器将立即读取代码更新。

Tom*_*meh 6

我将概述几个选项,以通过 NFS 方法展示实时代码的替代方案

“最佳”策略取决于您选择的代码部署策略,可能是以下策略之一:

  • 在实时系统上编辑- 开发人员在一个中心位置更改/更新应用程序,然后实时机器接收更改(这听起来像您的场景)
  • 从源代码控制导出的代码- 开发人员对源代码控制系统进行更改,然后运行程序将代码导出到负载平衡池中的所有机器(或等待机器自己执行更新)
  • 通过包系统部署的代码- 开发人员对源代码控制系统进行更改并创建存储在存储库中的软件包(例如,通过 APT 或 YUM)。开发人员运行一个程序来强制负载平衡的机器从存储库安装新软件。

“最佳”策略还取决于应用程序的可用性要求:

  • 理论上 100% 正常运行时间- 在进行软件更新时应用程序仍然可用(使用您建议的方法,但注意原子性问题:在更新期间,您的 PHP 应用程序可能包含_once() 旧文件和新文件的混合)
  • 接受预定维护- 在进行软件更新时,应用程序会暂时脱机(无原子性问题)

在上述选项中,我个人会选择包部署方法。但是,对于 Web 请求,通过 NFS 共享少量文件可以很好地工作:与 Internet 相比,NFS 引入的延迟很小。但在此之前,请考虑以下缺点:

  • 考虑正在平衡哪些系统资源:如果您使用多台机器来平衡 CPU 使用率,那么设置可能会运行良好。但是,如果您使用多台机器来平衡 IO,那么通过 NFS(或其他方式)将其转移到一台机器上可能是不明智的。
  • 考虑文件服务器的故障:如果保存文件的机器死机,它可能会使您的整个应用程序脱机(因为网络服务器无法读取文件)。在这种情况下,网络服务器往往会锁定等待,等待 NFS 恢复。

由于这些可能的障碍(IO 绑定文件服务器、网络服务器故障),我还建议定期将网络服务器与应用程序同步。将更改推送到多台机器应该只需要几秒钟。如果需要,您可以设置一些逻辑,例如:if (time() > 23:59:00) {use software in dir B} else {use software in dir A})。如果所有机器都必须运行相同的软件版本,这可能很有用,例如,如果您刚刚更改了数据库架构。

部署过程中的几秒钟延迟确实还不错。在实时系统上工作的开发人员肯定会注意到延迟,但无论如何开发人员都不应该编辑实时系统。