ZFS管理手册:第六章scrub和Resilver

ZFS通过scrubbing来检测和纠正静默数据错误,这一过程类似ECCRAM,可以在不停机的情况下执行。使用校验和算法检查存储池中的每个块,确保数据一致性。ZFS还能自我修复,如果存在冗余,它可以使用其他磁盘上的良好数据来修复损坏的块。在磁盘更换后,resilvering过程能快速重建数据,保持池的健康状态。定期执行scrubbing对于维护数据完整性至关重要。
摘要由CSDN通过智能技术生成

标准验证

在GNU/Linux中,我们有许多检查文件系统的实用程序,用于验证磁盘上的数据完整性。例如程序“fsck”。然而,它有几个主要的缺点。首先,如果您打算修复数据错误,则必须将磁盘离线。这意味着要停机。您必须在fsck之前使用“umount”命令卸载磁盘。对于根分区,这意味着要从另一种介质进行引导,如CDROM或U盘。根据磁盘大小的不同,停机时间可能需要数小时。其次,文件系统(如ext3或ext4)对底层数据结构(如LVM或RAID)一无所知。一个磁盘上可能只有一个坏块,但另一个磁盘上可能有一个完好的块。不幸的是,Linux上的软RAID不知道哪一块个好的哪一块是坏的,从ext3或ext4的角度来看,如果从包含好的块的磁盘读取,它将获得正确的数据,而从包含坏块的磁盘读取就会得到已损坏的数据,而且没法控制从哪个磁盘读取数据,并修复损坏的数据。在标准的GNU/Linux文件系统上,这些错误被称为“静默数据错误”,而且您对这些错误束手无所。

ZFS Scrubbing

对于Linux上的ZFS,检测和纠正静默数据错误是通过清理磁盘来完成的。这在技术上类似于ECC RAM,如果错误驻留在ECC DIMM中,您可以找到另一个包含好数据的寄存器,并使用它来修复坏寄存器。这是一种已经存在了一段时间的老技术,但令人惊讶的是,在标准的日志记录文件系统套件中没有这种技术。此外,就像您可以在实时运行的系统上擦除ECC RAM一样,有了ZFS,您就可以在没有停机的情况下,也能够清理磁盘。

当ZFS对您的池执行清理时,它会根据已知的校验来检查存储池中的每个块。默认情况下,使用适当的算法从上到下对每个块进行校验和。目前,这里使用的是“fletcher 4”算法, 它一种256位的算法,而且它的性能很好。这可以更改为使用SHA-256算法,尽管可能不建议这样做,因为计算SHA-256校验和比fletcher 4更昂贵。但是,由于SHA-256,损坏的数据块有1/2256或1/1077的机会散列到相同的SHA-256校验和。这是一个0.00000000000000000000000000000000000000000000000000000000000000000000000000001%的机会。作为参考,使用市场上最可靠的硬件,未修复的ECC内存错误将更频繁地发生在大约50个数量级上。因此,当清理数据时,如果校验匹配,则您有一正确的数据块,但是如果它不匹配,那么这数据块已经损坏。

存储池不是自动执行的。您需要手动完成此操作,强烈建议您定期执行此操作。scrubbing数据的建议频率取决于底层磁盘的质量。如果您有SAS或FC磁盘,则每月一次就足够了。如果你有消费级的SATA或SCSI,你应该每周做一次。您可以使用以下命令轻松安排擦除:

# zpool scrub tank
# zpool status tank
  pool: tank
 state: ONLINE
 scan: scrub in progress since Sat Dec  8 08:06:36 2012
    32.0M scanned out of 48.5M at 16.0M/s, 0h0m to go
    0 repaired, 65.99% done
config:

        NAME        STATE     READ WRITE CKSUM
        tank        ONLINE       0     0     0
          mirror-0  ONLINE       0     0     0
            sde     ONLINE       0     0     0
            sdf     ONLINE       0     0     0
          mirror-1  ONLINE       0     0     0
            sdg     ONLINE       0     0     0
            sdh     ONLINE       0     0     0
          mirror-2  ONLINE       0     0     0
            sdi     ONLINE       0     0     0
            sdj     ONLINE       0     0     0

