源代码下载: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 list
NAME SIZE ALLOC FREE EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT
zroot 141G 106G 35.2G - 43% 75% 1.00x ONLINE -
# 列出某一存储池的详细信息
$ zpool list -v zroot
NAME SIZE ALLOC FREE EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT
zroot 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 2015
config:
NAME STATE READ WRITE CKSUM
zroot ONLINE 0 0 0
gptid/c92a5ccf-a5bb-11e4-a77d-001b2172c655 ONLINE 0 0 0
errors: 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% done
config:
NAME STATE READ WRITE CKSUM
zroot ONLINE 0 0 0
gptid/c92a5ccf-a5bb-11e4-a77d-001b2172c655 ONLINE 0 0 0
errors: No known data errors
Properties of zpools(存储池属性)
# 获取某一存储池的全副属性。属性可能是零碎提供,也可能是用户设置
$ zpool get all zroot
NAME PROPERTY VALUE SOURCE
zroot size 141G -
zroot capacity 75% -
zroot altroot - default
zroot health ONLINE -
...
# 设置存储池属性,下例这是设置 comment(备注)属性
$ zpool set comment="Storage of mah stuff" zroot
$ zpool get comment
NAME PROPERTY VALUE SOURCE
tank comment - default
zroot 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 data
tank/root/data on /data (zfs, local, nfsv4acls)
# 创立子数据集
$ zfs create tank/root/data/stuff
$ mount | grep data
tank/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_vm
NAME USED AVAIL REFER MOUNTPOINT
tank/win_vm 4.13G 17.9G 64K -
List datasets(列举数据集)
# 列出所有数据集
$ zfs list
NAME USED AVAIL REFER MOUNTPOINT
zroot 106G 30.8G 144K none
zroot/ROOT 18.5G 30.8G 144K none
zroot/ROOT/10.1 8K 30.8G 9.63G /
zroot/ROOT/default 18.5G 30.8G 11.2G /
zroot/backup 5.23G 30.8G 144K none
zroot/home 288K 30.8G 144K none
...
# 列举某一数据集的信息
$ zfs list zroot/home
NAME USED AVAIL REFER MOUNTPOINT
zroot/home 288K 30.8G 144K none
# 列出快照
$ zfs list -t snapshot
zroot@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 Volume
NAME PROPERTY VALUE SOURCE │158 $ zfs create -V zroot/win_vm
zroot/home type filesystem - │159 $ zfs list zroot/win_vm
zroot/home creation Mon Oct 20 14:44 2014 - │160 NAME USED AVAIL REFER MOUNTPOINT
zroot/home used 11.9G - │161 tank/win_vm 4.13G 17.9G 64K -
zroot/home available 94.1G - │162 ```
zroot/home referenced 11.9G - │163
zroot/home mounted yes -
...
# 获取数据集属性
$ zfs get compression zroot/usr/home
NAME PROPERTY VALUE SOURCE
zroot/home compression off default
# 设置数据集属性(下例为设置压缩属性 compression)$ zfs set compression=gzip-9 mypool/lamb
# 列举所有数据集的名称、配额和预留属性
$ zfs list -o name,quota,reservation
NAME QUOTA RESERV
zroot none none
zroot/ROOT none none
zroot/ROOT/default none none
zroot/tmp none none
zroot/usr none none
zroot/home none none
zroot/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 snapshot
NAME USED AVAIL REFER MOUNTPOINT
tank/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/sh
echo "==== Stopping the staging database server ===="
jail -r staging
echo "==== Cleaning up existing staging server and snapshot ===="
zfs destroy -r zroot/jails/staging
zfs destroy zroot/jails/slave@staging
echo "==== Quiescing the slave database ===="
echo "FLUSH TABLES WITH READ LOCK;" | /usr/local/bin/mysql -u root -pmyrootpassword -h slave
echo "==== Snapshotting the slave db filesystem as zroot/jails/slave@staging ===="
zfs snapshot zroot/jails/slave@staging
echo "==== Starting the slave database server ===="
jail -c slave
echo "==== Cloning the slave snapshot to the staging server ===="
zfs clone zroot/jails/slave@staging zroot/jails/staging
echo "==== Installing the staging mysql config ===="
mv /jails/staging/usr/local/etc/my.cnf /jails/staging/usr/local/etc/my.cnf.slave
cp /jails/staging/usr/local/etc/my.cnf.staging /jails/staging/usr/local/etc/my.cnf
echo "==== Setting up the staging rc.conf file ===="
mv /jails/staging/etc/rc.conf.local /jails/staging/etc/rc.conf.slave
mv /jails/staging/etc/rc.conf.staging /jails/staging/etc/rc.conf.local
echo "==== Starting the staging db server ===="
jail -c staging
echo "==== Makes the staging database not pull from the master ===="
echo "STOP SLAVE;" | /usr/local/bin/mysql -u root -pmyrootpassword -h staging
echo "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 协定进行许可。