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