最近自己个人的存储又告急了,又不想采购新硬盘。说实话,现在SSD的价格虽然比前几年便宜了不少,但是采购成本还是让我我心疼。正好前段时间在复习学习笔记,发现了VDO这个好东西,用了之后发现真的能省不少钱

今天就跟大家聊聊VDO到底是什么,怎么用,以及我在实际使用中踩过的一些坑。

VDO是个啥玩意?

VDO全称是Virtual Data Optimizer,翻译过来就是虚拟数据优化器。听起来很高大上,其实说白了就是一个数据压缩和去重的技术。Red Hat在RHEL 7.5版本开始集成了这个功能,现在在RHEL 8和9里面都有。

我第一次听说VDO的时候,心里想的是"又是一个噱头技术吧",毕竟市面上各种存储优化的方案太多了。但是真正用起来之后,发现效果确实不错。

VDO主要做两件事:

  • 数据去重(Deduplication):把重复的数据块只存储一份
  • 数据压缩(Compression):用LZ4算法压缩数据

这两个功能结合起来,理论上可以节省很多存储空间。当然,实际效果要看你的数据类型。

工作原理简单说说

VDO的架构其实不复杂,它在文件系统和物理存储之间加了一层。当应用程序写数据的时候,VDO会先检查这个数据块是不是已经存在了,如果存在就只记录一个引用,不存在的话就压缩后再存储。

我画个简单的图来说明:

应用程序 -> 文件系统 -> VDO层 -> 物理存储

VDO维护了一个索引表,记录每个数据块的指纹(fingerprint)。当新数据进来的时候,先计算指纹,然后查表看看有没有相同的。这个过程是透明的,应用程序完全感知不到。

不过这里有个问题,索引表本身也要占用内存和存储空间。VDO默认会为每1TB的存储分配大约370MB的内存用于索引。如果你的服务器内存不够,可能会影响性能。

vdo流程图

flowchart TD
    A[应用程序] --> B[系统调用]
    B --> C[VFS虚拟文件系统]
    C --> D[文件系统]
    D --> E[块设备层]
    E --> F[VDO层]
    
    F --> G[重复数据删除]
    F --> H[数据压缩]
    F --> I[精简配置]
    
    G --> J[哈希计算]
    H --> K[LZ4压缩算法]
    I --> L[按需分配]
    
    J --> M[重复数据检测]
    K --> N[压缩数据块]
    L --> O[存储空间映射]
    
    M --> P[VDO数据管理]
    N --> P
    O --> P
    
    P --> Q[块映射表]
    Q --> R[物理存储设备]
    
    R --> S[HDD/SSD]
    
    subgraph "应用层"
        A
        B
    end
    
    subgraph "操作系统层"
        C
        D
        E
    end
    
    subgraph "VDO优化层"
        F
        G
        H
        I
        J
        K
        L
        M
        N
        O
        P
        Q
    end
    
    subgraph "物理层"
        R
        S
    end
    
    style A fill:#e3f2fd
    style F fill:#fff3e0
    style P fill:#e8f5e8
    style S fill:#fce4ec

实际安装配置过程

说了这么多理论,来点实际的。我在CentOS 8上安装VDO的过程记录一下。

首先安装VDO相关的包:

dnf install vdo kmod-kvdo

安装完成后,创建一个VDO卷。假设我有一块1TB的硬盘/dev/sdb:

vdo create --name=vdo1 --device=/dev/sdb --vdoLogicalSize=10T

这里有个重要的参数--vdoLogicalSize,我设置成了10T,但是物理硬盘只有1T。这就是VDO的"超配"功能,可以创建比物理存储更大的逻辑卷。当然,这个要根据你的数据压缩比来合理设置,设置太大的话,真正写满了就麻烦了。

创建完VDO卷后,还需要格式化:

mkfs.xfs -K /dev/mapper/vdo1

注意这里的-K参数很重要,它告诉XFS不要发送discard命令,因为VDO会自己处理。

然后就可以挂载使用了:

mkdir /mnt/vdo1
mount /dev/mapper/vdo1 /mnt/vdo1

性能表现怎么样

说实话,刚开始我对VDO的性能是有担心的。毕竟多了一层处理,肯定会有开销。实际测试下来,写入性能确实会有一定影响,特别是第一次写入的时候,因为要做去重和压缩的计算。

我用fio做了个简单的测试,写入性能大概下降了20-30%左右。但是读取性能基本没什么影响,因为解压缩的开销很小。

不过这个性能损失相对于节省的存储成本来说,还是很划算的。特别是对于那些写入不频繁,但是存储量很大的场景,比如备份数据、日志归档等。

有个小技巧,VDO支持异步模式,可以提高写入性能。创建VDO卷的时候加上--writePolicy=async参数:

