ZFS 热备用不工作

ZFS 热备用不工作

我的虚拟机中已设置以下休闲的 ZFS 测试池:

    NAME        STATE     READ WRITE CKSUM
    pool        DEGRADED     0     0     0
      mirror-0  DEGRADED     0     0     0
        sdb     ONLINE       0     0     0
        sdc     ONLINE       0     0     0
    spares
      sdd       AVAIL

我正在尝试测试更换不可用驱动器的能力自动地在 zfs 池中。例如,如果由于某种原因驱动器从系统中移除,备用驱动器可以在驱动器移除后立即取代它。我已经配置了一个spare驱动器,从我所做的阅读中,我的理解是这应该可以实现我的目标。我还将标志设置autoreplaceon告诉 zfs 更换检测到的任何坏驱动器。当从 vm 中移除驱动器时,说sdb并重新检查 zfs 的状态,它看起来像以下内容:

    NAME        STATE     READ WRITE CKSUM
    pool        DEGRADED     0     0     0
      mirror-0  DEGRADED     0     0     0
        sdb     UNAVAIL      0     0     0
        sdc     ONLINE       0     0     0
    spares
      sdd       AVAIL

设备sdb不可用,但备用设备从未更换。有什么方法可以让我的用例正常工作吗?

答案1

介绍

首先,对于在 Ubuntu 16.04 上遇到同样问题的人来说,这是一个持续存在的错误,据我所知,到目前为止尚未修复。您可以访问 github 对话这里查看我引用的错误。其次,我是以 Linux 爱好者和中级用户的身份撰写此帖子的,我不是开发人员,目前也不以 Linux 为职业。话虽如此,我将尽我所知提供有关此问题的信息。

问题:

软件包中内置的热备功能zfsonlinux目前无法正常工作,如手册页中所述。zpool手册页:

Hot Spares
   ZFS allows devices to be associated with pools as "hot spares".
   These devices are not actively used in the pool, but when an active
   device fails, it is automatically replaced by a hot spare.

注意:冷备用(不会自动更换的备用)功能有效,但仅限于由mirrors或组成的配置raidz's。如果您的配置如下:

NAME      STATE     READ WRITE CKSUM
pool      ONLINE       0     0     0
  sdb     ONLINE       0     0     0
  sdc     ONLINE       0     0     0
spares
  sdd     AVAIL

一旦驱动器发生故障,您将无法用备用驱动器替换它,因为存在错误pool I/O is currently suspended

尝试的解决方案:

这是我尝试过的解决方案的列表,并得到了以下结果:

  1. ZFS 自动替换:事实证明,根据zpool手册页和我的理解,该autoreplace功能不是用备用驱动器替换损坏的驱动器,而是用在其位置找到的任何新设备替换损坏的驱动器本身。zpool手册页:

    If set to "on", any new device, found in the same physical location
    as a device that previously belonged to the pool, is automatically 
    formatted and replaced.
    

    autoreplace有这个功能很好,但我认为不需要它来实现热备件的功能。除了通过手册页,我无法确认这一点,因为我无法让备件工作。

  2. ZED.rc:后来我从对话中发现github需要在 内设置ZED_SPARE_ON_CHECKSUM_ERRORS和标志。ZED_SPARE_ON_IO_ERRORSzed.rc@用户121391在回复这篇文章时说,zed 服务/守护进程决定了池的状态以及根据该状态需要做什么。您可以通过运行来查看 zed.d 的运行情况zpool events。有关 Linux 上 zed.d 的更多信息这里在设置标志、重新启动并重新配置新池(以防万一)之后,我对热备用的测试再次出现负面结果。

  3. ZED.d 脚本:在@Michael Kjörling在评论中,他提到了一些与 ZED 一起打包的脚本,这些脚本是为了帮助解决热备用方案而编写的。我确实在中找到了这些脚本/etc/zfs/zed.d。您可以在 github 页面上查看这些脚本这里。根据我对 zed.d 的理解,当触发事件时,ZED 守护进程会根据其状态运行其中一个脚本。话虽如此,我确实尝试手动运行io-spare.shchecksum-spare.sh,并且根据它们执行的时间以及池的未改变状态来判断,它们似乎没有正确运行。也许这是问题的潜在根源。

我的计划

对于 Ubuntu 16.04 的 ZFS 用户,据我所知,目前似乎没有解决这个问题的方法。我计划继续使用 ZFS 配置mirroredraidz(RAID5),具体取决于我在测试中获得的性能。(镜像会更快,但我想看看速度raidz)热备件会增加这两种配置的冗余度,但不幸的是,我们必须等到项目的进一步开发zfsonlinux

答案2

快速搜索可找到下列的

在 [Open]Solaris 上,这由事件守护进程处理。自动替换开/关只是告诉守护进程是否进行替换。在 FreeBSD 上,自动替换设置默认不执行任何操作 - 您需要编写 devd 规则来处理触发实际替换。我不确定 Linux 会做什么,但我确信它可以添加到 systemd

看起来使用 ZoL 你也可以使用零排放发展,ZFS 事件守护进程,用于此。

相关内容