暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

REDHAT 7.5beta 新推出的VDO功能

磨磨谈 2018-02-10
285

前言

关于VDO

VDO的技术来源于收购的Permabit公司,一个专门从事重删技术的公司,所以技术可靠性是没有问题的

VDO是一个内核模块,目的是通过重删减少磁盘的空间占用,以及减少复制带宽,VDO是基于块设备层之上的,也就是在原设备基础上映射出mapper虚拟设备,然后直接使用即可,功能的实现主要基于以下技术:

  • 零区块的排除:

    在初始化阶段,整块为0的会被元数据记录下来,这个可以用水杯里面的水和沙子混合的例子来解释,使用滤纸(零块排除),把沙子(非零空间)给过滤出来,然后就是下一个阶段的处理


  • 重复数据删除:

    在第二阶段,输入的数据会判断是不是冗余数据(在写入之前就判断),这个部分的数据通过UDS内核模块来判断(U niversal D eduplication S ervice),被判断为重复数据的部分不会被写入,然后对元数据进行更新,直接指向原始已经存储的数据块即可


  • 压缩:

    一旦消零和重删完成,LZ4压缩会对每个单独的数据块进行处理,然后压缩好的数据块会以固定大小4KB的数据块存储在介质上,由于一个物理块可以包含很多的压缩块,这个也可以加速读取的性能


上面的技术看起来很容易理解,但是实际做成产品还是相当大的难度的,技术设想和实际输出还是有很大距离,不然redhat也不会通过收购来获取技术,而不是自己去重新写一套了

如何获取VDO

主要有两种方式,一种是通过申请测试版的方式申请redhat 7.5的ISO,这个可以进行一个月的测试

另外一种方式是申请测试版本,然后通过源码在你正在使用的ISO上面进行相关的测试,从适配方面在自己的ISO上面进行测试能够更好的对比,由于基于redhat的源码做分发会涉及法律问题,这里就不做过多讲解,也不提供rpm包,自行申请测试即可

实践过程

安装VDO

安装的操作系统为CentOS Linux release 7.4.1708

  1. [root@lab101 ~]# lsb_release -a

  2. LSB Version:    :core-4.1-amd64:core-4.1-noarch

  3. Distributor ID:    CentOS

  4. Description:    CentOS Linux release 7.4.1708 (Core)

  5. Release:    7.4.1708

  6. Codename:    Core

复制

内核版本如下

  1. [root@lab101 ~]# uname -a

  2. Linux lab101 3.10.0-693.el7.x86_64 #1 SMP Tue Aug 22 21:09:27 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux

复制
  1. [root@lab101 ~]# rpm -qa|grep kernel

  2. kernel-tools-libs-3.10.0-693.el7.x86_64

  3. abrt-addon-kerneloops-2.1.11-48.el7.centos.x86_64

  4. kernel-3.10.0-693.el7.x86_64

复制

我们把内核升级一下,因为这个模块比较新,所以选择目前updates里面最新的

  1. wget http://mirror.centos.org/centos/7/updates/x86_64/Packages/kernel-3.10.0-693.17.1.el7.x86_64.rpm

复制

大版本一致,小版本不同,直接安装即可

  1. [root@lab101 ~]# rpm -ivh kernel-3.10.0-693.17.1.el7.x86_64.rpm

  2. Preparing...                          ################################# [100%]

  3. Updating / installing...

  4.   1:kernel-3.10.0-693.17.1.el7       ################################# [100%]

  5. [root@lab101 ~]# grub2-set-default 'CentOS Linux (3.10.0-693.17.1.el7.x86_64) 7 (Core)'

复制

重启服务器 安装

  1. [root@lab101 ~]# rpm -ivh kmod-kvdo-6.1.0.98-11.el7.centos.x86_64.rpm

  2. Preparing...                          ################################# [100%]

  3. Updating / installing...

  4.   1:kmod-kvdo-6.1.0.98-11.el7.centos ################################# [100%]

  5. [root@lab101 ~]# yum install PyYAML  

  6. [root@lab101 ~]# rpm -ivh vdo-6.1.0.98-13.x86_64.rpm

  7. Preparing...                          ################################# [100%]

  8. Updating / installing...

  9.   1:vdo-6.1.0.98-13                  ################################# [100%]

复制

到这里安装就完成了

配置VDO

