好吧,我希望这个问题足够独特,不会被视为另一个“LVM 和 RAID 之间有什么区别?”问题。开始吧...
我正在设置一个 Linux 服务器,它有一个驱动器笼,可以让我热插拔大约 6 个驱动器。我想要的特性是:
- 驱动器故障容忍度(所以...基本上是 RAID)
- 在线更换故障驱动器
- 驱动器空间利用率高(例如,如果我有 6 个 1TB 驱动器,则带有一个奇偶校验驱动器的 5TB 优于带有 6 个镜像的 1TB)
- 在整个驱动器空间内灵活分配卷(所以...... LVM)
- 问题在于:我还希望能够在将来尽可能地用更大的驱动器替换旧驱动器,同时尽量减少服务器的停机时间。
如果我仅有的希望能够通过用较小的驱动器替换驱动器来增加空间,我可以使用带有 lvreduce 的 LVM(当然,前提是我使用的是可收缩的 FS,如 Reiser 或 ext[2-4],并且当前 FS 可以收缩我想要拉出的驱动器的数量)。但这并没有给我任何冗余。
我能想到的第一个解决方案是同时实现冗余和更换驱动器的能力是将驱动器用作镜像对。一对将是 md0,下一对将是 md1,等等。然后,我会将它们添加到单个卷组中。当我想添加空间时,我会从卷组中减少一个 md* 设备,拉出两个驱动器,添加两个更大的驱动器,创建一个新的 md 镜像,然后将它们添加到卷组,扩展 FS,这样就完成了。
但这会将我的空间效率降低到 50%,因为每个物理驱动器都有自己的镜像。我只有 3TB……这会让我需要尽快更换更大的驱动器。
当然,我可以将它们作为 3 驱动器 RAID5 组插入,而不是镜像对。每 3 个驱动器将为我提供 2TB。因此,我总共可以获得 4TB,但现在我遇到了一个问题,为了拉从卷组中移除 md 设备,会占用更多空间(移除一个设备会占用 2TB 而不是 1TB)。这意味着我需要 FS 中更多的空闲空间,否则我无法像这样交换驱动器。
所以,这就是我被困住的地方。我知道的唯一一种通过异构驱动器大小和在线驱动器替换实现冗余的方法需要我在更高的空间效率和更高的空闲空间要求之间做出权衡,以便拉出一个驱动器(或一组驱动器)。
我是否遗漏了一些巧妙的技巧?
答案1
我认为您提出的建议(具有多个 RAID-1 PV 的 LVM)是正确的,除了一个细节:您不一定需要从 VG 中拉出 RAID 集来替换它:
- 在其中一个 RAID 组中交换一个磁盘(
mdadm
故障、移除、物理交换、重新添加) - 重建
- 交换第二个
- 重建
mdadm --grow
pvresize
当然,这假设您有良好的备份,并且您的单个磁盘在重建时不会损坏。
答案2
一种解决方案是依赖 ZFS 作为文件系统。但是它在 Solaris 和几种 BSD 变体中很常见,因此在 Linux 上没有必要。一种可能的解决方案是使用 Debian 中的 Debian/kFreeBSD 变体,即带有 GNU 用户空间的 BSD 内核。
ZFS 非常适合从 ZFS 池中动态分配存储。使用 6 个驱动器,您可以使用一个 RAID-2Z,这意味着 6 个驱动器中有两个可能会发生故障。但是,代价是您只能使用与 4 个驱动器对应的磁盘空间。还有其他可能性,因为在 ZFS 中,池由哪个驱动器配置构建并不重要。
看一眼