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

我正在寻找一个分布式的,容错的networking存储系统,它暴露了客户端上的块设备(而不是文件系统)。

  • 客户端的块设备应该同时写入多个存储节点
  • 只要不是所有支持它的存储节点都closures,客户端的块设备就不应该失效
  • 当存储节点失败或被添加/移除时,主服务器应自动重新分配存储的数据
  • 一个主(仅用于元数据)是好的

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

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

基于上述要求, Ceph可能就是你以后的事情。 http://ceph.newdream.net/

Ceph提供分布式,符合POSIX的文件系统,您可以使用Rados块设备作为块设备进行安装。 这是直接在现代Linux内核(2.6.37 +)中实现的。

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

主要的networking托pipe公司Dreamhosthttp://dreamhost.com/ )依靠Ceph。

首先我要说的是,您可能需要重置对复杂性的期望。 单独针对你的问题的主题包括:

  • 分散式
  • 容错
  • networking块设备

其中的每一个通常都是一个至less适度复杂的话题。 把他们三人结合在一起,而你没有一点工作就不能完成。

我认为你所缺less的东西是可以实现你所有要求的东西,而且简单易行。 如果不是完全矛盾的话,你们的一些要求很难一起实施。 个别可以完成没有太多的困难,但把它们放在一起就是棘手的地方。

我将贯穿每个要求并提供意见:

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

这可以通过在引擎盖下使用冗余存储来完成。 冗余可以在“存储节点”级别使用冗余本地存储(RAID等)完成,或者在networking级别通过将数据复制到多个节点来完成。

只要不是所有支持它的存储节点都closures,客户端的块设备就不应该失效

与以前一样,这很容易在存储冗余的情况下完成。 这部分将需要在“networkingRAID1”types设置中实现存储。

当存储节点失败或被添加/移除时,主服务器应自动重新分配存储的数据

这是事情变得困难的地方。 你特别说明你想要一个块设备输出。 这使得这个function在后面更难,除非你正在复制整个块设备。 使用块设备时,服务器端function不能查看文件并复制构成该文件的块,就像它提供文件系统接口时一样。 这使得服务器端将整个块设备作为一个整体进行处理,并且需要将每个块全部复制到一个单独的位置,或者需要实现许多古怪的智能来获得良好的可靠性,一致性和性能。 很less有系统现在就实现这样的function。

一个主(仅用于元数据)是好的

作为一个概念,当处理文件系统中的文件块时,这比块设备更有效。 大多数实现类似这样的系统都是通过文件系统接口或伪文件系统接口来实现的。

一般来说,你正在做出决定。 您将远程存储作为文件系统,在这种情况下,您将访问高级界面,并允许存储方为您做出决策并处理底层细节,或者将存储作为块设备,在这种情况下, 你要负责这些function ,或者至less大部分function。 您将存储级别降低,并为您实现这些低级function(分布式,容错等)留下了更多的工作。

此外,您还需要记住,一般来说,容错和高性能是与给定的一组硬件相同频谱的两端。 在增加冗余时,会降低性能。 最简单的例子是如果你有4个磁盘。 您可以将所有4个磁盘分成RAID0以获得最佳性能,也可以在所有磁盘上复制相同的数据4次。 前者会给你最大的性能,后者最大的冗余。 在这之间有各种各样的权衡,比如4个磁盘RAID5,或者我个人的偏好,4个磁盘RAID10。

如果我把一些符合要求的东西放在一起,我可能会导出所有带有iSCSI或ATA以太网(AoE)的磁盘,并使用MD软件RAID或LVM镜像(或两者结合)来获得冗余级别我需要。

是的,有一些手动的工作来设置和维护它,但它可以让你精确地控制事物达到容错和性能要求的水平。 DRBD是另一个可以融入其中的select,但是如果你要处理的不仅仅是一些“存储节点”,我可能会把它传递下去。

更新:上面假设你想要build立你自己的解决scheme。 如果您的预算足够大,可以购买SAN / NAS解决scheme,虽然可能不会像上面所描述的那样,但可以将其视为具有相同function的黑匣子。

您正在描述一个SAN。 如果你想自己构build它,你可能可以,但是我不能帮助你,而不是指向ZFS的方向。 如果您最终从存储供应商那里购买一个,您将需要改变您描述的方式。 以下是你所要求的细节:

  • 客户端的块设备应该同时写入多个存储节点 ”:这相当于主动/主动多path环境中的多个控制器。 每写只会被发送到单个节点,但如果您正确地configuration本地多path驱动程序多个写入将倾向于采取多个path。
  • 只要不是所有支持它的存储节点都被closures,客户端的块设备就不应该失效 ”:这相当于没有单点故障。 每个节点必须能够处理整个基础设施的stream量,并且应该有两个不同的networking用于将IO发送到不共享故障点的盒子。 如果使用光纤通道存储设备,则这意味着有两个交换机,而不是将它们彼此连接起来。
  • 当存储节点失败或被添加/删除时,主服务器应该自动重新分配存储的数据 ”:这相当于两件事情。 首先,驱动器故障恢复。 如果一个驱动器发生故障,存储器应该从奇偶校验或副本(取决于存储器是否使用RAID或类似的东西)重新创build数据,并将丢失的磁盘的内容replace为正常的磁盘。 其次,它也是指控制器故障。 如果一个控制器发生故障,主机应该能够继续,就好像什么都没发生一样,并且所有的空中IO应该被处理而没有失败。 这是通过caching镜像来完成的,或者确保写入不被确认,直到它被安全地保存到多个caching。

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