errors: No known data errors

正如您所看到的,您可以在scrub执行过程中获得改操作的状态。进行清理可能会严重影响磁盘和需要它们的应用程序的性能。因此,如果出于任何原因需要停止清理,可以使用 scrub 的 -s 参数。但是,您最好还是应该让擦洗继续完成。

# zpool scrub -s tank

您应该在您的根用户的crontab中放置类似于以下内容的内容,它将在每周日凌晨02:00执行一次清理:

0 2 * * 0 /sbin/zpool scrub tank

自愈数据

如果您的存储池正在使用某种冗余,那么在scrub时ZFS不仅会检测静默数据错误,而且如果其他磁盘上存在良好的数据,它还会纠正这些错误。这就是所谓的“自我修复”,如下图所示。在我的RAIDZ帖子中,我讨论了如何使用RAIDZ使用奇偶校验和重建算法自我修复数据。我要把它简化一点,只用一个双向镜。假设应用程序需要一些数据块,并且在这些块中,其中的某个块已损坏。ZFS如何知道数据已损坏?通过检查块的SHA-256校验和,如前所述。如果一个块上的校验和不匹配,它将在镜像中查看我的另一个磁盘,看看是否可以找到一个好的块。如果是,则将好块传递给应用程序,然后ZFS将修复镜像中的坏块,以便它还传递SHA-256校验和。因此,应用程序将始终获得良好的数据,并且您的池将始终处于良好、干净、一致的状态。
small-zfs-self-healing

Resilvering Data

Resilvering Data 与将数据重建或重新同步到新磁盘到数组中的概念相同。然而,对于Linux软RAID、硬RAID控制器和其他RAID实现,并没有区分哪些块实际处于活动状态,哪些处于非活动状态。因此,重建需要从磁盘的开始处开始,直到到达磁盘的末尾才结束。因为ZFS知道RAID结构和文件系统元数据,所以我们可以聪明地重建数据。与其在没有存储活动块的空闲磁盘上浪费时间,我们可以只关注那些活动块。如果您的存储池只有部分空间被填满,这可以大大节省时间。如果池只填满了10%,则意味着仅在10%的硬盘空间工作。因此,对于ZFS,我们需要一个新的术语,而不是“重建”、“重新同步”或“重建”。在这种情况下,我们将重建数据的过程称为 resilvering

不幸的是,磁盘会坏掉,需要更换。如果您的存储池中有冗余,并且可以承受一些故障,即使池将处于“降级”模式,您仍然可以向应用程序发送数据和从应用程序接收数据。如果您拥有在系统处于活动状态时支持热插拔的磁盘,您可以在不停机的情况下更换磁盘(你很幸运)。如果没有,您仍需要识别故障磁盘并将其更换。如果您的池中有许多磁盘,例如24个,这可能是一项繁琐的工作。然而,大多数GNU/Linux操作系统供应商,如Debian或Ubuntu,都提供了一个名为“hdparm”的实用程序,它允许您发现池中所有磁盘的序列号。您可以运行如下内容:

# for i in a b c d e f g; do echo -n "/dev/sd$i: "; hdparm -I /dev/sd$i | awk '/Serial Number/ {print $3}'; done
/dev/sda: OCZ-9724MG8BII8G3255
/dev/sdb: OCZ-69ZO5475MT43KNTU
/dev/sdc: WD-WCAPD3307153
/dev/sdd: JP2940HD0K9RJC
/dev/sde: /dev/sde: No such file or directory
/dev/sdf: JP2940HD0SB8RC
/dev/sdg: S1D1C3WR

