寻求分布式、容错、网络化的块存储

寻求分布式、容错、网络化的块存储

我正在寻找一个分布式、容错的网络存储系统,它可以在客户端上公开块设备(而不是文件系统)。

  • 客户端的块设备应同时写入多个存储节点
  • 只要不是所有支持它的存储节点都发生故障,客户端的块设备就不会发生故障
  • 当存储节点发生故障或被添加/删除时,主节点应自动重新分配存储的数据
  • 单个主控(仅用于元数据)即可

因此理想情况下,该架构将与 moosefs 非常相似(http://www.moosefs.org/),但它不会暴露使用 fuse 客户端安装的真实文件系统,而是暴露客户端上的块设备。

我知道 iscsi 和 drbd,但两者似乎都不能提供我想要的东西。还是我错过了什么?

答案1

根据以上要求,头孢可能就是你所追求的。 http://ceph.newdream.net/

Ceph 提供了一个分布式、符合 POSIX 标准的文件系统,您可以使用Rados 块设备. 这在现代 Linux 内核 (2.6.37+) 中直接实现。

甚至还有Qemu/KVM 存储驱动程序这意味着您可以将 Ceph 文件系统挂载为虚拟机磁盘。

大型网络托管公司Dreamhosthttp://dreamhost.com/)依赖于Ceph。

答案2

首先我想说的是,你可能需要重新设定对复杂性的期望。仅你的问题就包括:

  • 分散式
  • 容错
  • 网络块设备

单独考虑其中任何一个,通常都是一个至少具有中等复杂度的话题。如果将这三个问题结合起来,那么不花一点功夫是无法完成的。

我认为你缺少的是可以切实满足你所有要求并且仍然简单或容易的东西。你的一些要求很难一起实现,即使不是完全矛盾的。单独实现起来并不困难,但把它们放在一起就很棘手了。

我将逐一介绍每个要求并提供评论:

客户端的块设备应同时写入多个存储节点

这可以通过使用底层冗余存储来实现。冗余可以在“存储节点”级别实现,使用冗余本地存储(RAID 等),或者在网络级别通过将数据复制到多个节点来实现。

只要不是所有支持它的存储节点都发生故障,客户端的块设备就不会发生故障

与前者一样,这可以通过存储冗余轻松实现。这部分要求存储采用“网络 RAID1”类型的设置。

当存储节点发生故障或被添加/删除时,主节点应自动重新分配存储的数据

事情变得困难的地方就在这里。您明确表示要导出块设备。除非您复制整个块设备,否则此功能在后端会变得更加困难。使用块设备时,服务器端功能无法查看文件并复制组成该文件的块,就像它在提供文件系统接口时可以做到的那样。这使得服务器端要么将整个块设备视为一个整体,并需要将每个块完整地复制到一个单独的位置,要么必须实现大量古怪的智能才能获得良好的可靠性、一致性和性能。目前很少有系统实现这样的功能。

单个主控(仅用于元数据)即可

从概念上讲,处理文件系统中的文件块时,这种方法的效果比处理块设备时好得多。大多数实现此类功能的系统都是通过文件系统接口或伪文件系统接口来实现的。

一般来说,你要做出决定。你可以将远程存储作为文件系统,在这种情况下,你将访问高级接口,并允许存储端做出决定并为你处理低级细节,或者你将存储作为块设备,在这种情况下您将对这些功能负责,或者至少是大多数。您获得的存储处于较低级别,这为您实现这些低级功能(分布式、容错等)留下了更多工作。

此外,您需要记住,一般来说,对于给定的一组硬件,容错性和高性能是同一频谱的两端。随着冗余度的增加,性能会降低。最简单的例子是,如果您有 4 个磁盘。您可以将所有 4 个磁盘分成 RAID0 以获得最大性能,或者您可以将相同的数据复制到所有 4 个磁盘上 4 次。前者将为您提供最大性能,后者将提供最大冗余度。两者之间存在各种权衡,例如 4 磁盘 RAID5,或者我个人偏爱的 4 磁盘 RAID10。

如果我要组装一些能满足您要求的东西,我可能会使用 iSCSI 或 ATA Over Ethernet(AoE)导出所有磁盘,并使用 MD 软件 RAID 或 LVM 镜像(或两者结合)来获得我需要的冗余级别。

是的,需要进行一些手动设置和维护,但它可以让你精确控制事物,以达到所需的容错和性能水平。DRBD 是另一种适合它的选项,但如果你要处理多个“存储节点”,我可能会放弃它。

更新:以上内容假设您想要构建自己的解决方案。如果您有足够的预算,您可以购买 SAN/NAS 解决方案,虽然它可能不是确切地正如您上面所描述的,可以被视为具有相同粗略功能的黑匣子。

答案3

您正在描述 SAN。如果您想自己构建它,您可能可以,但我只能向您指出 ZFS 的方向。如果您最终从存储供应商那里购买了一个,您将需要改变描述它的方式。以下是您所要求的内容的细分:

  • 客户端的块设备应同时写入多个存储节点“:这相当于主动/主动多路径环境中的多个控制器。每次写入只会发送到一个节点,但是,如果您正确配置本地多路径驱动程序,则多次写入将倾向于采用多条路径。
  • 只要不是所有支持它的存储节点都发生故障,客户端的块设备就不会发生故障“:这相当于不存在单点故障。每个节点必须能够处理整个基础设施的流量,并且应该有两个不同的网络用于将 IO 发送到没有故障点的盒子。如果您使用光纤通道存储设备,这意味着有两个交换机并且不将它们相互连接。
  • 当存储节点发生故障或被添加/删除时,主节点应自动重新分配存储的数据“:这相当于两件事。首先,驱动器故障恢复。如果驱动器发生故障,存储应从奇偶校验或副本重新创建数据(取决于存储是否使用 RAID 或类似技术),并在良好的磁盘上替换丢失的磁盘内容。其次,它还指控制器故障。如果控制器发生故障,主机应该能够继续运行,就像什么都没发生一样,并且所有正在进行的 IO 都应该得到无故障处理。这是通过缓存镜像来实现的,或者确保写入操作在安全保存到多个缓存之前不会被确认。

如果我对您的环境有更多的了解,我会将其添加到您的列表中,但这将能够帮助您入门。

相关内容