device-mapper 块级重删(dm dedup) <3>代码结构(1)
设备映射器(device-mapper)是Linux环境下的一个内核技术,主要作用是在与存储相关的操作系统功能和应用程序之间获得一个抽象层。它提供了通用的存储接口,能够动态地管理设备、卷和快照等,使得Linux系统上的高级存储功能,例如LVM、RAID和加密等,得以实现。
随着云计算、大数据等应用场景的广泛普及,数据的存储空间需求呈现爆炸式的增长,这给数据中心的存储能力和系统延展性带来了极大的挑战。因此,在这种情况下,数据去重技术成为了存储系统关注的焦点之一。然而,由于数据去重技术一直以来被视为一种高计算量、高存储成本的方法,因此在实践中的应用和推广受到了限制。
为了解决这个问题,出现了dm dedup技术,它是一种在设备映射器之上的块级重删技术(block-level deduplication),最初由Brian Biskupski提出,旨在为Linux系统提供数据去重功能。相较于传统的文件重删技术,块级重删技术具有计算速度快、实时性好、去重率高等特点,而且与文件系统无关,因此对于应用于存储系统或虚拟化环境中的VM存储等,块级重删技术更具优势。
现在我们来进一步详细了解dm dedup技术。
1. 设备映射器
在介绍dm dedup技术之前,我们需要先了解什么是设备映射器(device-mapper)。设备映射器是一个内核模块,它提供了一个带缓存的键值对存储接口来支持块设备的快照、复制和变换等高级功能。设备映射器的核心是一个映射表(map table),用于记录逻辑块到物理块的映射。理论上,存储服务器能够承受的容量和I/O吞吐量可直接取决于设备映射器的映射表大小和I/O完成的时间,因此设备映射器是Linux系统下的重要存储基础设施。
2. dm dedup技术
dm dedup技术是一种块级重删(block-level deduplication)技术,它可以通过位图记录块的状态,有效地去除重复块,从而减少存储空间的占用。首先,dm dedup必须保证数据的完整性和正确性,在去重的过程中不能错删数据。其次,dm dedup需要指定一种块哈希算法来处理数据块,目前比较流行的是SHA1和MD5哈希算法。
对于一个设备上的数据,dm dedup首先会将其按照块大小(通常为4KB)进行分块,然后对每个块进行块哈希操作,根据哈希值和位图的状态判断该块是否已存在于设备中。如果已存在,则该块标记为重复块,否则加入到设备中并标记为未重复块,同时更新位图的状态。当后续的应用程序试图写入一个已存在的块时,设备会将写入请求转换为一个读取请求,因为已经存在该块,并将写入数据跳过。如果后续的应用程序请求读取一个重复块,则设备也会将读请求转换为一个读取请求,并返回上次写入该块时的数据。
dm dedup提供了以下几种操作模式:
(1)无缓存模式(cache mode):在这种操作模式下,dm dedup直接操作物理块,不使用缓存,因此在去重时对物理块进行的读写操作量非常大,可能会严重影响设备的性能。
(2)缓存模式(cache mode):在这种操作模式下,dm dedup采用缓存池技术,将常访问的重复块信息缓存到内存中。当应用程序访问重复块时,设备会首先读取缓存的数据,如果缓存不命中,则访问物理块,并将读取到的数据写入缓存中。由于常访问的重复块通常只占总数据的一小部分,因此缓存池大小相对较小,通常在几百MB至数GB之间。
(3)读取缓存模式(read-cache mode):这种操作模式是一种在无缓存模式和缓存模式之间的折中方案。它允许块被缓存到内存中,但不写回存储设备,而是在必要时直接阅读缓存数据。由于数据块不写回物理设备,因此这种模式下不会产生磁盘I/O,这相对于传统dm dedup操作模式而言,能够带来更低的性能开销。需要注意的是,如果缓存池中的块不断被重置,那么该块将在下一次访问时重新写入存储设备并覆盖之前的版本。
3. dm dedup的优缺点
dm dedup作为一种块级去重技术,具有以下优缺点:
(1)可扩展性:dm dedup可以实现多个映射器之间的数据共享,因此它可以在多个服务器上扩展。
(2)灵活性:dm dedup的实现不依赖于操作系统或文件系统,因此它可以与各种操作系统和文件系统一起使用。
(3)性能优势:dm dedup的性能受到硬件和软件配置的影响,但在缓存模式下,它可以在减少存储容量的同时,实现高性能的数据重删操作,减少存储开销。
(4)哈希冲突:由于哈希算法的局限性,两个不同的数据块可能具有相同的哈希值,这就导致哈希冲突的产生,在去重的过程中误删块。
(5)头部开销:dm dedup在设备中添加元数据来跟踪块的状态和哈希值,这增加了头部开销,随着块大小的增加,这种开销相对会更大。
4. dm dedup的实现
dm dedup是基于dm与Linux内核的模块来实现的,用户只需下载和安装模块即可。要使用dm dedup,用户需要下面的步骤:
(1)检查内核模块是否支持dm dedup。
(2)创建一个块映射,并将其挂载到一个块设备上。
(3)使用dmsetup命令,创建、删除或修改dm dedup映射。
(4)将想要使用dm dedup去除重复块的设备添加到映射中。
(5)在一个块
