前言

关于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

[root@lab101 ~]# lsb_release -a
LSB Version: :core-4.1-amd64:core-4.1-noarch
Distributor ID: CentOS
Description: CentOS Linux release 7.4.1708 (Core)
Release: 7.4.1708
Codename: Core

内核版本如下

[root@lab101 ~]# uname -a
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
[root@lab101 ~]# rpm -qa|grep kernel
kernel-tools-libs-3.10.0-693.el7.x86_64
abrt-addon-kerneloops-2.1.11-48.el7.centos.x86_64
kernel-3.10.0-693.el7.x86_64

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

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

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

[root@lab101 ~]# rpm -ivh kernel-3.10.0-693.17.1.el7.x86_64.rpm
Preparing... ################################# [100%]
Updating / installing...
1:kernel-3.10.0-693.17.1.el7 ################################# [100%]
[root@lab101 ~]# grub2-set-default 'CentOS Linux (3.10.0-693.17.1.el7.x86_64) 7 (Core)'

重启服务器

安装

[root@lab101 ~]# rpm -ivh kmod-kvdo-6.1.0.98-11.el7.centos.x86_64.rpm
Preparing... ################################# [100%]
Updating / installing...
1:kmod-kvdo-6.1.0.98-11.el7.centos ################################# [100%]
[root@lab101 ~]# yum install PyYAML
[root@lab101 ~]# rpm -ivh vdo-6.1.0.98-13.x86_64.rpm
Preparing... ################################# [100%]
Updating / installing...
1:vdo-6.1.0.98-13 ################################# [100%]

到这里安装就完成了

配置VDO

创建一个vdo卷

[root@lab101 ~]# vdo create --name=my_vdo  --device=/dev/sdb1   --vdoLogicalSize=80G --writePolicy=sync
Creating VDO my_vdo
Starting VDO my_vdo
Starting compression on VDO my_vdo
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

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

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

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

修改缓存模式的命令

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

格式化硬盘

[root@lab101 ~]# mkfs.xfs -K /dev/mapper/my_vdo
meta-data=/dev/mapper/my_vdo isize=512 agcount=4, agsize=5242880 blks
= sectsz=4096 attr=2, projid32bit=1
= crc=1 finobt=0, sparse=0
data = bsize=4096 blocks=20971520, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal log bsize=4096 blocks=10240, version=2
= sectsz=4096 sunit=1 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0

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

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

挂载设备

[root@lab101 ~]# mount -o discard /dev/mapper/my_vdo /myvod/
[root@lab101 ~]# vdostats --human-readable
Device Size Used Available Use% Space saving%
/dev/mapper/my_vdo 50.0G 4.0G 46.0G 8% 99%

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

检查重删和压缩是否开启

[root@lab101 ~]# vdo status -n my_vdo|grep Deduplication
Deduplication: enabled
[root@lab101 ~]# vdo status -n my_vdo|grep Compress
Compression: enabled

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

vdo enableCompression -n <vdo_vol_name>
vdo enableDeduplication -n <vdo_vol_name>

验证重删功能

[root@lab101 ~]# df -h|grep vdo
/dev/mapper/my_vdo 80G 33M 80G 1% /myvod
[root@lab101 ~]# vdostats --hu
Device Size Used Available Use% Space saving%
/dev/mapper/my_vdo 50.0G 4.0G 46.0G 8% 99%

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

[root@lab101 ~]# df -h|grep vdo
/dev/mapper/my_vdo 80G 455M 80G 1% /myvod
[root@lab101 ~]# vdostats --hu
Device Size Used Available Use% Space saving%
/dev/mapper/my_vdo 50.0G 4.4G 45.6G 8% 9%

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

[root@lab101 ~]# df -h|grep vdo
/dev/mapper/my_vdo 80G 1.7G 79G 3% /myvod
[root@lab101 ~]# vdostats --hu
Device Size Used Available Use% Space saving%
/dev/mapper/my_vdo 50.0G 4.4G 45.6G 8% 73%

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

验证压缩功能

测试数据来源 silesia的资料库

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

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

Filename 描述 类型 原始空间(KB) 实际占用空间(KB)
dickens 狄更斯文集 英文原文 9953 9948
mozilla Mozilla的1.0可执行文件 执行程序 50020 33228
mr 医用resonanse图像 图片 9736 9272
nci 结构化的化学数据库 数据库 32767 10168
ooffice Open Office.org 1.01 DLL 可执行程序 6008 5640
osdb 基准测试用的MySQL格式示例数据库 数据库 9849 9824
reymont 瓦迪斯瓦夫·雷蒙特的书 PDF 6471 6312
samba samba源代码 src源码 21100 11768
sao 星空数据 天文格式的bin文件 7081 7036
webster 辞海 HTML 40487 40144
xml XML文件 HTML 5220 2180
x-ray 透视医学图片 医院数据 8275 8260

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

