源代码下载: LearnZfs-cn.txt

ZFS
是从新思考与贮存相干技术的后果,它把传统的文件系统和卷管理器集成到一个工具当中.
ZFS岂但有把它和传统存储系统离开来的特有术语,也有很多聚焦于可用性的性能。

ZFS概念

虚构设施(Virtual Devices,VDEV)

对于操作系统来说,VDEV和传统的RAID阵列卡所出现的raid设施相似。VDEV有几种不同的类型,每种类型
都有本人的劣势,包含冗余和速度。一般来说,VDEV的可靠性和安全性比阵列卡要好。因而应用ZFS时不
倡议应用阵列卡。让ZFS间接治理磁盘。

VDEV的类型

  • stripe (条带。单个磁盘,没有冗余)
  • mirror (镜像。反对n-way镜像)
  • raidz

    • raidz1 (一个奇偶校验磁盘, 相似于RAID 5)
    • raidz2 (两个奇偶校验磁盘, 相似于RAID 6)
    • raidz3 (三个奇偶校验磁盘, 没有相似RAID等级)
  • disk (磁盘)
  • file (文件。不举荐在生产环境中应用,因为两头又多了一层不必要的文件系统)

数据会以条带形式存储于存储池中的所有VDEV上。因而一个存储池中的VDEV越多,IOPS就越高。

storage pool (存储池)

ZFS 应用存储池来作为底层存储提供者(VDEV)的形象。这样能够把用户可见的文件系统和底层的物理磁盘
布局拆散开来。

ZFS 数据集(Dataset)

ZFS 数据集相似于传统的文件系统(译者注:或者说是目录),然而提供了更多的性能。ZFS的很多劣势也是
在这一层体现进去的。数据集反对 Copy on Write
快照, 配额, 压缩和反复打消(de-duplication).

限度

一个目录最多可蕴含 2^48个文件, 每个文件最大能够是16 exabytes. 一个存储池最大可蕴含256 zettabytes 、
(2^78) 的空间, 能够条带化地散布于2^64 设施上. 繁多主机最多能够创立2^64个存储池。这些限度能够说是相
当大。

命令

存储池

Actions: (存储池操作)

  • List (列举)
  • Status (查看状态)
  • Destroy (删除)
  • Get/Set properties (获取/设置属性)

List zpools (列举存储池(也叫zpool))

# 创立一个raidz类型的存储池(名称为bucket)$ zpool create bucket raidz1 gpt/zfs0 gpt/zfs1 gpt/zfs2# 列出所有存储池$ zpool listNAME    SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOTzroot   141G   106G  35.2G         -    43%    75%  1.00x  ONLINE  -# 列出某一存储池的详细信息$ zpool list -v zrootNAME                                     SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP HEALTH  ALTROOTzroot                                    141G   106G  35.2G         -    43%    75%  1.00x ONLINE  -  gptid/c92a5ccf-a5bb-11e4-a77d-001b2172c655   141G   106G  35.2G         -    43%    75%

Status of zpools (存储池状态)

# 获取全副zpool状态信息$ zpool status  pool: zroot state: ONLINE  scan: scrub repaired 0 in 2h51m with 0 errors on Thu Oct  1 07:08:31 2015config:        NAME                                          STATE     READ WRITE CKSUM        zroot                                         ONLINE       0     0     0          gptid/c92a5ccf-a5bb-11e4-a77d-001b2172c655  ONLINE       0     0     0errors: No known data errors# 用scrub来更正存储池错误信息$ zpool scrub zroot$ zpool status -v zroot  pool: zroot state: ONLINE  scan: scrub in progress since Thu Oct 15 16:59:14 2015        39.1M scanned out of 106G at 1.45M/s, 20h47m to go        0 repaired, 0.04% doneconfig:        NAME                                          STATE     READ WRITE CKSUM        zroot                                         ONLINE       0     0     0          gptid/c92a5ccf-a5bb-11e4-a77d-001b2172c655  ONLINE       0     0     0errors: No known data errors

Properties of zpools (存储池属性)

# 获取某一存储池的全副属性。属性可能是零碎提供,也可能是用户设置$ zpool get all zrootNAME   PROPERTY                       VALUE                          SOURCEzroot  size                           141G                           -zroot  capacity                       75%                            -zroot  altroot                        -                              defaultzroot  health                         ONLINE                         -...# 设置存储池属性,下例这是设置comment(备注)属性$ zpool set comment="Storage of mah stuff" zroot$ zpool get commentNAME   PROPERTY  VALUE                 SOURCEtank   comment   -                     defaultzroot  comment   Storage of mah stuff  local

