天天看点

zfs pool self healing and scrub and pre-replace "bad"-disks

zfs的又一个强大之处, 支持坏块的自愈 (如果使用了冗余的话,如raidz1, raidz2, raidze, ... 并且正确的块可通过ecc重新计算出的话.). 

同时zfs具备类似ecc dimm的校验功能, 默认使用sha-256 checksum.

使用scrub来检测zpool底层的块设备是否健康, 对于sas或fc硬盘, 可以一个月检测一次, 而对于低端的sata, scsi设备则最好1周检测一次.

这些可以放在定时任务中执行, 例如每天0点1分开始执行一次scrub.

对于检测到的指标不好的盘, 可以提前更换(使用zpool replace).

指标 :

例如, 使用raidz1冗余, 创建一个zp pool.

拷贝一些文件到dataset.

使用zpool scrub检查这个pool.

关闭一个正在执行的scrub任务 : 

接下来要测试一下在线替换scrub检查到问题的块设备, 我这里使用删除一个zfs.disk来模拟坏盘.

但是因为使用了raidz1, 所以删除disk1后还能查询. (从校验数据中计算出原始数据. raidz1允许坏1块盘)

新建一个文件, 用来替换被我删掉的zfs.disk1文件, 新增的这个文件可以与zfs.disk1同名, 也可以不同名. 

使用zpool replace替换坏盘 : 

使用status -x参数查看pool的健康状态

注意如果是真实环境中的硬盘替换的话, 支持热插拔的硬盘可以直接替换硬盘, 然后使用zpool replace替换.

对于不能热插拔的硬盘, 需要关机替换硬盘, 再使用zpool replace替换掉坏盘.

查看坏盘对应的设备号(或序列号, 因为更换硬盘时需要拔下硬盘后现场对比一下序列号, 以免弄错).

hdparm -i, 对比zpool status中的设备名.

[参考]

1. http://docs.oracle.com/cd/e26502_01/pdf/e29007.pdf

2. http://www.root.cz/clanky/suborovy-system-zfs-konzistentnost-dat/

3. https://pthree.org/2012/12/11/zfs-administration-part-vi-scrub-and-resilver/

4. https://pthree.org/2012/12/05/zfs-administration-part-ii-raidz/