作者:Cindy Swearingen
2014 年 7 月发布
在云数据存储需求爆炸式增长的时代,Oracle Solaris ZFS 提供了一些集成特性以减少存储空间。ZFS 还提供了灵活的分层存储模型,您可以将重要数据托管在速度最快的存储设备上,同时将不太重要的数据压缩和存档到标准存储设备。
|
在 Oracle Solaris 11 中,Oracle Solaris ZFS 提供了以下方法来优化您的存储要求:
dedup
) 属性后,将数据块写入磁盘时将删除重复的数据块。启用重复数据删除将占用系统和内存资源,因此必须确定您的数据是否可重复数据删除,以及系统是否有足够资源支持重复数据删除过程。使用以下过程启用默认的 ZFS 压缩算法 (LZJB),这通常会减少企业级系统上的存储空间(如图 1 所示),不会影响系统性能。
图 1. 使用 ZFS 压缩减少存储空间
# zfs create tank/data
# cp file.1 /tank/data/file.1
# zfs list tank/data
# zfs create -o compression=on tank/newdata
# cp /tank/data/file.1 /tank/newdata/file.1 # zfs list tank/data
# zfs list tank/newdata
zfs list
输出中这两个文件系统的所示大小:压缩后数据的大小应为原始文件大小的 1/3-1/2。如果示例数据不可压缩,启用 ZFS 压缩并不适合您的数据。
# zfs create -o compression=on tank/newdata
请记住,如果在现有文件系统上启用压缩,只会压缩新数据。
如果 ZFS 文件系统已启用 dedup
属性,在将数据块写入磁盘时将删除重复的数据块。结果是磁盘上只存储独一无二的数据,文件之间共享共同的组成部分,如图 2 所示。
图 2. 启用重复数据删除时如何删除重复数据块的示例
重复数据删除可以节省磁盘空间使用和成本。但在启用重复数据删除之前,必须确保您的数据可重复数据删除,且系统满足内存要求。
如果您的数据不支持重复数据删除,启用重复数据删除不仅毫无意义,还会浪费 CPU 资源。ZFS 重复数据删除是带内操作,这意味着重复数据删除只发生在将数据写入磁盘时,同时影响 CPU 和内存资源。
重复数据删除表 (DDT) 会占用内存,最终会溢出以至于占用磁盘空间。此时,ZFS 将不得不为尝试进行重复数据删除的每个数据块执行额外的读写操作。这将导致性能下降。
数据池很大但物理内存很小的系统执行重复数据删除的性能不好。如果系统不满足内存要求,有些操作(如删除启用了重复数据删除的大型文件系统)会严重降低系统性能。
此外,考虑在文件系统上启用压缩是否将提供一种更好的办法来减少磁盘空间占用。
zdb
命令确定文件系统上的数据是否支持重复数据删除。如果估计的重复数据删除率大于 2,您可能会看到空间节省。在清单 1 所示的示例中,重复数据删除率小于 2,因此不建议启用重复数据删除。
# zdb -S tank Simulated DDT histogram: bucket allocated referenced ______ ______________________________ ______________________________ refcnt blocks LSIZE PSIZE DSIZE blocks LSIZE PSIZE DSIZE ------ ------ ----- ----- ----- ------ ----- ----- ----- 1 1.00M 126G 126G 126G 1.00M 126G 126G 126G 2 11.8K 573M 573M 573M 23.9K 1.12G 1.12G 1.12G 4 370 418K 418K 418K 1.79K 1.93M 1.93M 1.93M 8 127 194K 194K 194K 1.25K 2.39M 2.39M 2.39M 16 43 22.5K 22.5K 22.5K 879 456K 456K 456K 32 12 6K 6K 6K 515 258K 258K 258K 64 4 2K 2K 2K 318 159K 159K 159K 128 1 512 512 512 200 100K 100K 100K Total 1.02M 127G 127G 127G 1.03M 127G 127G 127G dedup = 1.00, compress = 1.00, copies = 1.00, dedup * compress / copies = 1.00
清单 1
每个核内 DDT 块约为 320 字节。因此要将分配块数乘以 320。下面的示例使用清单 1 中的数据:
核内 DDT 大小 (1.02M) x 320 = 需要 326.4 MB 内存。
dedup
属性。确保只在具有可重复数据删除数据的文件系统上启用 dedup
。
# zfs set dedup=on mypool/myfs
ZFS 提供了一些用于配置灵活的分层存储池的选项,以优化您的企业存储,如图 3 所示。
图 3. 分层存储池示例
使用以下过程配置分层存储池:
镜像池可为大多数负载提供最佳性能。例如,以下语法创建一个镜像 ZFS 存储池 tank,它有两个镜像组件(每个有两个硬盘),以及一个备用磁盘:
# zpool create tank mirror disk1 disk2 mirror disk3 disk4 spare disk5
RAIDZ 池对于存档数据是一个很好的选择。例如,以下语法创建一个 RAIDZ-2 池 rzpool
,它有一个 RAIDZ-2 组件,由五个磁盘和一个备用磁盘组成。将快照流发送到新池时,我们还在接收文件系统上启用压缩:
# zpool create rzpool raidz2 disk1 disk2 disk3 disk4 disk5 spare disk6 # zfs snapshot -r tank/old_data@date # zfs send -Rv tank/old_data@date | ssh sys-B zfs receive -o compression=on rzpool/oldtankdata # zfs destroy -r tank/old_data@date
注:您必须配置成在另一个系统上使用 ssh
。
# zpool add tank cache ssd-1 ssd-2
# zpool add nfspool log mirror ssd-1 ssd-2
本文介绍了在 Oracle Solaris 11 中使用 ZFS 减少存储空间和优化数据存储的多种灵活方式。您可考虑采用适合您的应用数据负载及存储和系统资源的最佳方式。
Cindy Swearingen 是 Oracle Solaris 产品经理,擅长 ZFS 和存储特性。
修订版 1.0,2014 年 7 月 14 日 |