与多个 Web 服务器共享通用 Web 应用程序代码的最佳方法是什么?
例如,我有一个目录,其中包含用 PHP 编写的 Web 应用程序。现在,我有多台机器将提供相同的内容,每台机器运行一个 Web 服务器,使用 TCP/IP 平衡器进行负载平衡。
我还没有尝试过 NFS 来实现这个场景。但是根据小文件的 NFS 传输性能缓慢,由于涉及许多[小]文件,传输性能将会很慢。
编辑:我想将所有文件集中存储在一个位置,这样网络服务器将立即读取代码的更新。
答案1
我将概述几个选项,以展示替代方案通过 NFS 方法实时代码。
“最佳”策略取决于您选择的代码部署策略,可能是以下之一:
- 在实时系统上编辑- 开发人员在一个中心位置更改/更新应用程序,然后实时机器会接收更改(这听起来像您的场景)
- 从源代码控制导出的代码- 开发人员对源代码控制系统进行更改,然后运行程序将代码导出到负载平衡池中的所有机器(或等待机器自己执行更新)
- 通过包系统部署代码- 开发人员对源代码控制系统进行更改,并创建存储在存储库中的软件包(例如通过 APT 或 YUM)。开发人员运行程序强制负载平衡机器从存储库安装新软件。
“最佳”策略还取决于应用程序的可用性要求:
- 理论上 100% 正常运行时间- 在进行软件更新时应用程序仍然可用(使用您建议的方法,但要注意原子性问题:在更新期间,您的 PHP 应用程序可能会 include_once() 混合新旧文件)
- 已接受计划维护- 进行软件更新时,应用程序会短暂离线(无原子性问题)
在上述选项中,我个人会选择包部署方法。但是,对于 Web 请求,通过 NFS 共享少量文件效果很好:与 Internet 相比,NFS 引入的延迟很小。但在执行此操作之前,请考虑以下缺点:
- 考虑正在平衡哪些系统资源:如果您使用多台机器来平衡 CPU 使用率,那么该设置可能效果不错。但是,如果您使用多台机器来平衡 IO,那么通过 NFS(或其他方式)将其转移到一台机器上可能并不明智。
- 考虑文件服务器故障:如果保存文件的机器死机,可能会导致整个应用程序脱机(因为 Web 服务器无法读取文件)。在这种情况下,Web 服务器往往会锁定,等待 NFS 恢复。
由于这些可能出现的障碍(IO 绑定文件服务器、Web 服务器故障),我还建议定期将 Web 服务器与应用程序同步。将更改推送到多台机器只需几秒钟。如果需要,您可以设置一些逻辑,例如:if (time() > 23:59:00) {使用目录 B 中的软件} else {使用目录 A 中的软件})。如果所有机器都必须运行相同的软件版本,例如,如果您刚刚更改了数据库架构,这可能会很有用。
部署期间几秒钟的延迟其实不算太糟糕。在实时系统上工作的开发人员肯定会注意到延迟,但开发人员无论如何都不应该编辑实时系统。
答案2
如果内容不变,那么任何传输方式都可以,甚至 NFS 也可以。如果先将文件打包成 tar,然后再解压,传输速度会非常快。
当然,如果您需要定期传输大量小文件,那么您可能没有任何解决方案 - 您的网络服务器将始终无法提供最新文件(或更糟的是,所需的文件)。
如果您确实想建立一种将文件部署到中央服务器的方法,然后让它们自动传输到其他服务器,您可以设置一个 rsync 传输到服务器,这样只有您更改的文件才会被传输(如果您使用 rsync 守护程序,它将使用 rsync 的协议,并且几乎不需要任何时间,很可能只需几秒钟)。
其他人使用的一个好方法是将 Web 文件存储在版本控制系统中,然后使用该系统将文件导出到其他服务器,然后您只需更新文件,vcs 就会用新版本替换已更改的文件。
顺便说一句,NFS 不太适合小文件,但其他的都不是。问题更多的是网络延迟而不是其他。但这仍然不应该阻止你使用它,除非你有大量文件要传输,否则它不会太慢。你可以尝试使用 cifs 传输而不是 nfs,我为我的 Windows 服务器这样做,因为我在那里获得了更好的大文件性能。
答案3
Arie,我的 Webdev 公司拥有大量由我们的网站共享的库。这些网站在不同数据中心的少数生产服务器上运行。
由于服务器位于不同的数据中心,我们无法从单个集中式低延迟位置提供库。相反,我们使用 Webistrano(出色的 Capistrano 部署工具的 GUI)将库直接从我们的 SVN 存储库部署到所有服务器。Capistrano 同时部署到所有服务器,并且只有在所有服务器成功部署后,它才会切换符号链接以指向新的部署目录。否则它会在所有服务器上进行回滚。
换句话说,更新几乎在同一秒在所有服务器上执行,或者根本不执行。事务性或原子性或任何你想叫它的东西。
部署脚本末尾的最后一个任务是正常重启 Apache,以便刷新存储了先前路径的所有 PHP 缓存(real_path、Zend Framework 等)。
它运行良好,非常安全,而且由于所有文件都存储在每台服务器本地,因此延迟非常低。它也非常简单;只需单击 Webistrano 中的“部署”即可。
答案4
您可以查看 sshfs。基本上,您将有一个中心位置,其他服务器将其作为本地文件夹安装。
例如(将服务器作为目录安装)。
sshfs server.with.content:/home/arie/local_folder
现在,您可以像访问本地文件夹一样访问另一台服务器。额外的优势是数据传输是加密的。
谷歌 sshfs 和 fuse。