在服务器中的多个 SSD 之间实现负载平衡

在服务器中的多个 SSD 之间实现负载平衡

我希望我的服务器中有一个跨多个 SSD 或 HDD 的卷。当我将文件写入此卷时,文件将以随机或循环方式整体写入其中一个驱动器。如果驱动器的某个块发生故障 - 我将丢失它所保存的一个文件。如果驱动器全部发生故障 - 我将丢失写入它的所有文件,但该卷仍然可用并包含来自其他驱动器的文件。显然,RAID 不适合这里。不过,这项任务似乎很简单 - 有人能指出正确的 Linux 方向吗?

答案1

所以您想在物理上不同的文件系统之间自动分配数据,而不为数据提供冗余?

Linux 没有内置的方法来做到这一点。您可以使用 MD 或 ZFS 设置 RAID,但不存在不同文件系统之间自动分发和跟踪文件的功能。这将是应用程序级别(即用户空间)的功能,您需要寻找执行此操作的应用程序或编写自己的应用程序。

例如:Apache Cassandra 支持为其分配多个数据目录/位置。通常,它是定义不同的文件系统。Cassandra 会跟踪数据的位置,并尝试均匀分布数据,本地服务器上的这些位置之间没有冗余。Cassandra 会通过网络进行复制。

您可能能够使用 GlusterFS 来实现此效果。在具有多个块的单个服务器上创建一个分布式卷(每个块都是不同的文件系统),然后在本地安装该卷。我从未尝试过这个,所以您的里程可能会有所不同。

答案2

我不确定为什么你会想要这个而不是传统的 RAID。但也许copies=ZFS 文件系统可能对你有用。

答案3

我的印象是你正在寻找一个联合文件系统您有两个(或更多)磁盘,每个磁盘都有自己的文件系统:

/hdd1             /hdd2
|                 |
+-- /dir1         +-- /dir1
|   |             |   |
|   +- file2      |   +- file4
|                 |   +- file2
+-- file1         |
|                 +-- file5
+-- /dir2         |
    |             +-- /dir3
    +- file3          |
                      +- file6

将它们组合在一个视图/叠加层中,即两者的联合、组合:

/hdd_common
|
+-- /dir1
|   |
|   +-- file2  
|   +-- file4
|
|-- /dir2
|   |
|   + file3
|
+-- /dir3
|   |
|   +-- file6
|
+-- file1
+-- file5

A保险丝基于示例,以及上述 ASCII 艺术的来源是硬盘文件系统维基百科文章还列出了更多。

这满足了您始终将整个文件放在单个磁盘上的要求,而且与 JBOD 阵列不同,单个磁盘故障不会导致整个数据集丢失。但也不能保证写入会均匀分布。

答案4

正如 @HBruijin 指出的那样,这个问题最好通过 FUSE 来解决。原因是您的存储系统是分层的。RAID 和 JBOD 在文件系统层之下工作,因此它们不知道“文件”实际上是什么。它们在磁盘块中工作,因此它们无法保证文件不会被拆分。文件系统无法在没有显著复杂性的情况下自行完成此任务,因为它的元数据需要在多个磁盘之间拆分,并且它需要在丢失其中一个驱动器的情况下生存下来。这在文件系统上方留下了一个层,这样我们在每个驱动器上都有简单的可安装文件系统。这让我们只能使用 FUSE 作为解决方案

但是,Unionfs 总是写入特定位置,而不是随机或循环。因此,它不符合要求。应该特别注意这种情况。@HBruijin 对 mhddfs 的引用大部分是正确的,但实际上并没有以 OP 要求的任何方式进行负载平衡(尽管这只是通过使用随机和循环暗示的,并没有明确说明)。如果设置了足够低的限制,mhddfs 会写入具有最多可用空间的驱动器,如果您有一个大驱动器和一个小驱动器(没有负载平衡),则该驱动器可能始终是同一个驱动器。当然,由于它是 FUSE,因此更改源并进行循环(记住循环所有剩余可用空间足以容纳正在写入的文件的驱动器,而不是所有驱动器)。

相关内容