Remove zpool (删除存储池)

$ zpool destroy test

Datasets (数据集)

Actions: (数据集相干操作)

  • Create (创立)
  • List (列举)
  • Rename (重命名)
  • Delete (删除)
  • Get/Set properties (获取/设置属性)

Create datasets

# 创立数据集$ zfs create tank/root/data$ mount | grep datatank/root/data on /data (zfs, local, nfsv4acls)# 创立子数据集$ zfs create tank/root/data/stuff$ mount | grep datatank/root/data on /data (zfs, local, nfsv4acls)tank/root/data/stuff on /data/stuff (zfs, local, nfsv4acls)# 创立卷$ zfs create -V zroot/win_vm$ zfs list zroot/win_vmNAME                 USED  AVAIL  REFER  MOUNTPOINTtank/win_vm         4.13G  17.9G    64K  -

List datasets (列举数据集)

# 列出所有数据集$ zfs listNAME                                                                       USED  AVAIL  REFER  MOUNTPOINTzroot                                                                      106G  30.8G   144K  nonezroot/ROOT                                                                18.5G  30.8G   144K  nonezroot/ROOT/10.1                                                              8K  30.8G  9.63G  /zroot/ROOT/default                                                        18.5G  30.8G  11.2G  /zroot/backup                                                              5.23G  30.8G   144K  nonezroot/home                                                                 288K  30.8G   144K  none...# 列举某一数据集的信息$ zfs list zroot/homeNAME         USED  AVAIL  REFER  MOUNTPOINTzroot/home   288K  30.8G   144K  none# 列出快照$ zfs list -t snapshotzroot@daily-2015-10-15                                                                  0      -   144K  -zroot/ROOT@daily-2015-10-15                                                             0      -   144K  -zroot/ROOT/default@daily-2015-10-15                                                     0      -  24.2G  -zroot/tmp@daily-2015-10-15                                                           124K      -   708M  -zroot/usr@daily-2015-10-15                                                              0      -   144K  -zroot/home@daily-2015-10-15                                                             0      -  11.9G  -zroot/var@daily-2015-10-15                                                           704K      -  1.42G  -zroot/var/log@daily-2015-10-15                                                       192K      -   828K  -zroot/var/tmp@daily-2015-10-15                                                          0      -   152K  -

Rename datasets (重命名数据集)

$ zfs rename tank/root/home tank/root/old_home$ zfs rename tank/root/new_home tank/root/home

Delete dataset (删除数据集)

# 数据集如果有快照则无奈删除zfs destroy tank/root/home

Get / set properties of a dataset (获取/设置数据集属性)

# 获取数据集全副属性$ zfs get all  zroot/usr/home                                                                                              │157 # Create VolumeNAME            PROPERTY              VALUE                  SOURCE                                                                          │158 $ zfs create -V zroot/win_vmzroot/home      type                  filesystem             -                                                                               │159 $ zfs list zroot/win_vmzroot/home      creation              Mon Oct 20 14:44 2014  -                                                                               │160 NAME                 USED  AVAIL  REFER  MOUNTPOINTzroot/home      used                  11.9G                  -                                                                               │161 tank/win_vm         4.13G  17.9G    64K  -zroot/home      available             94.1G                  -                                                                               │162 ```zroot/home      referenced            11.9G                  -                                                                               │163zroot/home      mounted               yes                    -...# 获取数据集属性$ zfs get compression zroot/usr/homeNAME            PROPERTY     VALUE     SOURCEzroot/home      compression  off       default# 设置数据集属性(下例为设置压缩属性compression)$ zfs set compression=gzip-9 mypool/lamb# 列举所有数据集的名称、配额和预留属性$ zfs list -o name,quota,reservationNAME                                                               QUOTA  RESERVzroot                                                               none    nonezroot/ROOT                                                          none    nonezroot/ROOT/default                                                  none    nonezroot/tmp                                                           none    nonezroot/usr                                                           none    nonezroot/home                                                          none    nonezroot/var                                                           none    none...

Snapshots (快照)

快照是ZFS 的一个十分重要的性能

  • 快照占用的空间等于它和原始数据的差别量
  • 创立工夫以秒计
  • 复原工夫和写入速度雷同
  • 易于自动化

