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


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

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

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

客户现在可以访问CDN。但目前只列举可能是一项艰巨的任务。

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

我看到像这样的工具 GlusterFS 用于管理这些分布式文件系统,以及 Hadoop HDFS

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

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


5
2018-05-20 11:48






答案:


我发现在一堆系统中找到重复文件的最简单方法是创建一个文件列表,其中包含每个系统的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和filename)。


2
2018-05-20 12:30



我已经考虑过这个想法,但是一些初步调查显示了至少5亿行的融合数据集。在60字节的记录,30GB的数据只是为了列出文件...... ;-)(我想,需要一个字节计算器...) - Tom H
好消息是生成数据集将被分发。所以你需要的只是加强你在哪里进行处理。您可以将其加载到分布式Oracle RAC集群中,但是我已经在相当大的数据集上完成了这种样式排序/比较,并且它实际上比我想象的要快。主要的是观察你的临时空间 - 你可能必须传递-T标志来排序,如果你的默认/ tmp不够大。哦,首先在一个小数据集上尝试,只是为了确保代码中没有拼写错误。 - Derek Pressnall