Skip to main content

ZFS

Tips#

NOTES#

  • zpool
    • 存储池
      • 一组虚拟设备的合集
  • vdev - Virtual Device - 虚拟设备
    • disk
    • file
    • mirror
    • raidz
      • raidz 等同于 raidz1
      • raidz1
      • raidz2
      • raidz3
    • spare
    • log
    • cache
  • vdev 状态
    • DEGRADED
    • FAULTED
    • OFFLINE
    • ONLINE
    • REMOVED
    • UNAVAIL
  • 主要的守护进程
    • zfs-import
      • zpool import
      • 导入 pool
    • zfs-mount
      • zfs mount -a / zfs umount -a
      • 自动挂载目录, 挂载目录和是否挂载由 mountpoint 和 canmount 控制
    • zfs-share
      • zfs share -a / zfs unshare -a
      • 控制 iSCSI, NFS 或 CIFS 等网络共享
    • zfs-zed
      • ZFS Event Daemon
      • 监控 zfs 事件, 当有 zevent 时间触发时, 会执行相应类型的脚本

A raidz group with N disks of size X with P parity disks can hold approximately (N-P)*X bytes and can withstand P device(s) failing before data integrity is compromised. The minimum number of devices in a raidz group is one more than the number of parity disks. The recommended number is between 3 and 9 to help increase performance.

数据冗余#

  • Stripped
    • 无冗余
  • RAIDZ1
    • 等同于 RAID 5
    • 最大的磁盘空间
    • 当磁盘读写块大于 128K 时性能较好
    • 应该使用 2n+1 个磁盘
  • RAIDZ2
    • 等同于 RAID 6
    • 更好的容错
    • 比 RAIDZ1 更好的 MTTDL(mean time to data loss)
    • 应该使用 2n+2 个磁盘
  • RAIDZ3
    • 应该使用 2n+3 个磁盘
  • 镜像
    • 等同于 RAID 1
    • 使用更多的磁盘空间,但处理小数据的读写性能会较好.
    • 为了追求更好的性能可基于 RAIDZ 实现镜像,特别是针对交大的,不可缓存的随机读.
  • 每个 vdev 的磁盘不应该超过 12 个.建议每个 vdev 为 3-9 个磁盘.
  • 一个或多个磁盘组成 vdev
  • vdev 创建后不能修改
  • 一个或多个 vdev 组成 zpool
  • 磁盘损坏不会导致数据丢失
  • vdev 损坏导致 zpool 不可使用
  • 添加到 zpool 后的 vdev 不能被删除
  • ZIL(ZFS intent log) 损坏会导致数据丢失
  • L1ARC 是存储于 RAM 的读缓存,不应该超过 7/8 总 RAM
  • L2ARC 是存储于磁盘的读缓存
  • ZIL he L2ARC 存储于 SSD 但不应该存储于同一个 SSD
  • ZIL 主要用于同步写,大多数情况下不需要
  • L2ARC 大多数情况下不会提升太多的性能
  • 增加 RAM 是提升性能的最好方式

https://github.com/zfsonlinux/zfs/blob/master/module/zfs/dmu.c This statistic shows ZFS DMU (Data Management Unit) operations/sec. https://docs.oracle.com/cd/E27998_01/html/E48490/analytics__statistics__disk_zfs_dmu_operations.html

ARC buffer data (ABD). https://github.com/zfsonlinux/zfs/blob/master/module/zfs/abd.c

dnode dnode is a data structure which represents an object. An object can be a ZPL file or directory, a ZVOL volume, or several other types of internal metadata http://open-zfs.org/wiki/Documentation/DnodeSync

硬件#

Tutor#

准备工作#

# 创建工作区间mkdir -p ~/temp/zfs && cd $_# 使用文件作为存储, 实际使用时将文件替换为设备即可for i in {1..4};do dd bs=1M count=256 if=/dev/zero of=disk$i; donedd bs=1M count=256 if=/dev/zero of=sparedisk

zpool#

