用户数据存储在两个相当大的(> 1 PB)OpenStack Swift存储集群中。让他们成为集A和集B。
此外,还有一些PoP需要与该数据进行交互。这些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|
+------------------+ +------------------+
问题是:在写svfs挂载点之前,如何设置缓存服务器以使用所有可用资源(指定的缓存分区,RAM)来积极地缓存尽可能多的数据?基本上可以归结为:如何在Linux中缓存目录?
如果可能的话,应该合并读写操作,并且在可能的情况下,FUSE请求中的块大小至少应为128k,以便在高速缓存需要写入群集时最大程度地提高吞吐量并最小化延迟。
附录1:我已经在一些服务器上将集群安装模块从svfs切换到S3QL。S3QL的缓存稍微提高了性能。我将尝试获取一些性能数据以确保完整性。