我在一台服务器上有一块 1TB 的磁盘,其他 4 台服务器经常通过 NFS 访问该磁盘,以通过 HTTP 分发文件。我发现中央服务器负载很高,我想将这些文件缓存在本地服务器上,因为它们很少更改。NFS 缓存是否合适,还是我应该考虑其他方法?
谢谢
答案1
NFS 方式:
如果客户端服务器上的空间很小,导致您无法保留所有大文件的完整副本(例如,您只想或需要缓存最常访问的文件),则 FS-Cache 可能会有所帮助。
有一些注意事项(如Red Hat 的文档):
- 从共享文件系统打开文件进行直接 I/O 将自动绕过缓存。这是因为这种类型的访问必须直接到服务器。
- 在 NFS 版本 2 和 3 上,无法从共享文件系统打开文件进行写入。这些版本的协议没有提供足够的一致性管理信息,以便客户端能够检测到另一个客户端对同一文件的并发写入。
- 因此,从共享文件系统打开文件进行直接 I/O 或写入都将刷新文件的缓存副本。FS-Cache 将不会再次缓存该文件,直到不再打开该文件进行直接 I/O 或写入为止。
- 此外,此版本的 FS-Cache 仅缓存常规 NFS 文件。FS-Cache 不会缓存目录、符号链接、设备文件、FIFO 和套接字。
此外,您需要在 NFS 客户端上运行特定类型的文件系统,以便为 FS-Cache 用于跟踪事物的文件系统属性提供所需的 FS 支持(带有 user_xattr 的 ext3、ext4、btrfs、xfs)。
rsync 方式:
另一种方法是使用 rsync 并在每个系统上保留文件的完整副本。如果这些内容只是定期更改(例如每天或每周),那么从管理和调试问题复杂性较低的角度来看,这可能对您更有利。
这样做的缺点是,您现在需要保留 N + 1 份副本,其中 N 是您需要在其上运行此程序的系统数量,并且您必须想出一种机制来定期处理 rsync(例如,脚本 + cron 等)。
答案2
我看到你在你的问题上加了标签squid
,所以你显然知道这一点。你是如何使用它的?我认为你的问题可以通过在反向代理(httpd-accelerator)模式。如果您已经正确设置了它,那么您就不必担心 NFS 方面。