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

guc*_*cki 6 storage high-availability block-device

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

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

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

我知道 iscsi 和 drbd,但两者似乎都没有提供我正在寻找的东西。或者我错过了什么?

Chr*_*ell 2

我要说的第一件事是,您可能需要重新调整对复杂性的期望。仅您问题的主题包括:

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

这些中的每一个通常都是至少中等复杂性的主题。将这三者结合起来,不做一点工作就无法完成它。

我认为您缺少的是能够切实满足您的所有要求并且仍然简单或容易的东西。您的某些要求即使不是完全矛盾,也很难一起实现。单独完成可以没有太大困难,但将它们放在一起就变得棘手了。

我将遍历每个要求并提供评论:

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

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

只要支持客户端的块设备的所有存储节点都没有宕机,客户端的块设备就不会出现故障

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

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

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

单个主控(仅用于元数据)就可以了

作为一个概念,当您处理文件系统中的文件块时,这比处理块设备要好得多。大多数实现类似功能的系统都是使用文件系统接口或伪文件系统接口来实现的。

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

另外,您需要记住,作为一般规则,对于给定的硬件集,容错和高性能是同一频谱的两端。当增加冗余时,性能就会降低。最简单的例子是如果您有 4 个磁盘。您可以在 RAID0 中对所有 4 个磁盘进行条带化,以获得最佳性能,也可以在所有磁盘上将相同的数据复制 4 次。前者将为您提供最大的性能,后者将为您提供最大的冗余。在这之间有各种权衡,例如 4 磁盘 RAID5,或我个人偏好的 4 磁盘 RAID10。

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

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

更新:上面假设您想​​要构建自己的解决方案。如果您有足够大的预算,您可以购买 SAN/NAS 解决方案,虽然它可能与您上面描述的不完全一样但可以被视为具有相同粗略功能的黑匣子。