创建一个vdo卷

  1. [root@lab101 ~]# vdo create --name=my_vdo  --device=/dev/sdb1   --vdoLogicalSize=80G --writePolicy=sync

  2. Creating VDO my_vdo

  3. Starting VDO my_vdo

  4. Starting compression on VDO my_vdo

  5. VDO instance 0 volume is ready at /dev/mapper/my_vdo

复制

参数解释: name是创建的vdo名称,也就是生成的新设备的名称,device是指定的设备,vdoLogicalSize是指定新生成的设备的大小,因为vdo是支持精简配置的,也就是你原来1T的物理空间,这里可以创建出超过1T的逻辑空间,因为内部支持重删,可以根据数据类型进行放大,writePolicy是指定写入的模式的

如果磁盘设备是write back模式的可以设置为aysnc,如果没有的话就设置为sync模式

如果磁盘没有写缓存或者有write throuth cache的时候设置为sync模式 如果磁盘有write back cache的时候就必须设置成async模式

默认是sync模式的,这里的同步异步实际上是告诉vdo,我们的底层存储是不是有写缓存,有缓存的话就要告诉vdo我们底层是async的,没有缓存的时候就是sync

检查我们的磁盘的写入方式

  1. [root@lab101 ~]# cat /sys/block/sdb/device/scsi_disk/0\:0\:1\:0/cache_type

  2. write through

复制

这个输出的根据上面的规则,我们设置为sync模式

修改缓存模式的命令

  1. vdo changeWritePolicy --writePolicy=sync_or_async --name=vdo_name

复制

格式化硬盘

  1. [root@lab101 ~]# mkfs.xfs -K /dev/mapper/my_vdo

  2. meta-data=/dev/mapper/my_vdo     isize=512    agcount=4, agsize=5242880 blks

  3.         =                       sectsz=4096  attr=2, projid32bit=1

  4.         =                       crc=1        finobt=0, sparse=0

  5. data     =                       bsize=4096   blocks=20971520, imaxpct=25

  6.         =                       sunit=0      swidth=0 blks

  7. naming   =version 2              bsize=4096   ascii-ci=0 ftype=1

  8. log      =internal log           bsize=4096   blocks=10240, version=2

  9.         =                       sectsz=4096  sunit=1 blks, lazy-count=1

  10. realtime =none                   extsz=4096   blocks=0, rtextents=0

复制

使用-K参数是加速了格式化的操作,也就是不发送丢弃的请求,因为之前创建了vdo,已经将其初始化为0了,所以可以采用这个操作

我们挂载的时候最好能加上discard的选项,精简配置的设备需要对之前的空间进行回收,一般来说有在线的和离线的回收,离线的就通过fstrim来进行回收即可

挂载设备

  1. [root@lab101 ~]# mount -o discard /dev/mapper/my_vdo /myvod/

复制
  1. [root@lab101 ~]# vdostats --human-readable

  2. Device                    Size      Used Available Use% Space saving%

  3. /dev/mapper/my_vdo       50.0G      4.0G     46.0G   8%           99%

复制

默认创建完vdo设备就会占用4G左右的空间,这个用来存储UDS和VDO的元数据

检查重删和压缩是否开启

  1. [root@lab101 ~]# vdo status -n my_vdo|grep Deduplication

  2.    Deduplication: enabled

  3. [root@lab101 ~]# vdo status -n my_vdo|grep Compress

  4.    Compression: enabled

复制

如果没有开启,可以通过下面的命令开启

  1. vdo enableCompression -n <vdo_vol_name>

  2. vdo enableDeduplication -n <vdo_vol_name>

复制

验证重删功能

  1. [root@lab101 ~]# df -h|grep vdo

  2. /dev/mapper/my_vdo   80G   33M   80G   1% /myvod

  3. [root@lab101 ~]# vdostats --hu

  4. Device                    Size      Used Available Use% Space saving%

  5. /dev/mapper/my_vdo       50.0G      4.0G     46.0G   8%           99%

复制

传入一个ISO文件CentOS-7-x86_64-NetInstall-1708.iso 422M的

  1. [root@lab101 ~]# df -h|grep vdo

  2. /dev/mapper/my_vdo   80G  455M   80G   1% /myvod

  3. [root@lab101 ~]# vdostats --hu

  4. Device                    Size      Used Available Use% Space saving%

  5. /dev/mapper/my_vdo       50.0G      4.4G     45.6G   8%            9%

