pnfs 的元数据服务器 (MDS) 集群

pnfs 的元数据服务器 (MDS) 集群

长话短说

pNFS 似乎是对集中式共享存储进行多个并发访问的好方法,但它有一个问题:提供 NFS 元数据(元数据服务器,MDS)的单个 NFS 服务器存在单点故障。如果 MDS 变得无法访问,不久之后共享存储也将变得无法访问。

为了避免这个问题,我希望建立一个 MDS 集群。如何才能实现这一目标不拒绝客户端对集中存储的直接 I/O

HA-NFS 有一些解决方案,但它们都破坏了直接 I/O pNFS 功能。


故事很长

我正在探索(多个)选项来为 OpenStack 环境实现共享“数据存储”。

我目前正在研究将存储从集中式存储系统用作块存储的场景。在这些场景中,会出现问题,因为大多数文件系统无法安全地同时挂载多次,至少在多个主机存在并发读写 I/O 时。

解决多挂载问题的一种可能方法是将 NFS 4.1 与 XFS 结合使用。从这个版本开始,有pNFS,它允许NFS客户与存储系统直接基于块的 I/O。根据内核文档,目前只有XFS支持nfs块布局。

通过这种方法,NFS 服务器照常将共享导出到客户端,但当客户端实际进行 I/O 时,它直接与存储系统交互,而不是与 NFS 服务器交互。特别是对于虚拟机的用例(可以假设一次仅在一台主机上运行),这似乎非常适合。

将共享导出到客户端的 NFS 服务器是单点故障。如果发生故障,则任何其他客户端都无法挂载该共享,并且无法访问未打开的文件。解决方案是建立一个 NFS 服务器集群,如果其中一台服务器发生故障,另一台服务器可以接管。 pNFS 服务器如何集群?

有很多关于借助 gluster 或 drbd 集群 NFS 的教程。基于这些助手的解决方案意味着数据 I/O 在 NFS 客户端和 NFS 服务器之间执行。然而pNFS的有趣之处在于,数据I/O是在NFS客户端和中央存储系统之间执行的,而不是NFS服务器。因此,使用这两种方法中的任何一种都破坏了 pNFS 的重要特征,因此不能被视为解决方案。

我非常感谢现有的这方面的工作。但我也很重视评论......

我自己的理论

尽管 pNFS 已经存在并稳定了几年,但周围并没有太多噪音。我掌握的少量信息告诉我:

  • 大多数/所有状态都属于客户。这意味着如果 NFS 服务器出现故障,状态不会立即丢失。

  • 由于客户端直接与存储系统执行 I/O,因此正在进行的数据流不会因服务器宕机而中断。

有了这些信息,我猜想以下可能是一种可行的方法:

  1. 创建共享LUN并使用一台服务器在其上放置XFS。
  2. 在每个 NFS 服务器上设置内核 nfsd。
  3. 让这组 NFS 服务器都以只读方式挂载同一 LUN。
  4. 在每台服务器上创建一个ramdisk
  5. 使用 DRBD 在所有 ramdisk 上设置同步镜像
  6. 使用同步镜像 ramdisk 通过将其挂载到 /var/lib/nfs 来存储 NFS 服务器状态(并重新启动 nfs 服务)
  7. 用于keepalived将一组服务器组织成具有 VIP 的主动/被动集群,其中一次只有一台服务器处于活动状态。
  8. 使用keepalived通知机制,让主用NFS服务器以可读写方式挂载LUN,让其他服务器以只读方式挂载LUN。

“主”NFS 服务器上的负载相当低,并且与虚拟机的变化直接相关。因此,在中小型虚拟化环境中,一次只有一台 NFS 服务器似乎不是问题。

按照 NFS 4.* 的工作方式,同步镜像 NFS 服务器状态应允许另一台服务器在主服务器发生故障后接管。当使用 gluster 作为共享服务器状态目录时,我相信这甚至应该允许主动/主动集群,但我无法找到任何相关的工作。

即使镜像服务器状态不起作用,当另一台服务器接管主动/被动集群时,冲击也不应该那么大,因为 I/O 是直接通过中央存储系统执行的。正确的?

相关内容