我们的小型计算集群有 3 个计算节点和 1 个文件服务器。文件服务器有大约 70TB 的数据可供 3 个计算节点访问。所有 3 个计算节点都有 3 个 4TB SSD,目前处于闲置状态。
目前,计算节点使用 NFS 访问文件服务器上的文件,并且所有服务器都连接到 1 Gbps 网络。是否有适当的方法可以从这些 SSD 中创建“缓存池”,以便无需始终从文件服务器访问文件?或者这甚至是一个正确的解决方案,还是我应该只使用本地 SSD 缓存?
GlusterFS
我曾尝试使用这些 SSD 并FS-Cache
在 GlusterFS 之上进行设置,但它没有缓存任何内容。
答案1
fscache 是你想要的,但请注意,它不会缓存打开的文件写作除非你运行的是 NFS v4(请参阅https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/6/html/storage_administration_guide/fscachelimitnfs)。事实上,打开一个文件进行写入将使该文件的所有缓存数据无效。
在 NFS 共享上创建一些小的测试文件,然后尝试cat
从 NFS 客户端计算机读取它们(或打开它们进行读取的其他操作)。如果您在配置的缓存目录中看不到任何内容,则可能是您尚未完全配置或启用 fscache。
我通常会为每个 NFS 客户端配置自己的本地缓存。这不会完全阻止网络访问——fscache 仍然需要客户端定期与服务器通信,以确保缓存一致性、锁定等,但它确实减少了必须传输的文件常用部分的数据块数量。
至于创建分布式缓存,您可能看不到任何性能改进,因为缓存的目的是尽可能避免网络流量(主要是数据读写;元数据、一致性等仍然必须通过网络)。GlusterFS 之类的东西会增加更多的网络流量。但是,可能值得针对您的具体情况进行测试。
答案2
您面临的问题是关于文件锁定和缓存一致性的问题。
因为您使用的是基于 NFS 的解决方案,所以 NFS 服务器本身需要管理哪些客户端锁定了任何给定的文件,并且一旦进行了更改,就需要确保它自己的缓存保持一致(通常通过刷新它自己的文件缓存,就像以前一样)。
如果您在客户端计算机上创建了每个节点的缓存层,他们就必须与服务器协作以确保其缓存文件的副本与对文件的任何写入同步 - 并且我不相信有任何可用的协议可以实现这一点。
显然,各个节点可以使用某种形式的版本标识符(可能是最后写入的日期/时间戳)来缓存这些文件,并在读取任何缓存之前检查它是否没有改变,但这通常是内存缓存,如果使用本地磁盘,则需要编写一些非常具体的内容来同步它。
您可能对分布式文件系统方法的理解是正确的,因为锁定和缓存一致性由节点本身以分布式方式管理,而不是由集中式服务器管理。虽然目前有许多不同的分布式文件系统,但我知道 Ceph 和其他一些系统允许节点主导的共享文件系统对象/文件的缓存。