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

Tom*_*Tom 5 linux distributed-filesystems

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

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

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

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

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

我看到像GlusterFS这样的工具来管理这些分布式文件系统,还有Hadoop HDFS

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

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

小智 2

我发现在一堆系统中查找重复文件的最简单方法是创建一个文件列表,其中包含每个系统的 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
Run Code Online (Sandbox Code Playgroud)

这将在每个主机上生成一个文件 /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
}'
Run Code Online (Sandbox Code Playgroud)

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

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