Actions: (快照相干操作)

  • Create (创立)
  • Delete (删除)
  • Rename (重命名)
  • Access snapshots (拜访)
  • Send / Receive (发送/接管)
  • Clone (克隆。译者注:对于clone和快照的区别可参看这里)

Create snapshots (创立快照)

# 为繁多数据集创立快照zfs snapshot tank/home/sarlalian@now# 为数据集及其子集创立快照$ zfs snapshot -r tank/home@now$ zfs list -t snapshotNAME                       USED  AVAIL  REFER  MOUNTPOINTtank/home@now                 0      -    26K  -tank/home/sarlalian@now       0      -   259M  -tank/home/alice@now           0      -   156M  -tank/home/bob@now             0      -   156M  -...

Destroy snapshots (删除快照)

# 如何删除快照$ zfs destroy tank/home/sarlalian@now# 删除某一数据集及其子集的快照$ zfs destroy -r tank/home/sarlalian@now

Renaming Snapshots (重命名)

# 重命名快照$ zfs rename tank/home/sarlalian@now tank/home/sarlalian@today$ zfs rename tank/home/sarlalian@now today# zfs rename -r tank/home@now @yesterday

Accessing snapshots (拜访快照)

# cd进入一个快照目录$ cd /home/.zfs/snapshot/

Sending and Receiving

# 备份快照到一个文件$ zfs send tank/home/sarlalian@now | gzip > backup_file.gz# 发送快照到另一个数据集$ zfs send tank/home/sarlalian@now | zfs recv backups/home/sarlalian# 发送快照到一个近程主机$ zfs send tank/home/sarlalian@now | ssh root@backup_server 'zfs recv tank/home/sarlalian'# 发送残缺数据集及其快照到一个新主机$ zfs send -v -R tank/home@now | ssh root@backup_server 'zfs recv tank/home'

Cloneing Snapshots (克隆快照)

# 克隆一个快照$ zfs clone tank/home/sarlalian@now tank/home/sarlalian_new# 晋升克隆,让它不再依赖原始快照$ zfs promote tank/home/sarlalian_new

汇总

上面这个脚本应用了FreeBSD, jails和ZFS,来主动在一个mysql群集的热备主机上为一个mysq staging数据库
创立一份污浊的拷贝。

#!/bin/shecho "==== Stopping the staging database server ===="jail -r stagingecho "==== Cleaning up existing staging server and snapshot ===="zfs destroy -r zroot/jails/stagingzfs destroy zroot/jails/slave@stagingecho "==== Quiescing the slave database ===="echo "FLUSH TABLES WITH READ LOCK;" | /usr/local/bin/mysql -u root -pmyrootpassword -h slaveecho "==== Snapshotting the slave db filesystem as zroot/jails/slave@staging ===="zfs snapshot zroot/jails/slave@stagingecho "==== Starting the slave database server ===="jail -c slaveecho "==== Cloning the slave snapshot to the staging server ===="zfs clone zroot/jails/slave@staging zroot/jails/stagingecho "==== Installing the staging mysql config ===="mv /jails/staging/usr/local/etc/my.cnf /jails/staging/usr/local/etc/my.cnf.slavecp /jails/staging/usr/local/etc/my.cnf.staging /jails/staging/usr/local/etc/my.cnfecho "==== Setting up the staging rc.conf file ===="mv /jails/staging/etc/rc.conf.local /jails/staging/etc/rc.conf.slavemv /jails/staging/etc/rc.conf.staging /jails/staging/etc/rc.conf.localecho "==== Starting the staging db server ===="jail -c stagingecho "==== Makes the staging database not pull from the master ===="echo "STOP SLAVE;" | /usr/local/bin/mysql -u root -pmyrootpassword -h stagingecho "RESET SLAVE;" | /usr/local/bin/mysql -u root -pmyrootpassword -h staging

延长浏览

  • BSDNow's Crash Course on ZFS
  • FreeBSD Handbook on ZFS
  • BSDNow's Crash Course on ZFS
  • Oracle's Tuning Guide
  • OpenZFS Tuning Guide
  • FreeBSD ZFS Tuning Guide

有倡议?或者发现什么谬误?在Github上开一个issue,或者发动pull request!

原著sarlalian,并由0个好心人批改。
© 2022 sarlalian
Translated by: Alan Cheng
本作品采纳 CC BY-SA 3.0 协定进行许可。