ZFS 是重新思考与储存相关技术的结果,它把传统的文件系统和卷管理器集成到一个工具当中. ZFS不但有把它和传统存储系统分开来的特有术语,也有很多聚焦于可用性的功能。
对于操作系统来说,VDEV和传统的RAID阵列卡所呈现的raid设备类似。VDEV有几种不同的类型,每种类型 都有自己的优势,包括冗余和速度。一般来说,VDEV的可靠性和安全性比阵列卡要好。因此使用ZFS时不 建议使用阵列卡。让ZFS直接管理磁盘。
VDEV的类型
stripe (条带。单个磁盘,没有冗余)
mirror (镜像。支持n-way镜像)
raidz
disk (磁盘)
file (文件。不推荐在生产环境中使用,因为中间又多了一层不必要的文件系统)
数据会以条带方式存储于存储池中的所有VDEV上。因此一个存储池中的VDEV越多,IOPS就越高。
ZFS 使用存储池来作为底层存储提供者(VDEV)的抽象。这样可以把用户可见的文件系统和底层的物理磁盘 布局分离开来。
ZFS 数据集类似于传统的文件系统(译者注:或者说是目录),但是提供了更多的功能。ZFS的很多优势也是 在这一层体现出来的。数据集支持 Copy on Write 快照, 配额, 压缩和重复消除(de-duplication).
一个目录最多可包含 2^48个文件, 每个文件最大可以是16 exabytes. 一个存储池最大可包含256 zettabytes 、 (2^78) 的空间, 可以条带化地分布于2^64 设备上. 单一主机最多可以创建2^64个存储池。这些限制可以说是相 当大。
Actions: (存储池操作)
List zpools (列举存储池(也叫zpool))
x# 创建一个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 (存储池状态)
xxxxxxxxxx# 获取全部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 errorsProperties of zpools (存储池属性)
xxxxxxxxxx# 获取某一存储池的全部属性。属性可能是系统提供,也可能是用户设置$ 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 localRemove zpool (删除存储池)
xxxxxxxxxx$ zpool destroy testActions: (数据集相关操作)
Create datasets
xxxxxxxxxx# 创建数据集$ 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 (列举数据集)
xxxxxxxxxx# 列出所有数据集$ 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 (重命名数据集)
xxxxxxxxxx$ zfs rename tank/root/home tank/root/old_home$ zfs rename tank/root/new_home tank/root/homeDelete dataset (删除数据集)
xxxxxxxxxx# 数据集如果有快照则无法删除zfs destroy tank/root/homeGet / set properties of a dataset (获取/设置数据集属性)
xxxxxxxxxx# 获取数据集全部属性$ 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...快照是ZFS 的一个非常重要的功能
Actions: (快照相关操作)
Create snapshots (创建快照)
xxxxxxxxxx# 为单一数据集创建快照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 (删除快照)```bash# 如何删除快照$ zfs destroy tank/home/sarlalian@now# 删除某一数据集及其子集的快照$ zfs destroy -r tank/home/sarlalian@nowRenaming Snapshots (重命名)
xxxxxxxxxx# 重命名快照$ zfs rename tank/home/sarlalian@now tank/home/sarlalian@today$ zfs rename tank/home/sarlalian@now today# zfs rename -r tank/home@now @yesterdayAccessing snapshots (访问快照)
xxxxxxxxxx# cd进入一个快照目录$ cd /home/.zfs/snapshot/Sending and Receiving
xxxxxxxxxx# 备份快照到一个文件$ 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 (克隆快照)
xxxxxxxxxx# 克隆一个快照$ zfs clone tank/home/sarlalian@now tank/home/sarlalian_new# 提升克隆,让它不再依赖原始快照$ zfs promote tank/home/sarlalian_new下面这个脚本使用了FreeBSD, jails和ZFS,来自动在一个mysql群集的热备主机上为一个mysq staging数据库 创建一份纯净的拷贝。
xxxxxxxxxxecho "==== 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