停止vdo操作

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

启动vdo操作

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

删除vdo操作

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

VDO和CEPH能产生什么火花?

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

作为rbd的上层

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

创建rbd的vdo

[root@lab101 ceph]# vdo create --name=rbd_vdo  --device=/dev/rbd/rbd/testvdorbd
Creating VDO rbd_vdo
vdo: ERROR - Device /dev/rbd/rbd/testvdorbd not found (or ignored by filtering).

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

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

在/etc/lvm/lvm.conf的修改如下

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

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

[root@lab101 ceph]# vdo create --name=rbd_vdo  --device=/dev/rbd/rbd/testvdorbd
Creating VDO rbd_vdo
Starting VDO rbd_vdo
Starting compression on VDO rbd_vdo
VDO instance 2 volume is ready at /dev/mapper/rbd_vdo

挂载

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

查看容量

[root@lab101 mnt]# vdostats --human-readable
Device Size Used Available Use% Space saving%
/dev/mapper/rbd_vdo 20.0G 4.4G 15.6G 22% 3%
[root@lab101 mnt]# ceph df
GLOBAL:
SIZE AVAIL bash USED %bash USED
57316M 49409M 7906M 13.79
POOLS:
NAME ID USED %USED MAX AVAIL OBJECTS
rbd 0 566M 1.20 46543M 148
[root@lab101 mnt]# ceph df
GLOBAL:
SIZE AVAIL bash USED %bash USED
57316M 48699M 8616M 15.03
POOLS:
NAME ID USED %USED MAX AVAIL OBJECTS
rbd 0 1393M 2.95 45833M 355

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

对镜像做下copy

[root@lab101 ~]# rbd cp testvdorbd testvdorbdclone
[root@lab101 ~]#rbd map  testvdorbdclone
[root@lab101 ~]# cat /etc/vdoconf.yml |grep device
device: /dev/rbd/rbd/testvdorbdclone

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

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

vdo作为ceph的osd

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

[root@lab101 ceph]# vdo create --name sdb1 --device=/dev/sdb1
[root@lab101 ceph]# vdo create --name sdb2 --device=/dev/sdb2
[root@lab101 ceph]# mkfs.xfs -K -f /dev/mapper/sdb1
[root@lab101 ceph]# mkfs.xfs -K -f /dev/mapper/sdb2
[root@lab101 ceph]# mkdir /osd1
[root@lab101 ceph]# mkdir /osd2
[root@lab101 ceph]# mount /dev/mapper/sdb1 /osd1/
[root@lab101 ceph]# mount /dev/mapper/sdb2 /osd2/
[root@lab101 ceph]# chown ceph:ceph /osd1
[root@lab101 ceph]# chown ceph:ceph /osd2
[root@lab101 ceph]# ceph-deploy osd prepare lab101:/osd1/
[root@lab101 ceph]# ceph-deploy osd prepare lab101:/osd2/
[root@lab101 ceph]# ceph-deploy osd activate lab101:/osd1/
[root@lab101 ceph]# ceph-deploy osd activate lab101:/osd2/

写入测试数据

[root@lab101 ceph]# rados  -p rbd bench 60 write --no-cleanup
[root@lab101 ceph]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda2 56G 2.0G 54G 4% /
devtmpfs 983M 0 983M 0% /dev
tmpfs 992M 0 992M 0% /dev/shm
tmpfs 992M 8.8M 983M 1% /run
tmpfs 992M 0 992M 0% /sys/fs/cgroup
/dev/sda1 1014M 151M 864M 15% /boot
tmpfs 199M 0 199M 0% /run/user/0
/dev/mapper/sdb1 22G 6.5G 16G 30% /osd1
/dev/mapper/sdb2 22G 6.5G 16G 30% /osd2
[root@lab101 ceph]# vdostats --human-readable
Device Size Used Available Use% Space saving%
/dev/mapper/sdb2 25.0G 3.0G 22.0G 12% 99%
/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-volume

Determining the space savings of virtual data optimizer (VDO) in RHEL 7.5 Beta

总结

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

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

变更记录

Why Who When
创建 武汉-运维-磨渣 2018-02-10

