对 150 台 Linux 机器上的图像目录进行重复数据删除和索引

对 150 台 Linux 机器上的图像目录进行重复数据删除和索引

我有一个客户,有 150 台 Linux 服务器,分布在各种云服务和物理数据中心。这些基础设施大部分是收购的项目/团队和预先存在的服务器/安装。

客户端主要用于图像处理,许多服务器具有大型 SAN 或本地磁盘阵列,其中包含数百万个 jpeg/png 文件。

每个盒子上都有一个配置管理代理,我可以看到许多磁盘都是 100%,有些磁盘相当空,并且有很多重复的数据。

客户端现在可以访问 CDN。但目前,仅仅列举可能的情况就是一项艰巨的任务。

是否有任何工具可以创建所有这些数据的有用索引?

我看到过类似的工具集群文件系统用于管理这些分布式文件系统,以及Hadoop HDFS

我想知道是否可以使用这些系统的索引工具而不实际实现底层卷管理工具。

生成潜在重复数据删除候选索引的起点应该是什么?

答案1

我发现在多个系统中查找重复文件的最简单方法是针对每个系统创建一个包含其 MD5 总数的文件列表,将它们合并为一个文件,然后使用 sort + AWK 脚本查找重复项,如下所示:

首先,在每个系统上运行此程序,并根据需要替换路径:

#!/bin/sh
find /path/to/files -type f -exec md5sum {} \; |\
while read md5 filename
do
    echo -e "${HOSTNAME}\t${md5}\t${filename}"
done >/var/tmp/${HOSTNAME}.filelist

这将在每个主机上生成一个文件 /var/tmp/HOSTNAME.filelist,您必须将其复制到一个中心位置。一旦收集了所有这些文件列表,您就可以运行以下命令:

#!/bin/sh
export LANG=C
cat *.filelist |sort -t$'\t' +1 -2 |\
awk '
BEGIN {
    FS = "\t"
    dup_count = 0
    old_md5 = ""
}

{
    if ($2 == old_md5) {
        if (dup_count == 0 ) {
            printf("\n%s\n", old_inline)
        }
        printf("%s\n", $0)
        dup_count++
    }
    else {
        dup_count = 0
    }
    old_md5 = $2
    old_inline = $0
}'

这将生成一个输出文件,该文件将内容在同一主机内或跨主机重复的文件分组到块中。

哦,作为第一个脚本(在每个主机上运行)的替代,请检查正在使用的备份系统,看看是否可以从备份报告中获得类似的内容(至少包含 md5 和文件名)。

相关内容