将公共 Web 应用程序代码共享给许多 Web 服务器的最佳方式是什么?
例如,我有一个目录,其中包含用 PHP 编写的 Web 应用程序。现在,我有多台机器将提供相同的内容,每台机器都运行一个网络服务器,使用 TCP/IP 平衡器进行负载平衡。
对于这种情况,我还没有尝试过 NFS。但是根据Slow NFS transfer performance of small files,传输性能会很慢,因为涉及很多[小]文件。
编辑:我想将所有文件集中存储在一个位置,因此网络服务器将立即读取对代码的更新。
我将概述几个选项,以通过 NFS 方法显示实时代码的替代方案。
“最佳”策略取决于您选择的代码部署策略,可能是其中之一:
“最佳”策略还取决于应用程序的可用性要求:
在上述选项中,我个人会选择包部署方法。但是,对于 Web 请求,通过 NFS 共享少量文件可以很好地工作:与 Internet 相比,NFS 引入的延迟很小。但在您这样做之前,请考虑以下缺点:
由于这些可能的障碍(IO 绑定文件服务器、网络服务器故障),我还建议定期将网络服务器与应用程序同步。将更改推送到多台机器应该只需要几秒钟。如果需要,您可以设置一些逻辑,例如:if (time() > 23:59:00) {使用目录 B 中的软件} else {使用目录 A 中的软件})。如果所有机器都必须运行相同的软件版本,例如,如果您刚刚更改了数据库模式,这可能很有用。
部署期间的几秒钟延迟确实不算太糟糕。开发实时系统的开发人员肯定会注意到延迟,但是开发人员无论如何都不应该编辑实时系统。
如果它的内容没有改变,那么任何传输方法都可以,即使是 NFS。如果您先 tar 文件然后解压缩它们,则传输速度会非常快。
当然,如果您需要定期传输大量小文件,那么您可能没有任何解决方案 - 您的 Web 服务器将始终与最新文件(或更糟糕的是,所需文件)过时。
如果您确实想设置一种将文件部署到中央服务器的方法,然后让它们自动传输到其他服务器,您可以设置一个 rsync 传输到服务器,那么只有您更改的文件将被传输(如果您使用 rsync 守护进程,它将使用 rsync 的协议,并且几乎不需要任何时间,可能是几秒钟)。
其他人使用的一个好方法是将 web 文件存储在版本控制系统中,然后使用它将文件导出到其他服务器,然后您只需更新文件,vcs 就会用新版本替换更改的文件。
顺便说一句,NFS 对小文件不太好,但除此之外,没有什么好说的了。问题更多是关于网络延迟而不是其他任何事情。这仍然不应该让你停止使用它,除非你有一堆文件要传输,否则使用它不会太慢。您可以尝试使用 cifs 传输而不是 nfs,我为我的 Windows 服务器这样做,因为在那里我获得了更好的大文件性能。
Arie,我的 webdev 公司拥有大量由我们的网站共享的库。这些站点在不同数据中心的少数生产服务器上运行。
由于服务器位于不同的数据中心,我们无法从一个集中的低延迟位置为库提供服务。相反,我们使用 Webistrano(出色的 Capistrano 部署工具的 GUI)直接从我们的 SVN 存储库将库部署到所有服务器。Capistrano 同时部署到所有服务器,只有在所有服务器成功部署后,它才会切换符号链接以指向新的部署目录。否则,它会在所有服务器上回滚。
换句话说,几乎在同一秒或根本不执行更新在所有服务器上执行。事务性或原子性或任何您想称呼它的东西。
我们在部署脚本结束时的最后一项任务是优雅地重新启动 Apache,以刷新所有存储了先前路径的 PHP 缓存(real_path、Zend Framework 等)。
它工作得很好,非常安全,而且由于所有文件都本地存储在每台服务器上,因此延迟非常低。这也很容易;只需单击 Webistrano 中的部署。
你可以看看 sshfs。基本上,您将拥有一个中央位置,其他服务器将其安装为本地文件夹。
例如(将服务器挂载为目录)。
现在您可以像访问本地文件夹一样访问其他服务器。另一个优点是数据传输是加密的。
谷歌 sshfs 和 fuse。