一、什么是VDO
VDO(Virtual Data Optimize)是RHEL8/Centos8上新推出的一个存储相关技术(最早在7.5测试版中开始测试),是Redhat收购的Permabit公司的技术。
VDO的主要作用是节省磁盘空间,比如让1T的磁盘能装下1.5T的数据,从而降低数据中心的成本。
那vdo是如何实现的呢,关键原理主要是重删和压缩,重删就是硬盘里拷贝来相同的数据,以前要占多份空间,现在只需要1份空间就可以了。类似我们在百度网盘中上传一个大型软件安装包,能实现秒传,其实是之前就有,所以无需再传一遍,也无需再占百度一份空间。另一方面是数据压缩,类似于压缩软件的算法,也可以更加节省磁盘空间。
对于管理的是vm或容器时,建议精简逻辑存储与物理存储比例设置为10:1,就是如果你利用的是1TB的物理磁盘,你可以假装它是10TB的逻辑存储。对于对象存储,比如Ceph,建议使用3:1的逻辑存储,1TB物理存储可以当3TB逻辑存储。
二、配置步骤
centos7.3
添加额外磁盘sdb 10G
# yum install vdo kmod-kvdo # vdo create --name=vdo0 --device=/dev/sdb --vdoLogicalSize=30G
--vdoLogicalSize=30G:用VDO卷应提供的逻辑存储量替换逻辑大小。这个值可以自己设置。对于主动VM或容器存放,使用逻辑大小是10的块设备的物理尺寸倍。例如,如果我们的块设备大小为10GB,请在30GB此处使用
# mkfs.ext4 -K /dev/mapper/vdo0
-K选项可防止立即丢弃文件系统中未使用的块,从而使命令返回更快。类似windows格式中的快速格式化,否则会花很多时间
# mkdir /vdo # mount /dev/mapper/vdo0 /vdo # lsblk --output=UUID /dev/mapper/vdo0 #查看/dev/mapper/vdo0设备的UUID # vim /etc/fstab UUID=XXXXXX /vdo ext4 defaults,x-systemd.requires=vdo.service 0 0 # vdostats --human-readable #检查存储统计信息

三、测试
上传一个3.1G文件分别放到/vdo和/vdo/test中,看看储存情况

可以看到的是,存储两个一样的文件。VDO卷的逻辑存储量会用去6.2g。但是实际物理空间只使用了3G(3.1G)。这样大大提高了储存空间的利用率。
另外,在网上看到有的教程在创建vdo的时候没有添加--vdoLogicalSize参数。这样做创建过程不会报错。但是创建的vdo卷就起不到原有作用。接下来试试不添加--vdoLogicalSize参数看看
删除原来vdo0
# umount /vdo # vdo remove --name=vdo0
重新创建并挂载
# vdo create --name=vdo0 --device=/dev/sdb # mkfs.ext4 -K /dev/mapper/vdo0 # mount /dev/mapper/vdo0 /vdo # vdostats --human-readable
那么我们来试试能储存多大的文件。将一个3.5G的镜像,上传到/vdo和/vdo/test中


可以看到他只能储存5.8G的文件。并没有起到应有的作用
通过上面实验我们可以知道,VDO卷能储存的数据大小和其实际物理大小以及设置的逻辑大小有关。假如逻辑大小设置过小,逻辑大小存满之后,即使实际物理空间没有使用完,VDO也不能在存储文件了。反过来,实际物理大小使用完之后,逻辑大小没满,VDO卷也不能在存储文件了。
所以在使用VDO卷的系统中,如果要做磁盘空间监控。不仅要监控VDO卷的逻辑储存量剩余大小,还要监控实际物理空间的剩余大小。
四、VDO卷扩容
通过上面的结论我们可以知道,假如写入的文件重复率很高,那么对于VDO卷很可能会出现逻辑空间用完,物理空间实际还有剩余的情况,这时候我们可以对VDO卷进行扩容
# umount /vdo # vdo growLogical --name=vdo0 --vdoLogicalSize=400G #扩容VDO卷 # resize2fs /dev/mapper/vdo0 #文件系统扩容 # mount /dev/mapper/vdo0 /vdo # df -h
五、在LVM的基础上创建VDO卷
VDO可以在LV的基础上创建。
# fdisk /dev/sdb 这一步提前将/dev/sdb分成两个5G的分区 ,过程略 # pvcreate /dev/sdb1 # pvcreate /dev/sdb2 # vgcreate vdovg /dev/sdb1 # lvcreate -l 100%VG -n vdolv /dev/vdovg # vdo create --name=vdo0 --device=/dev/vdovg/vdolv --vdoLogicalSize=20G # mkfs.ext4 /dev/mapper/vdo0 # mount /dev/mapper/vdo0 /vdo
对VDO实际物理空间扩容
# umount /vdo # vgextend vdovg /dev/sdb2 # lvextend -l +100%FREE /dev/vdovg/vdolv # vdo growPhysical --name=vdo0 #物理空间扩容 # vdo growLogical --name=vdo0 --vdoLogicalSize=40G #逻辑空间扩容 # resize2fs /dev/mapper/vdo0 #文件系统扩容 # mount /dev/mapper/vdo0 /vdo