vdo create --name=vdo1 --device=/dev/sdb --vdoLogicalSize=10T --writePolicy=async

当然,异步模式在断电的时候可能会丢失一些数据,要根据实际需求来选择。

监控和管理

VDO提供了一些命令来查看状态和统计信息。最常用的是vdostats

vdostats --human-readable

这个命令会显示压缩比、去重比、使用空间等信息。我经常用这个命令来检查VDO的效果。

还有vdo status命令可以查看VDO卷的详细状态:

vdo status --name=vdo1

如果需要调整VDO的参数,可以用vdo modify命令。比如调整逻辑大小:

vdo growLogical --name=vdo1 --vdoLogicalSize=15T

踩过的坑

用VDO这段时间,也踩了不少坑,分享几个比较典型的。

第一个坑是内存不足。我刚开始在一台只有8GB内存的服务器上创建了一个5TB的VDO卷,结果系统经常出现内存不足的问题。后来查资料才知道,VDO的索引需要占用不少内存。现在我一般按照每1TB存储配置512MB内存的比例来规划。

第二个坑是文件系统的选择。我试过用ext4,发现性能不如XFS。而且XFS对VDO的支持更好,特别是在处理大文件的时候。

第三个坑是备份恢复。VDO卷的备份不能简单地用dd命令,因为逻辑大小和物理大小不一样。我现在都是在文件系统层面做备份,用rsync或者tar。

还有一个坑是关于超配比例的设置。我一开始设置得太激进,10:1的超配比例,结果真正使用的时候发现压缩效果没那么好,差点把存储写满。现在我一般设置3:1到5:1的比例,比较保险。

适用场景分析

VDO不是万能的,要根据实际场景来选择。我总结了几个比较适合的场景:

虚拟化环境是VDO的强项。虚拟机镜像文件有很多重复的内容,比如操作系统文件、应用程序等。我在VMware环境下测试,去重比例能达到5:1以上。

备份存储也很适合。备份数据通常有很多重复内容,而且对性能要求不高。我们公司的备份服务器用了VDO之后,存储利用率提高了3倍多。

日志存储也是个好场景。应用日志往往有很多重复的格式和内容,压缩效果很好。

但是有些场景就不太适合了。比如数据库存储,特别是OLTP数据库,对延迟要求很高,VDO的开销可能会影响性能。还有就是已经压缩过的数据,比如视频、图片等,VDO的效果就不明显了。

与其他技术的对比

市面上类似的技术还有不少,比如ZFS的压缩和去重功能,还有一些商业存储产品的重删技术。

ZFS的去重功能很强大,但是对内存的要求更高,而且性能影响也更大。VDO相对来说更轻量一些,对系统资源的要求没那么苛刻。

商业存储产品的重删技术通常效果更好,但是成本也高很多。VDO作为开源方案,性价比还是很不错的。

未来发展趋势

Red Hat对VDO的投入还是很大的,在RHEL 9中进一步优化了性能。我看到一些资料说,未来可能会把VDO集成到LVM中,使用起来会更方便。

另外,随着NVMe SSD的普及,存储性能越来越高,VDO的性能开销相对来说就没那么明显了。我觉得VDO在未来几年还是很有前景的。

实施建议

如果你想在生产环境中使用VDO,我建议先在测试环境中充分验证。特别是要测试你的实际数据的压缩和去重效果,不要盲目相信理论数值。

内存规划很重要,一定要预留足够的内存给VDO索引。如果内存不够,可以考虑使用稀疏索引,虽然效果会差一些,但是内存占用会少很多。

监控也不能少,要定期检查VDO的状态和统计信息,及时发现问题。我现在用Zabbix监控VDO的各项指标,设置了一些告警阈值。

总结

VDO确实是个不错的存储优化技术,特别是在当前存储成本居高不下的情况下,能够有效节省硬件投入。虽然会有一定的性能开销,但是对于大多数场景来说都是可以接受的。

当然,技术选型还是要结合实际需求,不能为了用新技术而用新技术。VDO适合那些存储量大、重复数据多、对性能要求不是特别苛刻的场景。

我在生产环境中使用VDO已经有一年多了,总体来说还是很满意的。不仅节省了不少存储成本,运维管理也比较简单。如果你也有类似的存储压力,不妨试试VDO。

**如果这篇文章对你有帮助,别忘了点赞转发支持一下!想了解更多运维实战经验和技术干货,记得关注微信公众号@运维躬行录,领取学习大礼包!!!我会持续分享更多接地气的运维知识和踩坑经验。让我们一起在运维这条路上互相学习,共同进步!

公众号:运维躬行录

个人博客:躬行笔记

标签: none