分布式、并行、容错文件系统

分布式、并行、容错文件系统

选择太多了,不知道从哪里开始。我的要求如下:

  • 在 Linux 上运行
  • 大多数文件大小在 5-9 MB 之间。还有相当多的 jpg 图像(100px x 100px)。
  • 所有文件都需要通过 http 提供。
  • 冗余 - 理想情况下,它将提供与 RAID 5 类似的 75% 的空间效率(在 RAID 5 中,这将这样计算:对于 4 个相同的磁盘,25% 的空间用于奇偶校验 => 效率为 75%)
  • 必须支持几 PB 的数据
  • 可扩展
  • 在商品硬件上运行

此外,虽然这些品质不是“要求”,但我还寻找以下品质:

  • 稳定、成熟的文件系统
  • 巨大的动力和支持
  • ETC

我想了解哪种文件系统最适合给定的要求。我组织中的一些人倾向于 MogileFS,但我对该项目稳定性和发展势头并不确信。根据我有限的研究,GlusterFS 和 Lustre 似乎得到了更好的支持...

有什么想法吗?

答案1

如果是我,我会使用 GlusterFS。当前版本非常稳定,我知道 HPC 和互联网领域的一些大型安装人员在其生产系统中依赖它。您基本上可以根据需要通过布置组件来定制它。与 Lustre 不同,它没有专用的元数据服务器,因此可以最大限度地减少中心故障点,并且更容易扩展设置。

不幸的是,我认为没有一种简单的方法可以在不降低性能的情况下满足 75% 的标准。

它确实可以在商用硬件上运行,但是使用 Infiniband 互连时性能才真正出色。幸运的是,IB 的价格现在确实相当低廉。

你可能想看看可扩展信息学以及他们的 Jackrabbit 产品作为解决方案。他们的硬件支持 GlusterFS,而且他们的解决方案的价格肯定可以与从头开始组装的成本相媲美。

答案2

实际上,我认为没有那么多现实的选择。按偏好顺序我的选择如下:

  1. 亚马逊 S3。满足您的所有要求,也满足您的可选品质。拥有非常好的正常运行时间和支持记录。它不是内部的;但这真的不是一个你可以解决的要求,fx 使用VPN 访问或者只是传统的 HTTPS……如果您觉得 WAN 延迟和亚马逊的定价合适,S3 确实会是我的首选。如果定价不适合您,那么我怀疑 DYI 解决方案是否真的会便宜很多......
  2. 移动文件系统似乎完全符合您的要求。MogileFS 的活动并不多,但这主要是因为它的工作方式符合其(相对较少的)用户的预期。
  3. 光泽确实伟大的技术其背后是一个常规的本地 POSIX 文件系统(如果这对您有用的话),并且多年来一直在不断更新。最大的问题是整个 Sun - Oracle 合并是否会影响 Lustre。长期来看,如果 Sun 打好牌,那么拥有虚拟文件系统和 Lustre 合并可能会带来非常好的结果...现在,我认为 Lustre 主要用于学术和商业 HPC 计划,而不是互联网应用——这可能不正确,但如果 Lustre 在互联网应用方面做得很好,那么他们肯定没有很好地营销这一事实...

在我看来,Hadoop 分布式文件系统 (HDFS) 无法满足您的要求。HDFS 非常棒,但其类似 bigtable 的方法意味着其可访问性不如上述文件系统。当然,如果您真正寻求的是大规模可扩展性和长远眼光,那么 HDFS 可能正合适——雅虎、Facebook 和其他公司都投资于 Hadoop 的发展。

一条评论,上述大多数系统将整个文件复制到 2-3 个节点以实现冗余。这比奇偶校验编码/RAID 方案占用更多的空间,但它在规模上是可管理的,而且这似乎是每个人都采用的解决方案。所以你不会得到你提到的 75% 的效率......

答案3

它可能无法满足您的所有要求,尤其是空间效率(默认情况下,它将每个块分成 10 个份额,其中任何 3 个都可以提供恢复(尽管这可以调整)),但您仍然可能想看看太浩湖

它主要是为备份而设计的,但人们已经在其基础上开发(并且仍在开发)了很多非常有趣的无备份应用程序。例如,其中一位开发人员在其上托管了他的博客。

GPL,用 Python 编写。据我回忆,它已经包含在 Ubuntu 中了。

答案4

补充 Kamil 的回应,您可以在存储节点发生故障后通过尝试读取 GFS 上的每个文件来强制在 GlusterFS 中进行数据复制 - 据我所知,没有更简单的方法来判断哪些文件需要复制。

下面的命令可以提供帮助——它基本上调用 head -c1每个文件并将成功/失败记录到/tmp/gfs-check.log

find /mnt/gfs ! -type d \( \( -exec head -qc1 '{}' + \
    -fprintf /tmp/gfs-check.log "%p OK\n" \) -o \
    -fprintf /tmp/gfs-check.log "%p ERROR\n" \) > /dev/null

相关内容