在我们的计算集群中,我们建立了一种简单但非常有效的方法来向计算节点提供数据。
存储系统提供与 LVS 合并的 LUN,在此基础上我们构建一个大 (80 TiB) XFS 分区。所有节点都连接到存储舱,可以毫无问题地识别 LVS 和 XFS。一个节点以读/写 (RW) 模式挂载 XFS,其他节点以只读 (RO) 模式挂载。
现在,问题是,每当通过 RW 节点写入新内容时,我都必须在其他节点中重新安装 XFS,以便 RO 节点能够看到新文件。此操作很简单:只需umount
在后面加上mount
.
umount /data
mount /data
但是这个解决方案不太好,因为这个 RO 节点可能正在读取数据,并且可能无法重新挂载或导致超时。我想知道是否也存在损坏。
那么,现在有人可以强制 XFS(以及操作系统,在本例中为 Centos 7)重新读取文件表而无需重新挂载吗?
答案1
XFS 不是集群文件系统,因此没有任何功能可以执行您所要求的操作(好吧,存在一个专有的——而且昂贵的——集群版本,称为 CXFS,不过那是另一个故事)。
正确的解决方案是使用集群文件系统。有很多这样的文件系统,但不幸的是,设置起来通常相当复杂。
CentOS 提供了 GFS2,在我看来设置起来相当困难;我个人更喜欢 OCFS2,它在 Debian 和衍生产品(可能还有 Oracle Linux)上设置和使用起来非常容易,而且性能非常好,只是缺少扩展属性和 ACL(这在集群设置中通常并不重要)。
例如参见本指南。
答案2
请不要这样做。正如@wazoox 回答(我投了赞成票)XFS 是不是集群文件系统。
至少你会遇到缓存一致性问题,如你最初的问题所述。但是,如果不使用-o norecovery,ro
选项进行安装(即:两个都 norecovery
和 ro
) 你有损坏文件系统的风险。
请考虑在“主”节点上使用 NFS 将存储导出到其他卷。如果无法执行此操作,您有两个选择:
用一个集群感知文件系统如 GFS2 或 OCFS2。集群感知文件系统支持来自不同运行内核的多个并发挂载,其中每个节点都有一个专用日志(即:“一个窗口”)用于写入主文件系统。请注意,各个节点之间所需的缓存一致性可能会显著降低性能,尤其是在读取已在另一个节点缓存中的内容时;
用一个横向扩展、分布式文件系统例如 Gluster、Ceph 等。集群与分布式文件系统的主要区别在于后者实际上是聚合在其他文件系统之间,每个文件系统都位于一个节点。这种聚合通常通过用户空间应用程序(即 gluster 客户端)完成,与传统的本地 POSIX 文件系统相比,它极大地损害了性能。但是,您可以聚合数十或数百个节点,随着节点的增加,容量和速度也会扩展。
虽然找到适合您特定情况的最佳方法的唯一方法是使用代表性工作负载测试各种方法,但我建议首先保持简单并尝试使用 NFS 共享。
答案3
您可以删除文件系统缓存并触发重新读取,如下所示:
echo 3 > /proc/sys/vm/drop_caches