比尔盖子拥有三块具有 64 MB 缓存,500 GB 容量的西部数据企业级 WD RE4 盘。为了保证数据的安全性,使用主板自带的 RAID (即“FakeRAID”)建立了 RAID 5 磁盘阵列,在 Linux 下使用 mdadm 进行驱动,并在上面使用了 ext4 文件系统。这种配置可以得到不错的性能,但却有一些严重的问题。昨天,比尔盖子终于迁移到了 ZFS 以克服这些问题。
FakeRAID 的问题
跨平台问题 FakeRAID 可以在 Windows 和 Linux 下顺利运行,但是在 FreeBSD 下可能会遇到问题,Mac OS X 下无法运行。这就给数据共享带来了不少麻烦。然而,几乎所有的软 RAID 方案都不能跨平台,FakeRAID 能跨两个平台已算不错的。因此令人十分纠结。
稳定性问题 Linux 下 FakeRAID 的 mdadm 实现不太稳定,去年的两个小 bug 搞得比尔盖子的磁盘阵列几乎崩溃,好在有惊无险。而实际上,FakeRAID 和 Linux 软 RAID 非常的相似,读写算法都几乎一样。但是受限于 FakeRAID,又不能利用许多 Linux 软 RAID 的灵活特性。性能差不多,却损失了一些特性,真是有些亏了。
数据安全性问题 RAID 5 存在一个严重的设计缺陷,即臭名昭著的
RAID 5 Write Hole。简单的说,RAID 5 写入数据分为两步:首先更新数据;最后更新校验。但是,如果在这个过程中发生掉电,那么数据就会彻底损坏。
ZFS 方案
跨平台 ZFS 支持 Solaris, FreeBSD, Mac OS X, Linux 等类 Unix 平台。但不支持 Windows —— 比尔盖子早就不用它了。
稳定性 ZFS 是一种久经考验的文件系统,在大型的商业性应用中,它的稳定性得到了证实。而对于 Linux 支持,虽然 ZFS On Linux 还在开发中,但已经足够稳定,适合日常使用。
数据安全性 ZFS 有着自己的软 RAID 技术 —— RaidZ,这种技术等效与 RAID 5,不存在
RAID 5 Write Hole 的问题;同时,又有 ZFS 支持的 checksum, copies 等先进安全措施。
从 mdadm 迁移到 RaidZ
比尔盖子使用 /dev/sdb, /dev/sdc, /dev/sdd 三块硬盘组建 RAID,别忘了替换为你自己的设备。
注意事项 使用 ZFS 的计算机至少有 2GB 内存,并使用 64 位操作系统。否则会遇到严重的问题。
备份数据 不存在平滑从 FakeRAID 迁移到 RaidZ 的方案。只能销毁 FakeRAID,并建立 RaidZ ,所有的数据都会
全部丢失。因此,比尔盖子不得不使用移动硬盘备份这 700 多 GB 的数据。备份数据的过程可能有些痛苦,因此,比尔盖子建议使用高性能的移动硬盘或多余的硬盘进行这个操作。
销毁 FakeRAID
注:FakeRAID 的 Linux 实现有点特别,需要使用 /dev/md125 和 /dev/md126 两个设备来实现 RAID。注意根据你的情况替换。 首先,我们需要将三块硬盘标记为“故障”,并移除。
mdadm /dev/md0 --fail /dev/sdb --remove /dev/sdb
mdadm /dev/md0 --fail /dev/sdc --remove /dev/sdc
mdadm /dev/md0 --fail /dev/sdd --remove /dev/sdd
然后,停止 RAID 设备。
mdadm --stop /dev/md126
mdadm --stop /dev/md125
最后,清除三块硬盘上的 superblock。这样阵列就会彻底消失。
mdadm --misc --zero-superblock /dev/sdb
mdadm --misc --zero-superblock /dev/sdc
mdadm --misc --zero-superblock /dev/sdd
如果你的主板 BIOS 带有 FakeRAID 的管理界面,那么也可以通过界面来进行以上操作。两种方式都是等效的。
安装 ZFS 由于 ZFS 和 GPL 许可证不兼容,因此永远不会进入 Linux 主线内核。为了规避版权问题,ZFS 在 Linux 上有两种实现。第一种是基于 FUSE 的用户空间文件系统的实现,性能较差,且几乎不能将 ZFS 作为根目录;另一种则是原生的 ZFS 内核实现 —— ZFS On Linux。 如果不把 ZFS 作为根目录,在 Gentoo 上安装 ZFS 可以说是小菜一叠,几乎比其它任何发行版都来得容易。
emerge -av zfs
然后将 zfs 加入到系统服务当中。
rc-update add zfs boot
建立 RaidZ
zpool create data raidz1 /dev/sdb /dev/sdc /dev/sdd -o ashift=12 -f
data *是你的阵列名称,可以替换成自己顺眼的名字;-o ashift=12* 这个选项适合当今的 SATA 硬盘和固态硬盘,即 AF 盘。使用这个选项,ZFS 就会自动进行”4k 分区对齐“的操作,如果你在其它硬盘上进行操作,请去掉这个选项;-f 选项是为了避免诸如 does not contain an EFI label 的错误提示。 如果操作成功,那么运行 zpool status 就应该可以看到类似下面的信息。
pool: data
state: ONLINE
scan: none requested
config:
NAME STATE READ WRITE CKSUM
data ONLINE 0 0 0
raidz1-0 ONLINE 0 0 0
sdb ONLINE 0 0 0
sdc ONLINE 0 0 0
sdd ONLINE 0 0 0
errors: No known data errors
ZFS 使用一种类似于 LVM 的方式管理文件系统。先在这个阵列实际上是可以直接使用的,不需要进行分区等操作,它叫做
zpool。默认的挂载点在 /data (即你刚才指定的名字),稍后比尔盖子会修改它。
建立分区 实际上,ZFS 不用分区,就可以直接当作目录使用;”分区”也并没有大小的概念,看上去就是一个子目录,非常符合 Unix 的哲学。但为了便于日后数据的管理,还是有必要进行分区的。
zfs create data/Partition1
别忘了把
/data 换成自己 zpool 的名称;Partition1 换成自己分区的名称。 如果操作成功,执行 zfs list 就能看到类似这样的输出:
NAME USED AVAIL REFER MOUNTPOINT
data 390G 522G 266K /data
data/Partition1 390G 522G 266K /data/Partition1
卸载与挂载 这时候,我们的 zpool 就可以使用了!不过,为了防止重新启动系统后可能造成的一些问题,比如无法识别阵列等,需要对 zpool 进行
export 和 import。名义上是“导出”和“导入”,实际上就是“卸载”和“挂载”而已。
zpool export data
zpool import data
别忘了把
data 换成自己 zpool 的名称。
恢复数据 恢复数据的时刻到了!立即将你以各种方式备份的数据拷贝到
/data 里面吧! 别忘了把 /data 换成自己 zpool 的名称。
修改挂载点 有没有对 ZFS 默认的挂载点感到头疼?没错,它不符合 Linux 目录标准。不过,要修改它是非常轻松的。 若要修改整个 zpool 的挂载点,使用:
zfs set mountpoint=/mnt/raid data
别忘了把
data 换成自己 zpool 的名称,/mnt/data 换成自己挂载点的路径。 若要修改单独一个分区的挂载点,使用:
zfs set mountpoint=/mnt/home data/Home
别忘了把
data 换成自己 zpool 的名称,Home 换成自己分区的名称,/mnt/home 换成自己挂载点的路径。 执行完以上操作后,你只会发现当前的挂载点不见了,而新的挂载点却没有到位。你需要重新挂载整个 zpool 让新的挂载点生效,参见上面的卸载与挂载。
调整内存使用 ZFS 的缓存会吃掉大量的内存,因此我们需要把 ZFS 的缓存限制在合理范围。新建一个文件
/etc/modprobe.d/zfs.conf,用你喜欢的编辑器在文件中输入如下配置(其中的大小单位均为字节,其它的单位将被视为语法错误,将导致 ZFS 模块加载失败!:
# 小于 4GB 内存,不要设置这个选项,请直接删除
# 4GB 内存,设置为 536870912 (512 MB)
# 8GB 内存, 设置为 1073741824(1024 MB)
options zfs zfs_arc_min=536870912
# 小于 4 GB 内存,设置为 536870912(512 MB)
# 大于 4 GB 内存,设置为内存大小的一半
vfs.zfs.arc_max=2147483648
结束 一切妥当之后,重启计算机,看看 ZFS 的表现如何吧! 还有一些其它的优化工作可做,参见:
- 《FreeBSD 使用手册 —— Z 文件系统 (ZFS)》
- 《Oracle® Solaris ZFS管理指南》
- 《How to improve ZFS performance》 其中的某些内容并不适用于 Linux,请注意鉴别。
2017年02月17日 — 17:20
有办法开机导入pool吗。。。应该加在哪里,我加在rc.local不行
2017年02月17日 — 20:19
绝了,让libvirt开机调用,居然开机加载了。。
2017年02月17日 — 20:25
额并不,搞错镜像了,所以怎么自动import呢?
2017年02月17日 — 23:59
我的zfs 没做raidz 断电后有两个分区导入的时候没自动挂载,吓死我了
2014年07月28日 — 09:34
博主你好!
我在centos6.5上装了zfs on linux 0.6.3
我内网的机器内存只有2G,但是按照你最后提供的优化配置,好像没有效果,求破。。。
2014年07月28日 — 12:42
ZFS 的最低要求是 8 GB 内存 —— 但性能非常差。要性能好,需要 16 GB 内存以上。
2013年11月03日 — 13:28
ZFS 必定是 Solaris or FreeBSD 其它系统都是咸的蛋疼
2013年08月11日 — 23:32
WD黑盘貌似不是企业级的,主要针对性能敏感的高端PC用户,WD RE4才是企业级硬盘,还有万转的迅猛龙。
2013年08月11日 — 23:51
万转硬盘倒是没必要,黑盘就已经够贵了。反正黑盘设计的时候考虑到了阵列和 7×24 小时运行,够用了。
2015年06月29日 — 15:52
我今天检查系统的时候才发现,我一直用的不是 WD Black,而就是 WD RE4!