复制

然后重复传入3个相同文件,一共四个文件

  1. [root@lab101 ~]# df -h|grep vdo

  2. /dev/mapper/my_vdo   80G  1.7G   79G   3% /myvod

  3. [root@lab101 ~]# vdostats --hu

  4. Device                    Size      Used Available Use% Space saving%

  5. /dev/mapper/my_vdo       50.0G      4.4G     45.6G   8%           73%

复制

可以看到后面传入的文件,并没有占用底层存储的实际空间

验证压缩功能

测试数据来源 silesia的资料库

  1. http://sun.aei.polsl.pl/~sdeor/corpus/silesia.zip

复制

通过资料库里面的文件来看下对不同类型的数据的压缩情况

Filename描述类型原始空间(KB)实际占用空间(KB)
dickens狄更斯文集英文原文99539948
mozillaMozilla的1.0可执行文件执行程序5002033228
mr医用resonanse图像图片97369272
nci结构化的化学数据库数据库3276710168
oofficeOpen Office.org 1.01 DLL可执行程序60085640
osdb基准测试用的MySQL格式示例数据库数据库98499824
reymont瓦迪斯瓦夫·雷蒙特的书PDF64716312
sambasamba源代码src源码2110011768
sao星空数据天文格式的bin文件70817036
webster辞海HTML4048740144
xmlXML文件HTML52202180
x-ray透视医学图片医院数据82758260

可以看到都有不同程度的压缩,某些类型的数据压缩能达到50%的比例

停止vdo操作

  1. [root@lab101 ~]# vdo stop  -n my_vdo

复制

启动vdo操作

  1. [root@lab101 ~]# vdo start  -n my_vdo

复制

删除vdo操作

  1. [root@lab101 ~]# vdo remove -n my_vdo

复制

VDO和CEPH能产生什么火花?

在ceph里面可以用到vdo的地方有两个,一个是作为Kernel rbd的前端,在块设备的上层,另外一个是作为OSD的底层,也就是把VDO当OSD来使用,我们看下怎么使用

作为rbd的上层

  1. [root@lab101 ceph]# rbd create testvdorbd --size 20G

  2. [root@lab101 ceph]# rbd map testvdorbd

复制

创建rbd的vdo

  1. [root@lab101 ceph]# vdo create --name=rbd_vdo  --device=/dev/rbd/rbd/testvdorbd

  2. Creating VDO rbd_vdo

  3. vdo: ERROR -   Device /dev/rbd/rbd/testvdorbd not found (or ignored by filtering).

复制

被默认排除掉了,这个以前正好见过类似的问题,比较好处理

这个地方因为vdo添加存储的时候内部调用了lvm相关的配置,然后lvm默认会排除掉rbd,这里修改下lvm的配置文件即可 在/etc/lvm/lvm.conf的修改如下

  1. types = [ "fd", 16 ,"rbd", 64 ]

复制

把types里面增加下rbd 的文件类型即可

  1. [root@lab101 ceph]# vdo create --name=rbd_vdo  --device=/dev/rbd/rbd/testvdorbd

  2. Creating VDO rbd_vdo

  3. Starting VDO rbd_vdo

  4. Starting compression on VDO rbd_vdo

  5. VDO instance 2 volume is ready at /dev/mapper/rbd_vdo

复制

挂载

  1. mount -o discard /dev/mapper/rbd_vdo /mnt

复制

查看容量

  1. [root@lab101 mnt]# vdostats --human-readable

  2. Device                    Size      Used Available Use% Space saving%

  3. /dev/mapper/rbd_vdo      20.0G      4.4G     15.6G  22%            3%

复制
  1. [root@lab101 mnt]# ceph df

  2. GLOBAL:

  3.    SIZE       AVAIL      RAW USED     %RAW USED

  4.    57316M     49409M        7906M         13.79

  5. POOLS:

  6.    NAME     ID     USED     %USED     MAX AVAIL     OBJECTS

  7.    rbd      0      566M      1.20        46543M         148

复制
  1. [root@lab101 mnt]# ceph df

  2. GLOBAL:

  3.    SIZE       AVAIL      RAW USED     %RAW USED

  4.    57316M     48699M        8616M         15.03

  5. POOLS:

  6.    NAME     ID     USED      %USED     MAX AVAIL     OBJECTS

  7.    rbd      0      1393M      2.95        45833M         355

复制

