如何设置缓存网络共享的 NFS 服务器?

如何设置缓存网络共享的 NFS 服务器?

用户数据存储在两个相当大的(>1 PB)OpenStack Swift 存储集群上。让它们集群AB 组

此外,还有几个接入点需要与这些数据交互。这些 PoP 中的服务器实际上是无盘的,这意味着没有用户数据存储在它们上面,也不会下载到它们上面。PoP 可以分为一般世界区域(例如北美南非欧洲中部等)。

有些 PoP 距离任何集群的 Swift 端点都相当远,这会导致不良延迟。为了在一定程度上缓解这种情况,我想在每个区域设置一个缓存网关服务器,它将缓存 r/w 请求到最近的集群。

目前,任何 PoP 中的客户端都通过永久安装的swift 虚拟文件系统,这是一个 FUSE 模块,它将 Swift Object Storage 安装为块设备(或多或少)。但是,svfs 一开始就不是那么稳定,将来,客户端应该通过 NFS 访问缓存服务器。

这是所需架构的一个分支的图表:

+------------------+                +------------------+    NFS   +------------------+
|    Cluster A     |     SVFS       |  Region 1 Cache  +---------->  R1 PoP a Client |
|                  +---------------->                  |          |                  |
|Persistent Storage|                |Ephemeral  Storage+----+     |Generates R/W Load|
+-----------------++                +------------------+    |     +------------------+
                  |                                         |
                  |                 +------------------+    | NFS +------------------+
                  |      SVFS       |  Region 2 Cache  |    +----->  R1 PoP b Client |
                  +----------------->                  |          |                  |
                                    |Ephemeral  Storage|          |Generates R/W Load|
                                    +------------------+          +------------------+

我熟悉设置 NFS 的基础知识和 svfs。

问题是:如何设置缓存服务器以使用所有可用资源(指定的缓存分区、RAM)在写入 svfs 挂载点之前尽可能积极地缓存尽可能多的数据?基本上可以归结为:如何在 Linux 中缓存目录?

如果可能的话,应该合并读写,并且 FUSE 请求中的块大小应该至少为 128k,以最大化吞吐量,并在缓存需要写入集群时最小化延迟。

附录1:我已将一些服务器上的集群挂载模块从 svfs 切换到 S3QL。S3QL 的缓存性能有所提高。我将尝试获取一些性能数据以确保完整性。

答案1

如果固有的 Linux 机制(如cachefsaka cachefilesd)不起作用并且你有预算,你可以研究一下西太平洋区域预报系统(广域文件服务)。这些设备专为 NFS(和 CIFS)的积极缓存而设计,旨在隐藏通常涉及 WAN 链接的延迟。

答案2

我确实不是这个领域的专家(但它确实很有趣!)。

我最近主要关注的是 LVM 的 dm-cache,以及用于缓存部分的 SSD。这里有一个来自 readhat 的示例文本,它有一个很好的概述,但它与 RH 无关:https://www.redhat.com/en/blog/improving-read-performance-dm-cache

相关内容