/dev/sde似乎是我的已损坏的磁盘。系统中所有其他磁盘都可以获取到序列号,唯独这个没有。因此,我可以在存储阵列中通过排除,找出未打印的序列号,它就是我的坏磁盘。在这种情况下,我找到了序列号“JP2940HD01VLMC”。我拉出磁盘,用一个新磁盘替换它,并查看是否重新填充了/dev/sde,其他磁盘仍然在线。如果是这样,我已经找到了我的磁盘,可以将其添加到池中。这实际上在我的两个个人管理程序上已经发生了两次。这个过程很快,不到10分钟硬盘就已经重新在线了。

要将池中的失效磁盘替换为新磁盘,可以使用“REPLACE”子命令。假设新磁盘也将自身标识为/dev/sde,那么我将发出以下命令:

# zpool replace tank sde sde
# zpool status tank
  pool: tank
 state: ONLINE
status: One or more devices is currently being resilvered.  The pool will
        continue to function, possibly in a degraded state.
action: Wait for the resilver to complete.
 scrub: resilver in progress for 0h2m, 16.43% done, 0h13m to go
config:

        NAME          STATE       READ WRITE CKSUM
        tank          DEGRADED       0     0     0
          mirror-0    DEGRADED       0     0     0
            replacing DEGRADED       0     0     0
            sde       ONLINE         0     0     0
            sdf       ONLINE         0     0     0
          mirror-1    ONLINE         0     0     0
            sdg       ONLINE         0     0     0
            sdh       ONLINE         0     0     0
          mirror-2    ONLINE         0     0     0
            sdi       ONLINE         0     0     0
            sdj       ONLINE         0     0     0

resilver类似于使用软RAID进行重建。它会在新磁盘上重建数据块,直到镜像处于完全健康状态。查看resilver的状态可以让您了解改操作何时可以完成。

确定池问题

可以通过传递“-x”参数来快速确定一切是否正常运行,而不需要“zpool status”命令的完整输出。这对于无需复杂逻辑即可进行解析的脚本非常有用,因为如果出现故障,脚本可能会向您发出警报:

# zpool status -x
all pools are healthy

“zpool status”命令中的行为您提供了有关池的重要信息,其中大多数都是不言而喻的。它们的定义如下:

  • pool : 池的名字
  • state : 池目前的健康状况。该信息仅说明池是否有进行池复制的能力。
  • status : 对池存在问题的描述。如果没有发现问题,则不会显示该字段。
  • action : 修复错误的建议操作。如果没有发现问题,则不会显示该字段。
  • see : 对包含详细修复信息的知识文章的引用。在线文章的更新频率超过本指南的更新频率,应参考这些文档以了解最新的修复过程。如果没有发现问题,则不会显示该字段。
  • scrub : 标识 scrub 操作的当前状态,其中可能包括上次scrub完成、正在进行的scrub的日期和时间,或不需要执行scrub操作。
  • errors : 识别已知数据错误或未知数据错误。
  • config : 描述池的设备和配置情况,以及设备的状态和错误信息。状态可以是以下状态之一:ONLINE, FAULTED, DEGRADED, UNAVAILABLE, 或者 OFFLINE。如果状态根本不是在线,那么池的容错能力就已经受到了影响。

状态栏的“READ”、“WRITE”和“CHKSUM”列的定义如下:

  • NAME : 池中每个VDEV的名称,以嵌套顺序显示。
  • STATE : 池中每个VDEV的状态。该状态可以是上述“config”字段中的任何状态。
  • READ : 发出读请求时发生I/O错误。
  • WRITE : 发出写请求时发生I/O错误。
  • CHKSUM : 检验错误。在处理读请求时,会返回错误的数据。

结论

定期scrub数据可确保存储池中的数据块保持一致。尽管擦除可能会给希望读取或写入数据的应用程序带来压力,但它可以在未来省去数小时的来修复错误。此外,由于您可能在任何时候都有“损坏的设备”(请参阅http://docs.oracle.com/cd/E19082-01/817-2271/gbbvf/index.html中有关使用ZFS损坏的设备的信息),因此正确了解如何修复设备以及更换设备时会发生什么,这对存储管理至关重要。当然,关于这个主题我还有很多可以讨论的内容,但这至少应该向您介绍scrub和resilve的概念。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值