# 创建单个磁盘的 Pool, 没有数据冗余zpool create tank $PWD/disk1zpool list# 写入数据, OS X 的挂载点在 /Volumes/tank, Linux 为 /tankdd bs=1M count=64 if=/dev/random of=/tank/foo# 查看写入后的状态zpool list tank# 清除zpool destroy
# 镜像 Poolzpool create tank mirror $PWD/disk1 $PWD/disk2zpool status tankdd bs=1M count=64 if=/dev/random of=/tank/foo# 使 disk1 数据损坏dd bs=1M seek=10 count=1 conv=notrunc if=/dev/random of=disk1zpool scrub tankzpool status tank# 只是数据损坏磁盘没有异常, 可使用 clear 修复zpool clear tankzpool status tank# 使 disk1 磁盘损坏echo > disk1zpool scrub tank# 显示有一个磁盘不可用但依然可以操作zpool status tankdd bs=1M count=64 if=/dev/random of=/tank/bar# 替换损坏的磁盘zpool replace tank $PWD/disk1 $PWD/sparediskzpool status# 扩容,添加新的磁盘zpool add tank mirror $PWD/disk3 $PWD/disk4zpool listdd bs=1M count=100 if=/dev/urandom of=/tank/barzpool iostat -v tankzpool destroy tank

zfs#

zpool create tank mirror $PWD/disk1 $PWD/disk2zfs list tank# 创建新的文件系统zfs create tank/joeyzfs create tank/monicazfs create tank/rosszfs list -r tankdf -h |grep tank# 删除文件系统zfs destroy tank/rosszfs create tank/ross# 修改挂载点zfs set mountpoint=$PWD/monica tank/monica# 卸载文件系统zfs umount tank/joeydf -h |grep tank# 从新挂载zfs mount tank/joey# 获取所有属性# SOURCE: '-' 只读 default 默认值 local 本地修改的值 inherited 继承自父文件系统的值 temporaryzfs get all tank/joeyzfs get -Hp -o name,property,value used,available tank/joey

# 限制配额zfs set quota=50m tank/joey# 设置预留zfs set reservation=25m tank/joeyzfs get -r quota tankzfs get -r reservation tank
# 启用压缩zfs set compression=lz4 tank/joeyzfs get -r compression tank# 使用词典测试压缩# 在 Ubuntu/Debian 下需要安装 wordlist,例如 apt-get install wamerican-largecp /usr/share/dict/words /tank/ross/cp /usr/share/dict/words /tank/joey/zfs list -o name,used,compressratio,compression tank/{joey,ross}

share#

# 启动 nfsapk add nfs-utilsservice nfs start
# 会修改 /var/lib/nfs/etab 配置文件zfs set sharenfs=on data/share# samba# zfs set sharesmb=on data/share# 设置额外选项zfs set sharenfs="[email protected]/24" data/share# 共享是所有定义了共享属性的卷zfs share -a# 启动时执行 zfs share -arc-update add zfs-share
# 查看所有的共享状态zfs list -o name,sharenfs
# 取消所有共享zfs unshare -a

管理运维#

zpool status -x# 进行数据清理操作zpool scrub tank# 查看 scrub 状态zpool status# io 统计, 间隔 5szpool iostat -v 5# 从 pool 中移除设备, 只能移除 未使用的热备, 缓存, 顶层设备, 日志设备zpool remove main device# 添加顶层设备zpool add main raidz dev1 dev2# 添加缓存zpool add main cache dev# -f 格式化sudo zpool add main -f cache /dev/disk/by-id/wwn-0x500000000abcd
# 查看压缩信息# compressratio, compression, refcompressratiozfs get all main/archive | grep com# 查看压缩后的大小du -h .# 查看实际大小du --apparent-size -h .

ZFS vs 硬件 RAID#

  • ZFS 有校验和,和可避免位翻转等问题,而 RAID 主要用于避免整个磁盘的损坏

  • ZFS 只需要 HBAs (host bus adapter ) 而不需要 RAID 控制器

  • 最多只需要 Z2, Z3 很少使用,并且可能会有问题,有其他的办法来避免可能的错误

  • ZFS 并不是 RAID, 而是一个软件,一个文件系统

  • ZFS 重建比 RAID 更快,例如 1TB 的云盘,实际数据只有 100MB, 那么 ZFS 只需要 100MB 的 IO, 而 RAID 需要 1TB 的 IO.

  • scrub 是用来保证数据安全的,而不是保证磁盘健康的.不是自动的,需要定时调度.

  • "PFA"s, as in Pre-Failure Alerts

  • ZFS vs RAID6

加密#

https://blog.heckel.xyz/2017/01/08/zfs-encryption-openzfs-zfs-on-linux/ https://www.rolando.cl/blog/2017/06/13/playing-with-zfs-encryption/ https://news.ycombinator.com/item?id=14591452

参考#

SSD#