虛擬數(shù)據(jù)優(yōu)化器(VDO)是一種塊虛擬化技術(shù)诗力,可提供透明的數(shù)據(jù)重復(fù)刪除功能。通過(guò)消除冗余的數(shù)據(jù)塊,VDO可以大大減少實(shí)際使用的磁盤(pán)容量患蹂。
VDO由兩個(gè)內(nèi)核模塊和兩個(gè)命令組成:
由下面兩個(gè)內(nèi)核模塊組成:
kvdo - 該模塊加載到設(shè)備管理器層夭禽,提供用于重復(fù)數(shù)據(jù)刪除的塊存儲(chǔ)卷霞掺。
uds - 該模塊負(fù)責(zé)與VDO磁盤(pán)上的通用的重復(fù)數(shù)據(jù)刪除索引進(jìn)行通信。
包括兩個(gè)命令行工具:
vdo - 用于創(chuàng)建讹躯,刪除菩彬,啟動(dòng)和停止VDO卷,以及執(zhí)行其他配置操作潮梯。
vdostats - 用于報(bào)告VDO卷的各個(gè)方面骗灶,包括有效的減少和物理卷的利用率。
系統(tǒng)環(huán)境
安裝VDO
下面命令安裝vdo和相關(guān)依賴秉馏,安裝完成之后重啟系統(tǒng):
[root@localhost ~]# yum -y install vdo
[root@localhost ~]# reboot
創(chuàng)建一個(gè)VDO設(shè)備
確保有一個(gè)空余磁盤(pán)或分區(qū)可供VDO使用耙旦。盡管可以在LVM邏輯卷上面創(chuàng)建VDO卷,但是重新引導(dǎo)系統(tǒng)時(shí)會(huì)出現(xiàn)引導(dǎo)順序問(wèn)題萝究。所以再裸盤(pán)上面創(chuàng)建vdo卷之后在它之上創(chuàng)建LVM邏輯卷免都。
下面使用一塊20GB的磁盤(pán)锉罐,/dev/sda做vdo卷
下面創(chuàng)建vdo卷:
[root@localhost ~]# vdo create --name=vdolvm --device /dev/sda --vdoLogicalSize 60G --writePolicy async
Creating VDO vdolvm
? ? ? The VDO volume can address 16 GB in 8 data slabs, each 2 GB.
? ? ? It can grow to address at most 16 TB of physical storage in 8192 slabs.
? ? ? If a larger maximum size might be needed, use bigger slabs.
Starting VDO vdolvm
Starting compression on VDO vdolvm
VDO instance 0 volume is ready at /dev/mapper/vdolvm
下面分解一下命令,看看所使用的選項(xiàng):
--device - 指定在哪個(gè)硬盤(pán)上創(chuàng)建vdo卷
--vdoLogicalSize - 這里我們指定了容量大小為60G绕娘,比我們實(shí)際磁盤(pán)20G大了許多脓规。假設(shè)我們將從重復(fù)數(shù)據(jù)刪除中至少得到3:1的減少,對(duì)于大多數(shù)的數(shù)據(jù)险领,這是相當(dāng)保守的抖拦,但如果你的數(shù)據(jù)沒(méi)有很多重復(fù)的,那么比率應(yīng)該是不同的舷暮。日志文件和其他純文本文件通程铮可以很好地進(jìn)行重復(fù)數(shù)據(jù)刪除,可能會(huì)得到10:1甚至更高的重復(fù)數(shù)據(jù)刪除率下面。但是二進(jìn)制文件复颈,如視頻、音頻或壓縮包沥割,將遠(yuǎn)遠(yuǎn)低于3:1耗啦,甚至在某些情況下1:1。這種情況下不建議使用vdo卷机杜。
--writePolicy - vdo有三種寫(xiě)策略:sync:只有在數(shù)據(jù)寫(xiě)入物理設(shè)備后帜讲,才會(huì)確認(rèn)對(duì)VDO卷的寫(xiě)入。async:在數(shù)據(jù)寫(xiě)入緩存后被確認(rèn)椒拗。如果在設(shè)備故障或掉電之前沒(méi)有刷新緩存纺棺,可能會(huì)導(dǎo)致數(shù)據(jù)丟失兵琳。auto:在這種默認(rèn)模式下宾舅,VDO將檢查存儲(chǔ)設(shè)備并確定它是否支持刷新糊识。如果是這樣,VDO將使用異步模式堵未。如果沒(méi)有腋舌,它將使用同步模式。
查看新建VDO卷相關(guān)的信息
正如我們?cè)谏弦徊降妮敵鲋锌吹降纳罚琕DO創(chuàng)建了一個(gè)名為/dev/mapper/vdolvm的新dm設(shè)備块饺。當(dāng)我們創(chuàng)建lvm卷組時(shí),這就是我們將要使用的設(shè)備雌芽。
[root@localhost ~]# ll /dev/mapper/vdolvm
lrwxrwxrwx 1 root root 7 Mar? 4 13:31 /dev/mapper/vdolvm -> ../dm-2
讓我們看看使用vdostats可以獲得有關(guān)vdo卷的什么樣的信息:
[root@localhost ~]# vdostats --hu
Device? ? ? ? ? ? ? ? ? ? Size? ? ? Used Available Use% Space saving%
/dev/mapper/vdolvm? ? ? 20.0G? ? ? 4.0G? ? 16.0G? 20%? ? ? ? ? N/A
由于我們尚未將任何數(shù)據(jù)寫(xiě)入該卷授艰,因此Space saving%字段為N/A。稍后我們將寫(xiě)一些數(shù)據(jù)時(shí)膘怕,在此處看到更多有用的信息想诅。
可以看到上圖中,我們還沒(méi)有寫(xiě)任何數(shù)據(jù)岛心,但是已經(jīng)有4GB来破,20%的空間正在使用中了!這是因?yàn)椤巴ㄓ弥貜?fù)數(shù)據(jù)刪除索引”已被寫(xiě)入磁盤(pán)忘古。這基本上是一個(gè)數(shù)據(jù)庫(kù)徘禁,用于記錄slab指紋及其位置。這就是使重復(fù)數(shù)據(jù)刪除成為可能的原因髓堪。
將VDO卷作為普通磁盤(pán)設(shè)備進(jìn)行設(shè)置
現(xiàn)在我們已經(jīng)創(chuàng)建了VDO設(shè)備送朱,我們可以對(duì)其進(jìn)行分區(qū)并格式化,或者在這個(gè)vod卷上面創(chuàng)建lvm邏輯卷干旁。下面我們創(chuàng)建邏輯卷:
# 創(chuàng)建物理卷
[root@localhost ~]# pvcreate /dev/mapper/vdolvm
? Physical volume "/dev/mapper/vdolvm" successfully created.
# 創(chuàng)建卷組vdo_vg
[root@localhost ~]# vgcreate vdo_vg /dev/mapper/vdolvm
? Volume group "vdo_vg" successfully created
# 查看vdo_vg卷組的信息
[root@localhost ~]# vgdisplay vdo_vg
? --- Volume group ---
? VG Name? ? ? ? ? ? ? vdo_vg
? System ID? ? ? ? ? ?
? Format? ? ? ? ? ? ? ? lvm2
? Metadata Areas? ? ? ? 1
? Metadata Sequence No? 1
? VG Access? ? ? ? ? ? read/write
? VG Status? ? ? ? ? ? resizable
? MAX LV? ? ? ? ? ? ? ? 0
? Cur LV? ? ? ? ? ? ? ? 0
? Open LV? ? ? ? ? ? ? 0
? Max PV? ? ? ? ? ? ? ? 0
? Cur PV? ? ? ? ? ? ? ? 1
? Act PV? ? ? ? ? ? ? ? 1
? VG Size? ? ? ? ? ? ? <60.00 GiB
? PE Size? ? ? ? ? ? ? 4.00 MiB
? Total PE? ? ? ? ? ? ? 15359
? Alloc PE / Size? ? ? 0 / 0?
? Free? PE / Size? ? ? 15359 / <60.00 GiB
? VG UUID? ? ? ? ? ? ? qfPiH6-eMCU-Z6kr-eeCu-jd0J-8lmf-49daZX
從上面可以看到驶沼,lvm認(rèn)為我們的基礎(chǔ)磁盤(pán)為120GB,盡管我們知道它只有40GB争群。由于LVM不知道VDO后端磁盤(pán)的大小回怜。
現(xiàn)在,讓我們創(chuàng)建幾個(gè)邏輯卷吧:
[root@localhost ~]# lvcreate -n vdo_lv01 -L 15G vdo_vg
[root@localhost ~]# lvcreate -L 15G -n vdo_lv02 vdo_vg
[root@localhost ~]# lvcreate -L 15G -n vdo_lv03 vdo_vg
# 查看創(chuàng)建好的邏輯卷
[root@localhost ~]# lvs -o +devices
創(chuàng)建掛載點(diǎn)并掛載文件系統(tǒng)
通常换薄,創(chuàng)建文件系統(tǒng)后玉雾,它將在設(shè)備上運(yùn)行Trim操作。使用VDO時(shí)轻要,這不是理想的選擇复旬,因?yàn)榇疟P(pán)容量是按需分配的。因此冲泥,我們要告訴mkfs在文件系統(tǒng)創(chuàng)建過(guò)程中不要丟棄塊驹碍。對(duì)于XFS,請(qǐng)使用-K選項(xiàng)凡恍。對(duì)于EXT4幸冻,請(qǐng)使用-E nodiscard。下面使用了一個(gè)for循環(huán)咳焚,將三個(gè)邏輯卷格式化為XFS文件系統(tǒng):
[root@localhost ~]# for i in `seq 1 3`; do mkfs.xfs -K /dev/vdo_vg/vdo_lv0$i ; done
meta-data=/dev/vdo_vg/vdo_lv01? isize=512? ? agcount=4, agsize=983040 blks
? ? ? ? =? ? ? ? ? ? ? ? ? ? ? sectsz=4096? attr=2, projid32bit=1
? ? ? ? =? ? ? ? ? ? ? ? ? ? ? crc=1? ? ? ? finobt=1, sparse=1, rmapbt=0
? ? ? ? =? ? ? ? ? ? ? ? ? ? ? reflink=1
data? ? =? ? ? ? ? ? ? ? ? ? ? bsize=4096? blocks=3932160, imaxpct=25
? ? ? ? =? ? ? ? ? ? ? ? ? ? ? sunit=0? ? ? swidth=0 blks
naming? =version 2? ? ? ? ? ? ? bsize=4096? ascii-ci=0, ftype=1
log? ? ? =internal log? ? ? ? ? bsize=4096? blocks=2560, version=2
? ? ? ? =? ? ? ? ? ? ? ? ? ? ? sectsz=4096? sunit=1 blks, lazy-count=1
realtime =none? ? ? ? ? ? ? ? ? extsz=4096? blocks=0, rtextents=0
meta-data=/dev/vdo_vg/vdo_lv02? isize=512? ? agcount=4, agsize=983040 blks
? ? ? ? =? ? ? ? ? ? ? ? ? ? ? sectsz=4096? attr=2, projid32bit=1
? ? ? ? =? ? ? ? ? ? ? ? ? ? ? crc=1? ? ? ? finobt=1, sparse=1, rmapbt=0
? ? ? ? =? ? ? ? ? ? ? ? ? ? ? reflink=1
data? ? =? ? ? ? ? ? ? ? ? ? ? bsize=4096? blocks=3932160, imaxpct=25
? ? ? ? =? ? ? ? ? ? ? ? ? ? ? sunit=0? ? ? swidth=0 blks
naming? =version 2? ? ? ? ? ? ? bsize=4096? ascii-ci=0, ftype=1
log? ? ? =internal log? ? ? ? ? bsize=4096? blocks=2560, version=2
? ? ? ? =? ? ? ? ? ? ? ? ? ? ? sectsz=4096? sunit=1 blks, lazy-count=1
realtime =none? ? ? ? ? ? ? ? ? extsz=4096? blocks=0, rtextents=0
meta-data=/dev/vdo_vg/vdo_lv03? isize=512? ? agcount=4, agsize=983040 blks
? ? ? ? =? ? ? ? ? ? ? ? ? ? ? sectsz=4096? attr=2, projid32bit=1
? ? ? ? =? ? ? ? ? ? ? ? ? ? ? crc=1? ? ? ? finobt=1, sparse=1, rmapbt=0
? ? ? ? =? ? ? ? ? ? ? ? ? ? ? reflink=1
data? ? =? ? ? ? ? ? ? ? ? ? ? bsize=4096? blocks=3932160, imaxpct=25
? ? ? ? =? ? ? ? ? ? ? ? ? ? ? sunit=0? ? ? swidth=0 blks
naming? =version 2? ? ? ? ? ? ? bsize=4096? ascii-ci=0, ftype=1
log? ? ? =internal log? ? ? ? ? bsize=4096? blocks=2560, version=2
? ? ? ? =? ? ? ? ? ? ? ? ? ? ? sectsz=4096? sunit=1 blks, lazy-count=1
realtime =none? ? ? ? ? ? ? ? ? extsz=4096? blocks=0, rtextents=0
當(dāng)我們將新文件系統(tǒng)掛載到掛載點(diǎn)時(shí)洽损,我們要告訴XFS放棄塊,因?yàn)檫@將大大加快文件刪除的速度革半。
[root@localhost ~]# mkdir -p /data/{01..03}
[root@localhost ~]# for i in `seq 1 3`; do mount -o discard /dev/vdo_vg/vdo_lv0$i /data/0$i; done
現(xiàn)在碑定,我們向設(shè)備寫(xiě)入了少量數(shù)據(jù),我們可以再次檢查VDO卷以查看情況是否已更改又官。
[root@localhost ~]# vdostats --hu
Device? ? ? ? ? ? ? ? ? ? Size? ? ? Used Available Use% Space saving%
/dev/mapper/vdolvm? ? ? 20.0G? ? ? 4.0G? ? 16.0G? 20%? ? ? ? ? 86%
設(shè)置為開(kāi)機(jī)啟動(dòng)
下面將三個(gè)邏輯卷設(shè)置為開(kāi)機(jī)啟動(dòng)延刘,需要在fstab文件中添加x-systemd.device-timeout=0和x-systemd.requires=vdo.service。
使用blkid查看這三個(gè)邏輯卷的UUID六敬。
使用上面獲取到的UUID碘赖,添加在/etc/fstab文件中:
[root@localhost systemd]# vim /etc/fstab
UUID="bd2c1c61-4656-4065-b5a0-3ca53ef0f949" /data/01? xfs? defaults,x-systemd.device-timeout=0,x-systemd.requires=vdo.service 0 0
UUID="1e53579b-f1da-4f77-80e6-d61a40515525" /data/02? xfs? defaults,x-systemd.device-timeout=0,x-systemd.requires=vdo.service 0 0
UUID="d41bf7e2-bf75-4db7-b323-a923375f6a6e" /data/03? xfs? defaults,x-systemd.device-timeout=0,x-systemd.requires=vdo.service 0 0
總結(jié)
虛擬數(shù)據(jù)優(yōu)化器(VDO)是一種塊虛擬化技術(shù),可提供透明的數(shù)據(jù)重復(fù)刪除功能。通過(guò)消除冗余的數(shù)據(jù)塊普泡,VDO可以大大減少實(shí)際使用的磁盤(pán)容量播掷。