zoukankan      html  css  js  c++  java
  • 高速掌握sinox2014激动人心的ZFS和RAID技术

     

    Sinox2014引入激动人心的zfs系统以及其支持的RAID,让用户高速打造便宜的高可靠性文件server。

    ZFS文件系统的英文名称为Zettabyte File System,也叫动态文件系统(Dynamic File System),是第一个128位文件系统。最初是由Sun公司为Solaris 10操作系统开发的文件系统。作为OpenSolaris开源计划的一部分,ZFS于2005年11月公布,被Sun称为是终极文件系统,经历了 10 年的活跃开发。而最新的开发将全面开放,并又一次命名为 OpenZFS

    1文件介绍

    ZFS是一款128bit文件系统,总容量是现有64bit文件系统的1.84×10^19倍,其支持的单个存储卷容量达到16EiB(2^64byte,即 16x1024x1024TB);一个zpool存储池能够拥有2^64个卷,总容量最大256ZiB(2^78byte);整个系统又能够拥有2^64个存储 池。能够说在相当长的未来时间内,ZFS差点儿不太可能出现存储空间不足的问题。另外,它还拥有自优化,自己主动校验数据完整性,存储池/卷系统易管理等诸多长处。较ext3系统有较大执行速率,提高大约30%-40%。

    ZFS是基于存储池的,与典型的映射物理存储设备的传统文件系

    ZFS  ZFS

    统不同,ZFS全部在存储池中的文件系统都能够使用存储池的资源。

    什么是ZFS
    ZFS 文件系统是一个革命性的全新的文件系统,它从根本上改变了文件系统的管理方式,这个文件系统的特色和其带来的优点至今没有其它文件系统能够与之媲美,ZFS 被设计成强大的、可升级并易于管理的。
    ZFS 用“存储池”的概念来管理物理存储空间。过去,文件系统都是构建在物理设备之上的。为了管理这些物理设备,并为数据提供冗余,“卷管理”的概念提供了一个单设备的映像。可是这样的设计添加了复杂性,同一时候根本没法使文件系统向更高层次发展,由于文件系统不能跨越数据的物理位置。
    ZFS 全然抛弃了“卷管理”,不再创建虚拟的卷,而是把全部设备集中到一个存储池中来进行管理!“存储池”描写叙述了存储的物理特征(设备的布局,数据的冗余等等),并扮演一个可以创建文件系统的专门存储空间。从此,文件系统不再局限于单独的物理设备,并且文件系统还同意物理设备把他们自带的那些文件系统共享到这个“池”中。你也不再须要预先规划好文件系统的大小,由于文件系统可以在“池”的空间内自己主动的增大。当添加新的存贮介质时,全部“池”中的全部文件系统能马上使用新增的空间,而不须要而外的操作。在非常多情况下,存储池扮演了一个虚拟内存。
    ZFS使用一种写时拷贝事务模型技术。全部文件系统中的块指针都包含256位的能在读时被又一次校验的关于目标块的校验和。含有活动数据的块从来不被覆盖;而是分配一个新块,并把改动过的数据写在新块上。全部与该块相关的元数据块都被又一次读、分配和重写。为了降低该过程的开销,多次读写更新被归纳为一个事件组,而且在必要的时候使用日志来同步写操作。[1]
    利用写时拷贝使ZFS的快照和事物功能的实现变得更简单和自然,快照功能更灵活。缺点是,COW使碎片化问题更加严重,对于顺序写生成的大文件,假设以后随机的对当中的一部分进行了更改,那么这个文件在硬盘上的物理地址就变得不再连续,未来的顺序读会变得性能比較差。[1]
    创建一个池的样例
    1
    # zpool create tank mirror c1t0d0 c1t1d0
    这是一个被镜像了的池,名叫“tank”。假设命令中的设备包括有其它的文件系统或者以别的形式被使用,那么命令不能运行。
    要查看池是否成功创建,用 zpool list 命令,比如:
    1
    2
    3
    # zpool list
    NAME SIZE USED AVAIL CAP HEALTH ALTROOT
    tank 80G 137K 80G 0% ONLINE -

    2系统层次

    无论层次怎样,根总是池的名字。
    ⒈为每一个用户及项目创建一个文件系统是个不错的办法!
    ⒉ZFS可以为文件系统分组,属于同一组的文件系统具有相似的性质,这有点像用户组的概念!相似的文件系统可以使用一个共同的名字。
    ⒊大多数文件系统的特性都被用简单的方式进行控制,这些特征控制了各种行为,包含文件系统被mount在哪里,怎么被共享,是否被压缩,是否有限额
    创建一个文件系统
    1
    # zfs create tank/home
    下一步,就能够创建各个文件系统,把它们都归组到 home 这个文件系统中。
    同一时候能够设置home的特性,让组内的其它文件系统继承的它的这些特性。
    当一个文件系统层次创建之后,能够为这个文件系统设置一些特性,这些特性将被全部的用户共享:
    1
    2
    3
    4
    5
    6
    # zfs set mountpoint=/export/zfs tank/home
    # zfs set sharenfs=on tank/home
    # zfs set compression=on tank/home
    # zfs get compression tank/home
    NAME PROPERTY VALUE SOURCE
    tank/home compression on local
    ⒋创建单个的文件系统
    注意:这些文件系统假设被创建好,他们的特性的改变将被限制在home级别,全部的特性可以在文件系统的使用过程中动态的改变。
    1
    2
    # zfs create tank/home/bonwick
    # zfs create tank/home/billm
    bonwick、billm文件系统从父文件系统home中继承了特性,因此他们被自己主动的mount到/export/zfs/user 同一时候作为被共享的NFS。管理员根本不须要再手工去编辑 /etc/vfstab 或 /etc/dfs/dfstab 文件。
    每一个文件系统除了继承特性外,还能够有自己的特性,假设用户bonwick的磁盘空间要限制在10G。
    1
    # zfs set quota=10G tank/home/bonwick
    ⒌用 zfs list 命令查看可获得的文件系统的信息,类似于过去的 df -k 命令了,呵呵 .
    1
    2
    3
    4
    5
    6
    # zfs list
    NAME USED AVAIL REFER MOUNTPOINT
    tank 92.0K 67.0G 9.5K /tank
    tank/home 24.0K 67.0G 8K /export/zfs
    tank/home/billm 8K 67.0G 8K /export/zfs/billm
    tank/home/bonwick 8K 10.0G 8K /export/zfs/bonwick

    3相关差别

    1. 传统的文件系统被限制在单个磁盘设备之内,它们的尺寸是不能超越单个磁盘设备。
    2. 传统文件系统须要驻留于单独设备或者须要一个卷管理系统去使用一个以上的设备,而ZFS建立在虚拟的,被称为“zpools”的存储池之上 (存储池最早在AdvFS实现,而且加到后来的Btrfs)。[1]
    3. 过去的文件系统是被影射到一个物理存储单元,如:分区;全部的ZFS文件系统共享池内的可获得的存储空间。
    4. ZFS 文件系统不须要通过编辑/etc/vfstab 文件来维护。
    ZFS已经抛弃了卷管理,逻辑卷可以不再使用。由于ZFS在使用和管理raw设备可以有更好的表现。
    Components of a ZFS Storage Pool
    组成ZFS存储池的元件有:磁盘、文件、虚拟设备,当中磁盘能够是整个硬盘(c1t0d0),也能够是单个slice(c0t0d0s7)。推荐使用整个硬盘,这样能够省去分区操作(format)。
    RAID-Z 跟 RAID-5的差别
    传统的raid-5都存在着“写漏洞”,就是说假设raid-5的stripe在正写数据时,假设这时候电源中断,那么奇偶校验数据将跟该部分数据不同步,因此前边的写无效;RAID-Z用了“variable-width RAID stripes”技术,因此全部的写都是full-stripe writes。之所以能实现这样的技术,就是由于ZFS集成了文件系统和设备管理,使得文件系统的元数据有足够的信息来控制“variable-width RAID stripes”
    理论上说,创建RAID-Z须要至少三块磁盘,这跟raid-5差点儿相同。比如:
    raidz c1t0d0 c2t0d0 c3t0d0
    还能够更加复杂一点,比如:
    raidz c1t0d0 c2t0d0 c3t0d0 c4t0d0 c5t0d0 c6t0d0 c7t0d0 raidz c8t0d0 c9t0d0 c10t0d0 c11t0d0 c12t0d0 c13t0d0 c14t0d0
    上边这个样例创建了14个磁盘的RAID-Z , 这14个盘被分成了两组,但下边这句话有点不大明确:
    RAID-Z configurations with single-digit groupings of disks should perform better.
    (我的理解是:相对于大于10个硬盘组成的RAID-Z,少于10个(single-digit 即1位数)硬盘组成的RAID-Z的性能会更好)         奇数个硬盘(>3)组成的RAID-Z在理论上来说会表现的更好(实际測试中也是,同RAID-5)
    RAID-Z具有自己主动修复数据的功能
    当有损坏的数据块被检測到,ZFS不但能从备份中找到同样的正确的数据,并且还能自己主动的用正确数据修复损坏的数据。

    4创建过程

    ⒈创建一个主要的存储池,方法非常easy:
    1
    # zpool create tank c1t0d0 c1t1d0
    这时能够在 /dev/dsk 文件夹下看到一个大的slice,数据动态的stripe跨过全部磁盘!
    ⒉创建一个镜像的存储池
    也是非常easy,仅仅要在上边命令基础上添加“mirror”keyword就能够了,下边是创建一个两路(two-way)镜像的样例:
    1
    # zpool create tank mirror c1d0 c2d0 mirror c3d0 c4d0
    ⒊创建RAID-Z存储池
    使用“raidz”keyword就能够了,比如:
    1
    # zpool create tank raidz c1t0d0 c2t0d0 c3t0d0 c4t0d0 /dev/dsk/c5t0d0
    这里/dev/dsk/c5t0d0事实上跟用c5t0d0是一样的,由此能够看出,在创建ZFS的时候,磁盘全然能够用物理设备名就能够,不须要指出全路径。
    ⒋检測正在使用的设备
    在格式化设备之前,ZFS首先决定磁盘是否已经在用或者是否装有操作系统,假设磁盘在用了,那么将会出现下边的错误提示:
    1
    2
    3
    4
    5
    6
    7
    # zpool create tank c1t0d0 c1t1d0
    invalid vdev specification
    use ’-f’ to override the following errors:
    /dev/dsk/c1t0d0s0 is currentlymounted on
    dev/dsk/c1t0d0s1 is currentlymounted on swap
    /dev/dsk/c1t1d0s0 is part of active ZFS pool ’zeepool’
    Please see zpool(1M)
    有些错误能够用 -f 选项来强制覆盖,可是大多错误是不能的。下边给出不能用-f覆盖的错误情况,这时仅仅能手工纠正错误:
    1
    2
    3
    4
    Mounted file system The disk or one of its slices contains a file system that is currently mounted. To correct this error,use the umount command.
    File system in /etc/vfstab The disk contains a file system that is listed in the /etc/vfstab file,but the file system is not currently mounted. To correct this error,remove or comment out the line in the /etc/vfstab file.
    Dedicated dump device The disk is in use as the dedicated dump device for the system. To correct this error,use the dumpadm command.
    Part of a ZFS pool The disk or file is part of an active ZFS storage pool. To correct this error,use the zpool command to destroy the pool.
    ⒌创建存储池时默认的mount点
    在创建存储池时,假设mount点所在文件夹不存在,系统会自己主动创建,假设存在,根数据集(root dataset)会自己主动mount到这个文件夹上。
    To create a pool with a different default mount point,use the -m option of the zpool create command:
    # zpool create home c1t0d0
    default mountpoint ’/home’ exists and is not empty
    use ’-m’ option to specifya different default
    # zpool create -m /export/zfs home c1t0d0
    This command creates a new pool home and the home dataset with a mount point of /export/zfs.
    ⒍删除存储池
    Pools are destroyed by using the zpool destroy command. This command destroys the pool even if it contains mounted datasets.
    # zpool destroy tank

    5存储池管理设备

    ⒈添加设备到存储池
    用户能够通过添加一个新的顶级虚拟设备的方法动态给存储池添加空间,这个空间马上对空间中的全部数据集(dataset)有效。要添加一个虚拟设备到池中,用“zpool add”命令,比如:
    # zpool add zeepool mirror c2t1d0 c2t2d0
    该命令也能够用 -n选项进行预览,比如:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    # zpool add -n zeepool mirror c3t1d0 c3t2d0
    would update ’zeepool’ to the following configuration:
    zeepool
    mirror
    c1t0d0
    c1t1d0
    mirror
    c2t1d0
    c2t2d0
    mirror
    c3t1d0
    c3t2d0
    ⒉添加和降低一路镜像
    用“zpool attach”命令添加一路镜像,比如:
    # zpool attach zeepool c1t1d0 c2t1d0
    在这个样例中,如果 zeepool 是第一点里的那个zeepool(已经是两路镜像),那么这个命令将把zeepool升级成三路镜像。
    用“zpool detach”命令来分离一路镜像
    # zpool detach zeepool c2t1d0
    假设池中不存在镜像,这个才操作将被拒绝。错误提演示样例如以下边这个样例:
    # zpool detach newpool c1t2d0 cannot detach c1t2d0: onlyapplicable to mirror and replacing vdevs
    ⒊管理设备的“上线”和“下线”
    ZFS同意个别的设备处于offline或者online状态。当硬件不可靠或者还没有全然不能用的时候,ZFS会继续向设备读写数据,但只是是暂时这么做,由于设备还能将就使用。一旦设备不能使用,就要指示ZFS忽略该设备,并让这个坏掉的设备下线。ZFS不会向offline的设备发送不论什么请求。
    注意:如 果仅仅是为了更换设备(被换设备并没有出问题),不 须要把他们offline。假设offline设备,然 后换了一个新设备上去,再 把新设备online,这 么做会出错!
    用“zpool offline”命令让设备下线。比如:
    # zpool offline tank c1t0d0
    bringing device c1t0d0 offline
    下边这句话没怎么看懂:
    You cannot take a pool offline to the point where it becomes faulted. For example,you cannot take offline two devices out of a RAID-Z configuration,nor can you take offline a top-level virtual device.
    # zpool offline tank c1t0d0
    cannot offline c1t0d0: no valid replicas
    默认情况下,offline设备将永久保持offline状态,直到系统又一次启动。
    要暂时offline一个设备,用-t选项,比如:
    # zpool offline -t tank c1t0d0
    bringing device ’c1t0d0’ offline
    用“zpool onine”命令使设备上线
    # zpool online tank c1t0d0
    bringing device c1t0d0 online
    注意:假设仅仅是为了更换设备(被换设备并没有出问题),不须要把他们offline。假设offline设备,然后换了一个新设备上去,再把新设备online,这么做会出错!在这个问题上文档是这么说的:(但愿我没理解错)
    Note that you cannot use device onlining to replace a disk. If you offline a
    device,replace the drive,and try to bring it online,it remains in the faulted state.
    ⒋清扫存储池设备
    假设设备由于出现错误,被offline了,能够用“zpool clear”命令清扫错误。
    假设没有特别指定,zpool clear命令清扫池里全部设备。比如:
    # zpool clear tank
    假设要清扫指定设备,比如:
    # zpool clear tank c1t0d0
    ⒌替换存储池里的设备
    用“zpool replace”命令替换池中设备,比如:
    # zpool replace tank c1t1d0 c1t2d0
    c1t1d0 被 c1t2d0 替换
    注意:假设是mirror或者RAID-Z,替换设备的容量必须大于或等于全部设备最小容量!

    6查询存储池状态

    ⒈ZFS存储池的基本信息
    用“zpool list”命令查看存储池的基本信息,比如:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    # zpool list
    NAME SIZE USED AVAIL CAP HEALTH ALTROOT
    tank 80.0G 22.3G 47.7G 28% ONLINE -
    dozer 1.2T 384G 816G 32% ONLINE -
    NAME:The name of the pool.
    SIZE:The total size of the pool,equal to the sum of the size of all top-level virtual
    devices.
    USED:The amount of space allocated by all datasets and internal metadata. Note that
    this amount is different from the amount of space as reported at the file system level.
    AVAILABLE:The amount of unallocated space in the pool.
    CAPACITY (CAP):The amount of space used,expressed as a percentage of total space.
    HEALTH:The current health status of the pool.
    ALTROOT:The alternate root of the pool,if any.
    能够通过指定名字来查看某一个池的状态,比如:
    1
    2
    3
    # zpool list tank
    NAME SIZE USED AVAIL CAP HEALTH ALTROOT
    tank 80.0G 22.3G 47.7G 28% ONLINE -
    假设要有选择看状态列表,能够用-o选项
    1
    2
    3
    4
    5
    # zpool list -o name,size
    NAME SIZE
    tank 80.0G
    dozer 1.2T
    Scripting ZFS Storage Pool Output
    The default output for the zpool list command is designed for readability,and is not easy to use as art of a shell script. To aid programmatic uses of the command,the -H option can be used to uppress the column headings and separate fields by tabs,rather than by spaces. For example,to request a simple list of all pool names on the system:
    1
    2
    3
    4
    5
    6
    7
    # zpool list -Ho name
    tank
    dozer
    Here is another example:
    # zpool list -H -o name,size
    tank 80.0G
    dozer 1.2T
    ⒉查看存储池的I/O状态
    用“zpool iostat”命令查看存储池的I/O状态,比如:
    1
    2
    3
    4
    5
    6
    # zpool iostat
    capacity operations bandwidth
    pool used avail read write read write
    ---------- ----- ----- ----- ----- ----- -----
    tank 100G 20.0G 1.2M 102K 1.2M 3.45K
    dozer 12.3G 67.7G 132K 15.2K 32.1K 1.20K
    ⒊ZFS存储池的健康状态
    用“zpool status”查看健康状态

    7管理方式

    ZFS是把存储设备建立成为一个存储池,在这个池中,还能够建立更小的池。每一个同等级池之间的关系能够使各种raid关系;而子父级之间的关系,就和 存储设备和存储池之间 一样。能够在下图中清楚看到这样的管理方式是怎样存在的。
    命令 zpool = zfs
    一般过程是先查看有哪些设备连接了,FreeBSD或solaris中的linux命令
    1  $ fdisk -l
    是无效的,要列出连接的硬盘,我选择
    1   $ format
    命令,记录下全部设备编号,如VMware下就是c5t0d0,c5t1d0,c5t2d0,….
    查看zfs状态的命令
    1   $ zpool status
    能够看到系统内全部存储池状态和硬盘健康度,能够在status后面加 -x 參数看全部存储池是否健康   类似的能够查看存储池总容量(包含冗余)情况的命令
    1    $ zpool list
    用来搭配使用的
    1    $ df -h poolname
    检查容量实际使用情况
    zfs建立一个存储池的命令是
    1    $ zpool create poolname raidz1 c5t0d0 c5t1d0 c5t2d0
    将会把c5t1~3d0 3个硬盘建立一个名字为poolname的raidz1模式(raid5)的存储池。
    删除销毁一个存储池命令是
    1    $ zpool destroy poolname
    将zfs的存储池挂载和卸载的命令,如同mount/unmount的是
    1    $ zpool import/export poolname
    这个通常是在恢复日志历史镜像等应用时使用。也能够恢复被destroy的存储池,使用
    1    $ zpool import -D poolname
    要看存储池的实时读写状态命令
    1    $ zpool iostat 1
    重中之重的replace命令,
    1    $ zpool replace poolname c5t0d0 c6t0d0
    就是将接入但没使用的c6t0d0替换了正在使用的c5t0d0,这时使用zpool status应该会看到这两个盘正在replacing,或者rebuild,这在替换报错error/fault的硬盘,或者使用更大的容量替换老硬盘的时候都实用。   当一个raid内全部硬盘都替换为新的更大容量的硬盘后,能够使用
    1    $ zpool set autoexpand=on poolname
    开启存储池自己主动扩展的属性(默觉得禁止),或
    1    $ zpool online -e poolname c6t0d0
    对一个已经存在的设备使用online命令来达到扩容的目的,再次zpool list查看容量应该能够看到真个raid容量已经扩大了。   当中online命令相应的是offline,zfs中常这样使用
    1    $ zpool offline poolname c6t0d0
    当然zfs支持raid中的热备份,能够在create的时候加入spare设备,比如
    1    $ zpool create raidz1 poolname c5t0d0 c5t1d0 c5t2d0 spare c6t0d0
    c6t0d0就成为了热备份设备,要删除这个热备份设备(或日志,快速缓存),就要使用命令
    1    $ zpool remove c6t0d0
    而相应的zpool add命令却使用非常有限,由于这个add仅仅能在现有容量上扩充,也就是增加现有的存储池形成raid0,这非常有风险,比方poolname中有c5t1~3d0 3个硬盘形成的raidz1 容量为20G的存储池,使用
    1    $ zpool add -f poolname mirror c6t0d0 c6t1d0
    这条命令的意义就是 先将c6t0d0 c6t1d0两盘镜像即raid1,例容量15G,再增加poolname中和已有的c5t1~3d0 raidz1的20G容量再raid0,衔接后面,之后存储池poolname中的总容量就等于20G+15G =35G。假设一个盘坏了,c5t0d0坏了,就会对前面一个raidz1形成影响,变成degraded降级状态,后面一个镜像的c6t0d0 c6t1d0则没有影响。假设后面的两个不是镜像,而是raid0模式,假设一个坏了offline,直接就导致这个raid0失败不可訪问,间接的导致整个存储池不可訪问,哪怕这个存储池中有一部分的容量自身有备份。
    所以add命令必须搭配 -f 參数,意思是强制加入容量到存储池后面,加上zfs仅仅能添加容量不能缩小的特性,为了保险起见,全部add加入的容量必须自身足够安全(比方自身就是raid),否则一旦损坏会出现上面这种导致全部存储不可訪问的问题。这个风险你应该在使用add命令的时候就很清楚。zfs中不推荐使用raid0模式,除了万不得已。
    最好的最安全的扩容就是在raidz1或者raidz2(raid5/raid6)基础上,用大容量设备replace旧的小容量设备,等重建替换完毕后,挨个把存储池内全部存储设备升级替换,全部完毕后使用前面的扩容命令自己主动扩容。
    zfs文件系统除了方便扩容,方便管理,安全简单以外,当然性能也相同不能太低。而一些朋友经常争论,到底raid 0+1还是raidz1/raidz2更快,我认为是没有意义的,由于经常终于管理的存储的容量和速度是成反比的,仅仅要安全,訪问速度快慢就交给缓存来解决。zfs在更新数个版本号后,缓存管理已经很优秀了,基本上在仅仅有内存做缓存的系统上,除去主要的4G RAM系统最低要求,每添加10G经常使用数据,就要添加1G RAM来保证命中和速度,比方后面是100G的经常使用数据,那么就须要100/10+4G=14G内存来保证较高的读取速度。内存价格偏高,且不easy扩展的时候,就出现了使用SSD固态硬盘来做缓存的技术,形成了CPU->RAM->SSD cache->HDD ZFS的三层结构。在FreeNAS中这点做得非常好,设置非常方便,有文章指出,4G系统内存下,网络訪问速度约为400Mbit/sec read + 300Mbit/sec write,而8G内存+64G SSD的缓存结构下,能够达到900Mbit/sec read + 600Mbit/sec write,跑满千兆网络,同一时候iSCSI性能飞升,生产环境中也应该这样搭建使用。命令也非常easy,仅仅须要在create的时候添加cache SSD0,也能够单独使用命令
    1    $ zpool add poolname cache SSD0 SSD1
    来添加一个或多个缓存,此缓存设备能够通过前面提到的remove命令轻松删除。
    到这里已经差点儿相同了,对于存储池内数据的完整性,通过命令
    1    $ zpool scrub poolname
    达到校验的目的,这通常会花费非常长的时间,能够通过zpool status查看校验进度,最好在硬件出现故障,解决后都校验一次以保证一切正常。
    观察近两年的发展,FreeBSD的活跃度已经渐渐赶上Linux的开发速度了,相互之间的借鉴也越来越多,而在此之上的solaris也被广泛使用,作为数据server的首选。[2]

    8创新

    1)ZPOOL,一个动态可扩展的存储池
    其对外提供一个虚拟的设备,能够动态的加入磁盘,移除坏盘,做mirror, raid0, raidz 等。 基于这个动态调节的ZFS Pool之上的新的逻辑硬盘能够被文件系统使用,而且会自己主动的选择最优化的參数。
    这个有点像SAN ,SAN 对外提供的也是一个虚拟磁盘,该磁盘时能够跨网络的, ZFS是本地文件系统,仅仅能实现本地磁盘。
    2)Copy-on-write 技术。 这个技术并不复杂,也不难理解。可是这个技术是有严重的performance的问题的。
    有人说有了这个后,就不须要fsck, scandisk了,这个说法是不正确的。 其实,有了日志文件系(journal filesystem) 后,就不须要fsck这个ugly的东西了。
    Copy-on-Write 技术是能够觉得是还有一个journal 的实现,和日志不同的是,它不是re-do 日志,而是直接改动文件的block的指针。它对于文件本身的数据的完整性是没有问题的,当写一个新的block 时,没有performance的影响,当些一个旧的block时,须要先copy一份,性能可想要大跌。对于元数据,性能损失就更加明显了。
    总之,通过这个技术,和Transaction技术一起,确实能够对数据的一致性得到比較好的保护,可是性能的损失怎样去弥补,这是一个问题。
    3)智能预读取(Intelligent Prefetch)
    prefetch 技术是顺序读的一个性能优化的非常好的技术。 ZFS实现了更智能的预定模式。
    目 前预取技术就是对顺序读比較有效。对于其他类型的訪问模式,一是模式检測比較难,其次即使检測出来,因为性能的 bottleneck 可能在别的地方,性能优化并不理想。 ZFS的预取技术,添加了Strip模式的预取,这在ZFS模式下是有效的,其他的模式并没有看到。其次目 前都是针对单流预取,针对多流非常少。
    4)Dynamic Striping
    所谓的动态striping,就是能够再不同设备上分配 block,不同设备上当然是并发的写入, 能够觉得是一种strip操作。 和 static striping 不同,是须要事前设置。 这个是ZFS的动态存储池本身的架构带来的优势。
    5)添加了数据的Checksum校验
    这个技术是小技巧,没啥可评价的,看以下的介绍。   由于ZFS全部的数据操作都是基于Transaction(事务),一组对应的操作会被ZFS解析为一个事务操作,事务的操作就代表着一组操作要么一起失败,要么一起成功。并且如前所说,ZFS对 全部的操作是基于COW(Copy on Write), 从而保证设备上的数据始终都是有效的,再也不会由于系统崩溃或者意外掉电导致数据文件的inconsistent。   另一种潜在威胁数据的可能是来自于硬件设备的问题,比方磁盘,RAID卡的硬件问题或者驱动bug。现有文件系统通常遇到这个问题,往往仅仅是简单的把错误数据直接交给上层应用,通常我们把这个问题称作 Silent Data Corruption。而在ZFS中,对全部数据无论是用户数据还是文件系统自身的metadata数据都进行256位的Checksum(校验),当ZFS在提交数据时会进行校验,彻底杜绝这样的Silent Data Corruption情况。
    值得注意的是,ZFS通过COW技术和Chumsum技术有效的保护了数据的完整性。
    6)Extent的概念:支持多种 大小的数据块(Multiple Block Size)
    眼下最新的思想,都是丢弃block的概念,引入Extent的概念,Extent就是连续的多个block,注意Extent的block是变长的。多种Block Size 对大文件和 小文件都能够有非常好的优化。这个仅仅是剩怎样实现了。
    7)自我修复功能 ZFS Mirror 和 RAID-Z   传统的硬盘Mirror及RAID 4,RAID 5阵列方式都会遇到前面提到过的问题:Silent Data Corruption。假设发生了某块硬盘物理问题导致数据错误,现有的Mirror,包含RAID 4,RAID 5阵列会默默地把这个错误数据提交给上层应用。假设这个发生错误在Metadata中,则会直接导致系统的Panic。并且另一种更为严重的情况是:在 RAID 4和RAID 5阵列中,假设系统正在计算Parity数值,并再次写入新数据和新Parity值的时候发生断电,那么整个阵列的全部存储的数据都毫无意义了。   在ZFS中则提出了相相应的ZFS Mirror和RAID-Z方式,它在负责读取数据的时候会自己主动和256位校验码进行校验,会主动发现这样的Silent Data Corruption,然后通过相应的Mirror硬盘或者通过RAID-Z阵列中其它硬盘得到正确的数据返回给上层应用,而且同一时候自己主动修复原硬盘的 Data Corruption 。
    8)提供很多企业级别的超强功能:Quota(配额), Reservation(预留), Compression(压 缩), Snapshot(快照),Clone(克隆)。而且速度很快。
    对于本地文件系统系统,支持Quota,Reservation,Compression 并不难,对于用COW技术,Snapshot,Clone差点儿是COW的附带的产品,实现都非常easy。
    9)ZFS的容量无限制。
    他是怎样做到的呢?一个就是ZPOOL, 这使得容量能够动态扩展,其次,元数据也是动态分配的,也就是inode也是动态分配的。 对于本地文件系统,我们说的扩展性,这的是容量线性扩展, performance的线性扩展,包含IOPS 和 Bandwidth , 对于ZFS,声称能够实现线性扩展。
    最后我们来具体理解RAID技术
    用ZFS中实现RAID结构RAID是“Redundant Array of Independent Disk”的缩写,中文意思是独立冗余磁盘阵列。冗余磁盘阵列技术诞生于1987年,由美国加州大学伯克利分校提出。
    RAID技术在存储领域的有着很关键的数据,满足了不同的需求。RAID依照实现原理的不同分为不同的级别,不同的级别之间工作模式是有差别的。整个的 RAID结构是一些磁盘结构,通过对磁盘进行组合达到提高效率,降低错误的目的,不要由于这么多名词而被吓坏了,它们的原理实际上十分简单。以下我就给大家简介一下在ZFS中能够实现的三种RAID技术:RAID 0、RAID 1和RAID Z(RAID 5的改进)。RAID 0:无差错控制的带区组

    要实现RAID0必需要有两个以上硬盘驱动器,RAID0实现了带区组,数据并非保存在一个硬盘上,而是分成数据块保存在不同驱动器上。RAID0分为串联卷和并两卷两种。
    串联卷写数据是依照顺序写进不同的可用分片,当第一个分片写满时才写第二个分片,这样的存储方式仅仅是为我们提供了一种方便的管理结构,便于我们将多个硬盘组合起来,却没有实现更好的性能。
    并联卷在写数据时,是将数据平均分布到各个分片上。由于将数据分布在不同驱动器上,所以数据吞吐率大大提高,驱动器的负载也比較平衡。假设刚好所须要的数据在不同的驱动器上效率最好。它不须要计算校验码,实现easy。它的缺点是它没有数据差错控制,假设一个驱动器中的数据错误发生,即使其他盘上的数据正确也无济于事了。不应该将它用于对数据稳定性要求高的场合。假设用户进行图象(包含动画)编辑和其他要求传输比較大的场合使用RAID0比較合适。同一时候,RAID0能够提高传输数据速率,比方所需读取的文件分布在两个硬盘上,这两个硬盘能够同一时候读取。那么原来读取相同文件的时间被缩短为1/2。在全部的级别中,RAID 0的速度是最快的。可是RAID 0没有冗余功能的,假设一个磁盘(物理)损坏,则全部的数据都无法使用。
    在ZFS文件系统里,我们能够非常easy的实现这样的结构,在我们组建存储池的过程中,我们就能够建立我们须要的RAID结构的存储池,而在默认情况下,ZFS建立的就是RAID0结构的存储池。
    比如:命令 Tonsen#zpool create mypool c0d0 c0d1 就是将c0d0和c0d1组成了一个RAID0结构的存储池,以后向这个池中添加数据时,它的数据分布就是採用平均分布的形式。

    RAID 1:镜象结构

    对于使用这样的RAID1结构的设备来说,RAID控制器必须能够同一时候对两个盘进行读操作和对两个镜象盘进行写操作,所以必须有两个驱动器。由于是镜象结构在一组盘出现故障时,能够使用镜象,提高系统的容错能力。它比較easy设计和实现。每读一次盘仅仅能读出一块数据,也就是说数据块传送速率与单独的盘的读取速率同样。由于RAID1的校验十分完备,因此对系统的处理能力有非常大的影响,通常的RAID功能由软件实现,而这样的实现方法在server负载比較重的时候会大大影响server效率。当您的系统须要极高的可靠性时,如进行数据统计,那么使用RAID1比較合适。并且RAID1技术支持“热替换”,即不断电的情况下对故障磁盘进行更换,更换完成仅仅要从镜像盘上恢复数据就可以。当主硬盘损坏时,镜像硬盘就能够取代主硬盘工作。镜像硬盘相当于一个备份盘,可想而知,这样的硬盘模式的安全性是非常高的,RAID 1的数据安全性在全部的RAID级别上来说是最好的。可是其磁盘的利用率却仅仅有50%,是全部RAID级别中最低的。
    在ZFS文件系统里,我们能够通过在命令中添加mirror參数来构建镜像结构的存储池。
    比如:命令 Tonsen#zpool create mypool mirror c0d0 c0d1 就是将c0d0和c0d1组成了一个RAID1结构的镜像存储池,以后向这个池中添加数据时,它的数据分布是会写到它全部的镜像盘上。
    使用命令 Tonsen#zpool status 我们能够非常清楚的看到镜像结构,例如以下:
    pool: mypool
    state: ONLINE
    scrub: none requested
    config:

    NAME STATE READ WRITE CKSUM
    mypool ONLINE 0 0 0
    mirror ONLINE 0 0 0
    c0d0 ONLINE 0 0 0
    c0d1 ONLINE 0 0 0

    errors: No known data errors

    我们甚至能够在ZFS中将RAID0和RAID1组合起来,形成一个综合的RAID结构。
    比如:命令 Tonsen#zpool create mypool mirror c0d0 c0d1 mirror c1d0 c1d1 就是将c0d0、c0d1和c1d0、c1d1分别组成两个镜像,然后这两个镜像又构成一个RAID0的结构。这样的结构既提高了可靠性也提高了性能。
    使用命令 Tonsen#zpool status 查看一下它的结构,例如以下:
    pool: mypool
    state: ONLINE
    scrub: none requested
    config:

    NAME STATE READ WRITE CKSUM
    mypool ONLINE 0 0 0
    mirror ONLINE 0 0 0
    c0d0 ONLINE 0 0 0
    c0d1 ONLINE 0 0 0
    mirror ONLINE 0 0 0
    c1d0 ONLINE 0 0 0
    c1d1 ONLINE 0 0 0

    errors: No known data errors

    RAID 5:分布式奇偶校验的独立磁盘结构

    它的奇偶校验码存在于全部磁盘上,当中的p0代表第0带区的奇偶校验值,其他的意思也同样。RAID5的读出效率非常高,写入效率一般,块式的集体訪问效率不错。由于奇偶校验码在不同的磁盘上,所以提高了可靠性,同意单个磁盘出错。RAID 5也是以数据的校验位来保证数据的安全,但它不是以单独硬盘来存放数据的校验位,而是将数据段的校验位交互存放于各个硬盘上。这样,不论什么一个硬盘损坏,都能够依据其他硬盘上的校验位来重建损坏的数据。硬盘的利用率为n-1。可是它对传输数据的并行性解决不好,并且控制器的设计也相当困难。而对于RAID 5来说,大部分传输数据仅仅对一块磁盘操作,可进行并行操作。在RAID 5中有“写损失”,即每一次写操作,将产生四个实际的读/写操作,当中两次读旧的数据及奇偶信息,两次写新的数据及奇偶信息。

    RAID Z:是RAID5的改进版本号,是solaris10里ZFS特有的一种Raid级别。

    容错能力与RAID 5同样,可是对于RAID 5的写入漏洞问题提供了软件解决方式,使用动态的条带化。传统的RAID 5都存在着“写漏洞”,就是说假设RAID 5的stripe在正写数据时,假设这时候电源中断,那么奇偶校验数据将跟该部分数据不同步,因此前边的写无效;RAID-Z用了“variable- width RAID stripes”技术,因此全部的写都是full-stripe writes。之所以能实现这样的技术,就是由于ZFS集成了文件系统和设备管理,使得文件系统的元数据有足够的信息来控制“variable-width RAID stripes”。理论上说,创建RAID-Z须要至少三块磁盘,这跟RAID 5差点儿相同。

    比如:Tonsen#zpool create mypool raidz c0d0 c0d1 c1d0 c1d1 就是创建了一个由c0d0、c0d1、c1d0和c1d1四块硬盘组成的raidz结构。
    使用命令 Tonsen#zpool status 来查看它的结构例如以下:
    pool: mypool
    state: ONLINE
    scrub: none requested
    config:

    NAME STATE READ WRITE CKSUM
    mypool ONLINE 0 0 0
    raidz1 ONLINE 0 0 0
    c0d0 ONLINE 0 0 0
    c0d1 ONLINE 0 0 0
    c1d0 ONLINE 0 0 0
    c1d1 ONLINE 0 0 0

    errors: No known data errors

    在ZFS文件系统里,我们能够通过非常easy的方式,就能组织我们须要的各种RAID结构的存储单元,这为我们提供了异常强大的存储管理能力.

  • 相关阅读:
    redux-devtools的使用
    Electron-builder打包详解
    HTML JAVASCRIPT CSS 大小写敏感问题
    electron/nodejs实现调用golang函数
    基于react开发package.json的配置
    Chrome插件(扩展)开发全攻略
    Chrome插件中 popup,background,contentscript消息传递机制
    Linux 开机引导和启动过程详解
    bash 的配置文件加载顺序
    常用Electron App打包工具
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/4303086.html
Copyright © 2011-2022 走看看