多次传入相同的时候可以看到对于ceph内部来说还是会产生对象的,只是这个在vdo的文件系统来看是不占用物理空间的

对镜像做下copy

  1. [root@lab101 ~]# rbd cp testvdorbd testvdorbdclone

复制
  1. [root@lab101 ~]#rbd map  testvdorbdclone

复制
  1. [root@lab101 ~]# cat /etc/vdoconf.yml |grep device

  2.      device: /dev/rbd/rbd/testvdorbdclone

复制

修改配置文件为对应的设备,就可以启动了,这个操作说明vdo设备是不绑定硬件的,只需要有相关的配置文件,即可对文件系统进行启动

那么这个在一个数据转移用途下,就可以利用vdo对数据进行重删压缩,然后把整个img转移到远端去,这个也符合现在的私有云和公有云之间的数据传输量的问题,会节省不少空间

vdo作为ceph的osd

ceph对设备的属性有要求,这里直接采用目录部署的方式

  1. [root@lab101 ceph]# vdo create --name sdb1 --device=/dev/sdb1

  2. [root@lab101 ceph]# vdo create --name sdb2 --device=/dev/sdb2

  3. [root@lab101 ceph]# mkfs.xfs -K -f /dev/mapper/sdb1

  4. [root@lab101 ceph]# mkfs.xfs -K -f /dev/mapper/sdb2

  5. [root@lab101 ceph]# mkdir /osd1

  6. [root@lab101 ceph]# mkdir /osd2

  7. [root@lab101 ceph]# mount /dev/mapper/sdb1 /osd1/

  8. [root@lab101 ceph]# mount /dev/mapper/sdb2 /osd2/

  9. [root@lab101 ceph]# chown ceph:ceph /osd1

  10. [root@lab101 ceph]# chown ceph:ceph /osd2

  11. [root@lab101 ceph]# ceph-deploy osd prepare lab101:/osd1/

  12. [root@lab101 ceph]# ceph-deploy osd prepare lab101:/osd2/

  13. [root@lab101 ceph]# ceph-deploy osd activate lab101:/osd1/

  14. [root@lab101 ceph]# ceph-deploy osd activate lab101:/osd2/

复制

写入测试数据

  1. [root@lab101 ceph]# rados  -p rbd bench 60 write --no-cleanup

复制
  1. [root@lab101 ceph]# df -h

  2. Filesystem        Size  Used Avail Use% Mounted on

  3. /dev/sda2          56G  2.0G   54G   4% /

  4. devtmpfs          983M     0  983M   0% /dev

  5. tmpfs             992M     0  992M   0% /dev/shm

  6. tmpfs             992M  8.8M  983M   1% /run

  7. tmpfs             992M     0  992M   0% /sys/fs/cgroup

  8. /dev/sda1        1014M  151M  864M  15% /boot

  9. tmpfs             199M     0  199M   0% /run/user/0

  10. /dev/mapper/sdb1   22G  6.5G   16G  30% /osd1

  11. /dev/mapper/sdb2   22G  6.5G   16G  30% /osd2

  12. [root@lab101 ceph]# vdostats --human-readable

  13. Device                    Size      Used Available Use% Space saving%

  14. /dev/mapper/sdb2         25.0G      3.0G     22.0G  12%           99%

  15. /dev/mapper/sdb1         25.0G      3.0G     22.0G  12%           99%

复制

可以看到虽然在df看到了空间的占用,实际上因为rados bench写入的是填充的空洞数据,vdo作为osd对数据直接进行了重删了,测试可以看到vdo是可以作为ceph osd的,由于我的测试环境是在vmware虚拟机里面的,所以并不能做性能测试,有硬件环境的情况下可以对比下开启vdo和不开启的情况的性能区别

参考文档

vdo-qs-creating-a-volumeDetermining the space savings of virtual data optimizer (VDO) in RHEL 7.5 Beta

总结

本篇从配置和部署以及适配方面对vdo进行一次比较完整的实践,从目前的测试情况来看,配置简单,对环境友好,基本是可以作为一个驱动层嵌入到任何块设备之上的,未来应该有广泛的用途,目前还不清楚红帽是否会把这个属性放到centos下面去,目前可以通过在https://access.redhat.com/downloads/ 申请测试版本的ISO进行功能的测试

应该是农历年前的最后一篇文章了,祝新春快乐!


文章转载自磨磨谈,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论