用户数据存储在两个相当大的(>1 PB)OpenStack Swift 存储集群上。让它们集群A和B 组。
此外,还有几个接入点需要与这些数据交互。这些 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 机制(如cachefs
aka cachefilesd
)不起作用并且你有预算,你可以研究一下西太平洋区域预报系统(广域文件服务)。这些设备专为 NFS(和 CIFS)的积极缓存而设计,旨在隐藏通常涉及 WAN 链接的延迟。
答案2
我确实不是这个领域的专家(但它确实很有趣!)。
我最近主要关注的是 LVM 的 dm-cache,以及用于缓存部分的 SSD。这里有一个来自 readhat 的示例文本,它有一个很好的概述,但它与 RH 无关:https://www.redhat.com/en/blog/improving-read-performance-dm-cache