Thursday Dec 21, 2006

ZFS文件系统 - (3) zpool attach/detach


        将一个非冗余的文件系统改造成为带冗余的mirror文件系统有很多好处。它可以让数据更安全,容灾性更强。单一物理设备的损坏不至于影响系统数据的完整一致性。当然,在保证数据完整性的前提下,为了尽可能的节约资源,我们也会将一个减少多路的mirror的冗余数目。这些操作就是由zpool attach/detach来完成的。


zpool attach [-f] pool device new_device

zpool detach pool device


    注:attach一个新的设备给一个pool设备,这个pool设备不能是raidz池的一部分。

1. 建立一个非冗余简单池,attach一个设备变为两路mirror

# zpool create mypool c2t5d0
# zpool status -v mypool
  pool: mypool
 state: ONLINE
 scrub: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        mypool      ONLINE       0     0     0
          c2t5d0    ONLINE       0     0     0

errors: No known data errors
# zpool attach mypool c2t5d0 c2t4d0
# zpool status -v mypool
  pool: mypool
 state: ONLINE
 scrub: resilver completed with 0 errors on Thu Dec 21 01:44:03 2006
config:

        NAME        STATE     READ WRITE CKSUM
        mypool      ONLINE       0     0     0
          mirror    ONLINE       0     0     0
            c2t5d0  ONLINE       0     0     0
            c2t4d0  ONLINE       0     0     0

errors: No known data errors
# zpool list
NAME                    SIZE    USED   AVAIL    CAP  HEALTH     ALTROOT
mypool                 16.8G    128K   16.7G     0%  ONLINE     -

2. 将一个3路mirror降为2路

# zpool create mypool mirror c2t5d0 c2t4d0 c2t2d0
# zpool status -v mypool
  pool: mypool
 state: ONLINE
 scrub: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        mypool      ONLINE       0     0     0
          mirror    ONLINE       0     0     0
            c2t5d0  ONLINE       0     0     0
            c2t4d0  ONLINE       0     0     0
            c2t2d0  ONLINE       0     0     0

errors: No known data errors
# zpool detach mypool c2t4d0
# zpool status -v mypool
  pool: mypool
 state: ONLINE
 scrub: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        mypool      ONLINE       0     0     0
          mirror    ONLINE       0     0     0
            c2t5d0  ONLINE       0     0     0
            c2t2d0  ONLINE       0     0     0

errors: No known data errors
# zpool list
NAME                    SIZE    USED   AVAIL    CAP  HEALTH     ALTROOT
mypool                 16.8G    128K   16.7G     0%  ONLINE     -

3.  raidz池不可以进行attach/detach

# zpool create myraidz raidz c2t5d0 c2t4d0 c2t2d0
# zpool attach myraidz c2t5d0 c1t4d0
cannot attach c1t4d0 to c2t5d0: can only attach to mirrors and top-level disks
# zpool detach myraidz c2t5d0
cannot detach c2t5d0: only applicable to mirror and replacing vdevs

    attach不能操作raidz设备文件,detach只能对可替换的mirror设备进行操作。

Wednesday Dec 20, 2006

ZFS文件系统 - (2) zpool add/remove

        在zpool create/destroy一节中,我们讲了怎样创建和删除一个pool。我们之所以说ZFS简单易用,就是它把系统管理员从复杂而繁琐的管理工作中解放出来,从而将更多的时间花在系统的整体构架上,而不是被日常的管理束缚住手脚和头脑。记得九月份在上海出差参加Sun Tech Days活动,在展台上和很多来自各个行业的软件开发者,系统管理员,系统工程师聊。大家有一个共同的认识就是,现在的volume management + 文件系统的管理方式在做系统扩充和缩小时非常复杂,常常为此提前要做各方面的准备,实施计划,操作流程,回退计划等等。而且,往往这些操作需要宕机做offline工作。我想有过这方面经验的人大概都会有这样的经历。

        那么,现在我们有了新的选择:ZFS。我们叫ZFS为文件系统,其实ZFS是集volume management和文件系统功能于一体。对于用户来说,它的volume management功能是透明的。ZFS提供了两个简单的命令add/remove来解决系统扩充和缩小需要。而且,一切都是online操作,一切在线业务都不需要停机。zfs add/remove语法如下:


zpool add [-fn] pool vdev ...

zpool remove pool vdev


    注:当前remove操作只支持对hot spares设备的删除。

    我们做一些实验,实验系统环境如下:

# format
Searching for disks...done


