ZFS v13 在FreeBSD 8.0 rc2中的实践
属主:ZoomQuiet
参考:存储的规划[URL:http://www.bsdart.org/archives/20101226/518.html]
概述
本文包含 FreeBSD 8.0rc2 环境中一个 raidz-2+hot spares 配置和测试实例,为其它有意使用 ZFS 代替raid* 来保卫数据安全的SA, 在进行硬盘和 zpool 规划时,提供了一个足够友好的参考。
条件
* OS: FreeBSD svnmain.s.kingsoft.net 8.0-RC1 FreeBSD 8.0-RC1 #0: Thu Sep 17 18:50:57 UTC 2009 root@mason.cse.buffalo.edu:/usr/obj/usr/src/sys/GENERIC amd64
目标
在足够的硬盘数量支持下:
1,尽可能的使用多的空间
2,运用双奇偶检验来确保数据写安全
3,附加一个热备硬盘来冗灾数据盘的坏损
4,系统分区坏损时也可以立即恢复
硬件
Dell? PowerEdge? 2900 III
6x500G SAS 硬盘
6G 内存
规划
意图
6x300G SAS 空间划分相同=>4G+496G 两部分
6x4G 空间
>>3组作系统空间,进行相同的分区,并定期进行 dd 备份
>>3组作swap 给系统提供 16G 缓存,刚好是内存的两倍
6x496G 空间
>>1.5T 可用(3+2) RAID-Z2+1 hot spare
部署
简要说明在部署过程中的关键操作和思路
BIOS
因为,下单时考虑不周,主机带了个绕不过去的 RAID 卡
所以,必须先在 BIOS 中使用 raid0 策略对所有硬盘进行配置,否则 FreeBSD 安装程序无法加载硬盘
FreeBSD
* 使用 sysinstall 标准的进行 BSD 安装 * 注意对预备进行系统冗灾备份的分区要进行大小一致的划分(bsdlabel) * 每个分区的大小是精心测算过的:
1,/ → ??Mb 因为
2,/tmp → ??Mb 因为
3,/var → ??Mb 因为
4,/usr → ??Mb 因为
* 这样确保系统在4G 空间中就可以完全运行起来!
geom label
因为将来各个硬盘都有可能先杯具,所以,不能依赖盘序会孬 BIOS 自动调整的 bsd卷标
使用 geom label 进行固化!
##重启系统,在 loader 提示符下键入 4 启动到单用户模式
# glabel label rootfs /dev/mfid0s1a
GEOM_LABEL: Label for provider /dev/mfid0s1a is label/rootfs
# glabel label var /dev/mfid0s1d
GEOM_LABEL: Label for provider /dev/mfid0s1d is label/var
# glabel label usr /dev/mfid0s1f
GEOM_LABEL: Label for provider /dev/mfid0s1f is label/usr
# glabel label tmp /dev/mfid0s1e
GEOM_LABEL: Label for provider /dev/mfid0s1e is label/tmp
# glabel label swap /dev/mfid0s1b
GEOM_LABEL: Label for provider /dev/mfid0s1b is label/swap
# glabel label disk0 /dev/mfid0s2
GEOM_LABEL: Label for provider /dev/mfid0s2 is label/disk0
…
## 根据规划对所有硬盘的所有分区进行固定卷标
# cat /etc/fstab
… 类似
# Device Mountpoint FStype Options Dump Pass#
/dev/label/swap none swap sw 0 0
/dev/label/rootfs / ufs rw 1 1
/dev/label/tmp /tmp ufs rw 2 2
/dev/label/usr /usr ufs rw 2 2
/dev/label/var /var ufs rw 2 2
##正常重启后观察:
$ sudo mount
/dev/label/rootfs on / (ufs, local)
/dev/label/tmp on /tmp (ufs, local, soft-updates)
/dev/label/usr on /usr (ufs, local, soft-updates)
/dev/label/var on /var (ufs, local, soft-updates)
…
系统的 dd 备份
为确保备用系统分区随时可用,需要进行精密的复制:
#格式
sudo dd if= “系统分区全路径” of=“备份分区全路径”
#本例
sudo dd if=rootfs of=rootfs1
sudo dd if=rootfs of=rootfs2
…
要将所有系统分区都进行复制
ZFS
建立 3+2 RAID-Z2+1 host spare
$sudo zfs create svnpool raidz2 disk[0-4] spare disk5
$ zpool status
pool: svnpool
state: ONLINE
scrub: resilver completed after 0h0m with 0 errors on Thu Nov 12 17:35:09 2009
config:
NAME STATE READ WRITE CKSUM
svnpool ONLINE 0 0 0
raidz2 ONLINE 0 0 0
label/disk0 ONLINE 0 0 0 27.5K resilvered
label/disk1 ONLINE 0 0 0 29K resilvered
label/disk5 ONLINE 0 0 0 44K resilvered
label/disk3 ONLINE 0 0 0 28.5K resilvered
label/disk4 ONLINE 0 0 0 28K resilvered
spares
label/disk2 AVAIL
…
$ zpool upgrade -v
This system is currently running ZFS pool version 13.
…
演习
通过实地热插拔硬盘来模拟实际常见灾难来明确在 ZFS 保卫中的系统和数据恢复
系统盘崩溃
模拟
1,先关机,拔除系统硬盘
2,开机后,无法引导
模拟成功…
处置
1,重启,进入 BIOS
2,调整硬盘启动顺序,指定 disk4/5 任意一块(有系统分区在的)
3,用光盘重启,使用 sysinstall—label功能手动挂载分区表 并写入启动硬盘 M键挂载分区,W写入更改
第1分区 → /
第2分区 → /tmp
第3分区 → /var
第4分区 → /usr
4,重启,将正常引导,而且使用 zpool status 测试,明确存储池也正常
处置成功,总用时 < 25分钟
数据盘崩溃
模拟
1,拔除任何一颗数据硬盘 (disk1~5)
2,系统丢出错误,重启
3,zfs 将观察到 DEGRADED 状态
模拟成功…
处置
1,先撤出故障盘
$ sudo zpool detach svnpool /dev/label/disk2
zpool status
pool: svnpool
state: ONLINE
scrub: resilver completed after 0h0m with 0 errors on Thu Nov 12 17:35:09 2009
config:
NAME STATE READ WRITE CKSUM
svnpool ONLINE 0 0 0
raidz2 ONLINE 0 0 0
label/disk0 ONLINE 0 0 0 27.5K resilvered
label/disk1 ONLINE 0 0 0 29K resilvered
label/disk5 ONLINE 0 0 0 44K resilvered
label/disk3 ONLINE 0 0 0 28.5K resilvered
label/disk4 ONLINE 0 0 0 28K resilvered
spares
label/disk5 INUSE currently in use
…
2,FreeBSD 中的ZFS 当前无法自动激活热备件启用,手动替换之
格式: zpool replace svnpool ‘故障盘’ ‘热备件’
$ sudo zpool replace svnpool /dev/label/disk2 /dev/label/disk5
$ zpool status
pool: svnpool
state: ONLINE
scrub: resilver completed after 0h0m with 0 errors on Thu Nov 12 17:35:09 2009
config:
NAME STATE READ WRITE CKSUM
svnpool ONLINE 0 0 0
raidz2 ONLINE 0 0 0
label/disk0 ONLINE 0 0 0 27.5K resilvered
label/disk1 ONLINE 0 0 0 29K resilvered
label/disk5 ONLINE 0 0 0 44K resilvered
label/disk3 ONLINE 0 0 0 28.5K resilvered
label/disk4 ONLINE 0 0 0 28K resilvered
3,待修复故障硬盘或在同一物理位置替换(同大小)物理硬盘之后,手工追加热备件
$ sudo zpool add svnpool spare /dev/label/disk2
$ zpool status
pool: svnpool
state: ONLINE
scrub: resilver completed after 0h0m with 0 errors on Thu Nov 12 17:35:09 2009
config:
NAME STATE READ WRITE CKSUM
svnpool ONLINE 0 0 0
raidz2 ONLINE 0 0 0
label/disk0 ONLINE 0 0 0 27.5K resilvered
label/disk1 ONLINE 0 0 0 29K resilvered
label/disk5 ONLINE 0 0 0 44K resilvered
label/disk3 ONLINE 0 0 0 28.5K resilvered
label/disk4 ONLINE 0 0 0 28K resilvered
spares
label/disk2 AVAIL
…
4,安全起见 zpool clear ,并zpool status -x检查
处置完毕, 用时 10~15分钟
TODO
1,如何对 zpool 的变化进行自动报警?
2,如何自动使用 hot spare 替代离线的硬盘?
3,4G 的系统空间不足时,如何将耗空间的 目录链接到 zpool 中,而又保障依然可以正常用后备系统盘快速恢复?
讨论
这样是否最合理?
如果该主机只用以提供 SVN 服务,还有什么可以优化的?
如果该主机只用以提供 Samba 服务,还有什么可以优化的?
如果该主机只用以提供 ftp 服务,还有什么可以优化的?
如果该主机只用以提供 PostgreSQL 服务,还有什么可以优化的?
如果该主机用以提供 综合 服务,还有什么需要注意的?
原文链接:http://wiki.freebsdchina.org/doc/z/zfsusageforbsd8.0