用户工具

站点工具


doc:z:zfsusageforbsd8.0

ZFS v13 在FreeBSD8.0rc2中的实践

参考: 存储的规划

  • 属主: ZoomQuiet
  • 版本:
    1. 091119 完成初稿
    2. 091118 init.

概述

本文包含 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 内存

规划

(卷标)功能分区 分区标签 Swap(卷标) 分区标签 ZFS分区(卷标) 分区标签
Disk 5 4G ~ 496G
(rootfs)→/ mfid0s1a ~ (disk0) mfid0s2
(tmp)→/tmp mfid0s1d ~ ~
(var)→/var mfid0s1e ~ ~
(usr)→/usr mfid0s1f ~ ~
Disk 1 ~ 4G 496G
swap1 mfid1s1 (disk1) mfid1s2
Disk 2 ~ 4G 496G
swap2 mfid2s1 (disk2) mfid2s2
Disk 3 ~ 4G 496G
swap3 mfid3s1 (disk3) mfid3s3
Disk 5 4G ~ 496G
(rootfs1)→/ mfid4s1a ~ (disk4) mfid4s2
(tmp1)→/tmp mfid4s1d ~ ~
(var1)→/var mfid4s1e ~ ~
(usr1)→/usr mfid4s1f ~ ~
Disk 5 4G ~ 496G
(rootfs2)→/ mfid5s1a ~ (disk5) mfid5s2
(tmp2)→/tmp mfid5s1d ~ ~
(var2)→/var mfid5s1e ~ ~
(usr2)→/usr mfid5s1f ~ ~
(卷标)功能分区 分区标签 Swap(卷标) 分区标签 ZFS分区(卷标) 分区标签

意图

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. 第1分区 → /
    2. 第2分区 → /tmp
    3. 第3分区 → /var
    4. 第4分区 → /usr
  4. 重启,将正常引导,而且使用 zpool status 测试,明确存储池也正常

处置成功,总用时 < 25分钟

数据盘崩溃

模拟

  1. 拔除任何一颗数据硬盘 (disk1~5)
  2. 系统丢出错误,重启
  3. zfs 将观察到 DEGRADED 状态

模拟成功…

处置

  • 先撤出故障盘
  • $ 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
    ...
  • 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
  • 待修复故障硬盘或在同一物理位置替换(同大小)物理硬盘之后,手工追加热备件
  • $ 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
    ...
  • 安全起见 zpool clear ,并zpool status -x检查

处置完毕, 用时 10~15分钟

TODO

  1. 如何对 zpool 的变化进行自动报警?!
  2. 如何自动使用 hot spare 替代离线的硬盘?!
  3. 4G 的系统空间不足时,如何将耗空间的 目录链接到 zpool 中,而又保障依然可以正常用后备系统盘快速恢复!?

讨论

  • 这样是否最合理?
  • 如果该主机只用以提供 SVN 服务,还有什么可以优化的?
  • 如果该主机只用以提供 Samba 服务,还有什么可以优化的?
  • 如果该主机只用以提供 ftp 服务,还有什么可以优化的?
  • 如果该主机只用以提供 PostgreSQL 服务,还有什么可以优化的?
  • 如果该主机用以提供 综合 服务,还有什么需要注意的?
/data/vhosts/wiki-data/pages/doc/z/zfsusageforbsd8.0.txt · 最后更改: 2009/11/19 20:33 由 ZoomQuiet