AVAILABLE DISK SELECTIONS:
       0. c1t0d0 <SUN36G cyl 24620 alt 2 hd 27 sec 107>
          /pci@8,600000/SUNW,qlc@2/fp@0,0/ssd@w21000004cf836e64,0
       1. c1t2d0 <SEAGATE-ST336605FSUN36G-0438-33.92GB>
          /pci@8,600000/SUNW,qlc@2/fp@0,0/ssd@w21000004cf836e65,0
       2. c1t3d0 <SEAGATE-ST336605FSUN36G-0438-33.92GB>
          /pci@8,600000/SUNW,qlc@2/fp@0,0/ssd@w21000004cf836e6a,0
       3. c1t4d0 <SEAGATE-ST336605FSUN36G-0438-33.92GB>
          /pci@8,600000/SUNW,qlc@2/fp@0,0/ssd@w21000004cf836e60,0
       4. c2t1d0 <SEAGATE-ST318404LSUN18G-4207-16.87GB>
          /pci@9,700000/scsi@3/sd@1,0
       5. c2t2d0 <SEAGATE-ST318404LSUN18G-4207-16.87GB>
          /pci@9,700000/scsi@3/sd@2,0
       6. c2t4d0 <SEAGATE-ST318404LSUN18G-4207-16.87GB>
          /pci@9,700000/scsi@3/sd@4,0
       7. c2t5d0 <SEAGATE-ST318404LSUN18G-4207-16.87GB>
          /pci@9,700000/scsi@3/sd@5,0 

1. 建立一个pool,然后再增加其空间一倍。

# zpool create mypool c2t5d0
# zfs list
NAME     USED  AVAIL  REFER  MOUNTPOINT
mypool    85K  16.5G  24.5K  /mypool
# zpool add mypool c2t4d0
# zfs list
NAME     USED  AVAIL  REFER  MOUNTPOINT
mypool    88K  33.0G  24.5K  /mypool

    我们可以看到,再mypool增加了一个新的disk后空间从16.5G变为33.0G。

# zpool status -v mypool
  pool: mypool
 state: ONLINE
 scrub: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        mypool      ONLINE       0     0     0
          c2t5d0    ONLINE       0     0     0
          c2t4d0    ONLINE       0     0     0

errors: No known data errors

    我们可以从上面zpool status的输出清晰的看出mypool的盘结构。

        # zpool destroy mypool

    删除mypool

2. 建立一个2路的mirror,再为其扩充空间。

# zpool destroy mymirror
# zpool create mymirror mirror c2t1d0 c2t2d0
# zfs list
NAME       USED  AVAIL  REFER  MOUNTPOINT
mymirror    86K  16.5G  24.5K  /mymirror
# zpool status mymirror
  pool: mymirror
 state: ONLINE
 scrub: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        mymirror    ONLINE       0     0     0
          mirror    ONLINE       0     0     0
            c2t1d0  ONLINE       0     0     0
            c2t2d0  ONLINE       0     0     0

errors: No known data errors

    两个大小分别为16G的硬盘构成一个2路的mirror,容积仍然为16G。

# zpool add mymirror mirror c2t4d0  c2t5d0
# zpool status mymirror
  pool: mymirror
 state: ONLINE
 scrub: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        mymirror    ONLINE       0     0     0
          mirror    ONLINE       0     0     0
            c2t1d0  ONLINE       0     0     0
            c2t2d0  ONLINE       0     0     0
          mirror    ONLINE       0     0     0
            c2t4d0  ONLINE       0     0     0
            c2t5d0  ONLINE       0     0     0

errors: No known data errors
# zfs list
NAME       USED  AVAIL  REFER  MOUNTPOINT
mymirror    88K  33.0G  24.5K  /mymirror

    结果显而易见,mymirror的大小变为33G。

# zpool destroy mymirror

 

3.  建立一个raidz池,增加hot spares设备,然后删除。

# zpool create mypool raidz c2t1d0 c2t2d0 c2t4d0 spare c2t5d0
# zfs list
NAME     USED  AVAIL  REFER  MOUNTPOINT
mypool   102K  33.1G  32.6K  /mypool
# zpool status mypool
  pool: mypool
 state: ONLINE
 scrub: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        mypool      ONLINE       0     0     0
          raidz1    ONLINE       0     0     0
            c2t1d0  ONLINE       0     0     0
            c2t2d0  ONLINE       0     0     0
            c2t4d0  ONLINE       0     0     0
        spares
          c2t5d0    AVAIL

errors: No known data errors

    对于raidz/raidz1/raidz2来说,整个池的大小等于(N-P) \* min(disk size)。N表示disk个数,P为冗余盘的个数,即1或者2。raidz是raidz1的alias。关于数据冗余,我会在以后专门拿出来讨论。hot spares设备不计入池空间。

# zpool remove mypool c2t5d0

    hot spares设备被删除。 

# zpool status mypool
  pool: mypool
 state: ONLINE
 scrub: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        mypool      ONLINE       0     0     0
          raidz1    ONLINE       0     0     0
            c2t1d0  ONLINE       0     0     0
            c2t2d0  ONLINE       0     0     0
            c2t4d0  ONLINE       0     0     0

errors: No known data errors
# zfs list
NAME     USED  AVAIL  REFER  MOUNTPOINT
mypool   102K  33.1G  32.6K  /mypool

# zpool destroy mypool

        add/remove是对整个池的大小的修改,但如果我想将一个简单的stripe文件系统变成一个带冗余的mirror,该怎么办?或者想将一个3路mirror变成2路的又该如何?add/remove是没法做到这一点的。这就是我们下一次要探讨的zpool attach/detach。
 

 

About

forrest

Search

Archives
« April 2014
SunMonTueWedThuFriSat
  
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
   
       
Today