REDHAT 7.5beta 新推出的VDO功能的更多相关文章

  1. Google 新推出Background sync API

    Background sync是Google新推出的Web API,可延迟用户行为,直到用户网络连接稳定.这样有助于保证用户想要发送的数据就是实际发送的数据. 目前存在的问题 网络是消磨用户时间最多的 ...

  2. 【转】如何评价 Apple 新推出的编程语言 Swift?

    如何评价 Apple 新推出的编程语言 Swift? 原文地址:http://www.zhihu.com/question/24002984 评价:如果你会Objective-C,你不需要去看它.   ...

  3. redhat 6.4 安装VirtualBox自动增强功能功:unable to find the sources of your current Linux kernel

    redhat 6.4 安装VirtualBox自动增强功能功能的时候提示: building the main Guest Additions module FAILED unable to find ...

  4. Android零基础入门第32节:新推出的GridLayout网格布局

    原文:Android零基础入门第32节:新推出的GridLayout网格布局 本期主要学习的是网格布局是Android 4.0新增的布局,和前面所学的TableLayout表格布局 有点类似,不过他有 ...

  5. [译][ABP vNext]ABP CLI,v0.18版本的新模板和其他功能

    ABP CLI,v0.18版本的新模板和其他功能 ABP v0.18已发布, 包含解决的70+个issue,500+次提交 网站更改 abp.io网站完全更新以突出ABP框架的目标和重要功能.文档和博 ...

  6. PHP 5.6正式发布:新特性、及功能改进介绍

    经过了长时间的开发测试,新版本PHP程序(PHP5.6正式版)终于发布了.新版本中加入了一些实用的新特性,也摒弃了一些冗余的功能.同时,也对部分原有功能进行了改进.下面就一起看看PHP 5.6正式版到 ...

  7. FreeSql 新的八大骚功能,.NETCore 你必须晓得的 ORM

    前言 FreeSql 目前版本号 0.5.5,预计明年元旦发布 1.0.0,切莫小看了版本号,目前单元测试方法1350+,并且每个方法内的涵盖面又比较广(不信的话见下图),每一次版本发布都作了较多的测 ...

  8. newbee-mall 开源商城新计划:秒杀功能、优惠券、对接支付宝

    新项目是 newbee-mall 的升级版本,暂时就叫它 newbee-mall-plus 吧,第一阶段会开发秒杀功能.优惠券.对接支付宝这些功能,也会慢慢加入 Redis. Elastic Sear ...

  9. 详解 Java 17 中新推出的密封类

    Java 17推出的新特性Sealed Classes经历了2个Preview版本(JDK 15中的JEP 360.JDK 16中的JEP 397),最终定稿于JDK 17中的JEP 409.Seal ...

随机推荐

  1. Tensorflow学习笔记No.7

    tf.data与自定义训练综合实例 使用tf.data自定义猫狗数据集,并使用自定义训练实现猫狗数据集的分类. 1.使用tf.data创建自定义数据集 我们使用kaggle上的猫狗数据以及tf.dat ...

  2. 置Hugo的代码高亮

    +++ date="2020-10-17" title="设置Hugo的代码高亮" tags=["hugo"] categories=[&q ...

  3. ansible使用playbook的简单例子(ansible2.9.7)

    一,ansible使用playbook的优点 1,用ansible执行一些简单的任务,使用ad-hoc命令就可以解决问题 如果执行复杂的功能,需要大量的操作,执行的ad-hoc命令会不够方便,这时我们 ...

  4. Seaborn系列 | 散点图scatterplot()

    散点图 解读 可以通过调整颜色.大小和样式等参数来显示数据之间的关系. 函数原型 seaborn.scatterplot(x=None, y=None, hue=None, style=None, s ...

  5. C#8.0之后接口已经不再单纯了,我懵逼了!

    一:背景 1. 讲故事 大家在经过面向对象洗礼的时候,都了解过接口,而且知道它是一种自上而下的设计思路,举个例子,我们电脑上都有 USB 2.0 接口,蓝牙耳机实现了它可以进行充电,移动硬盘实现了它可 ...

  6. Python ( 学习基础篇 第二部 )

    目录 运算符 算数运算符 比较运算符 赋值运算符 位运算符 逻辑运算符 成员运算符 身份运算符 Python 中运算符的优先级 运算符总结基础语法 判断类型 isinstence 代码块 流程控制 w ...

  7. router-link 使用精确匹配

    本来不想写router 规则匹配的问题,有一个笨球问,顺带写一下, 先配置一下路由 export default new Router({ routes: [ { path: '/', name: ' ...

  8. iOS 14 egret 游戏卡顿问题分析和部分解决办法

    现象 总体而言,iOS 14 渲染性能变差,可以从以下三个测试看出. 测试1:简单demo,使用egret引擎显示3000个图(都是同一个100*100 png 纹理),逐帧做旋转.(博客园视频播放可 ...

  9. java POI Excel 单元格样式

    正如Html需要CSS一样,我们的POI生成的Excel同样需要样式才能更完美的表现我们的数据.下面还是从简单的例子出发,学习和了解POI的样式设计. 一.我的位置. 1 package com.my ...

  10. LuoguP3602 Koishi Loves Segments

    题面 n个区间和数轴上的m个关键点 (0<=n,m<=4*1e5,数轴范围 \(-1^7\) ~ \(1^7\))每个关键点有被区间区间覆盖的次数上限,求最多能放多少个区间到数轴上 传送门 ...