desduplicação e indexação de diretórios de imagens em 150 máquinas linux

5

Eu tenho um cliente com 150 servidores Linux espalhados por vários serviços de nuvem e centros de dados físicos. Grande parte dessa infraestrutura é composta por projetos / equipes e servidores / instalações pré-existentes.

O cliente é em grande parte sobre o processamento de imagens, e muitos dos servidores têm grandes SAN ou matrizes de discos locais com milhões de arquivos jpeg / png.

Existe um agente de gerenciamento de configuração em cada caixa, vejo que muitos discos são 100%, alguns são bastante vazios e há muitos dados duplicados.

O cliente agora tem acesso a um CDN. Mas no momento apenas enumerar o que é possível é uma tarefa assustadora.

Existem ferramentas para criar índices úteis de todos esses dados?

Eu vejo ferramentas como GlusterFS para gerenciar esses sistemas de arquivos distribuídos e HDFS do Hadoop

Eu estou querendo saber se posso usar as ferramentas de indexação desses sistemas sem realmente implementar as ferramentas de gerenciamento de volume subjacentes.

Qual deve ser o ponto de partida para gerar um índice de possíveis candidatos à desduplicação?

    
por Tom H 20.05.2012 / 13:48

1 resposta

2

A maneira mais fácil que encontrei de encontrar arquivos duplicados em vários sistemas é criar uma lista de arquivos com suas somas MD5 para cada sistema, combiná-los em um arquivo e usar o comando sort + um script AWK para localizar as duplicatas. da seguinte forma:

Primeiro, execute isso em cada um dos sistemas, substituindo o caminho conforme apropriado:

#!/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

Isso produzirá um arquivo /var/tmp/HOSTNAME.filelist em cada host, o qual você terá que copiar para um local central. Depois de ter reunido todas essas listas de arquivos, você poderá executar o seguinte:

#!/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
}'

Isso deve produzir um arquivo de saída que agrupe em arquivos de blocos cujo conteúdo é duplicado no mesmo host ou em hosts.

Ah, e como alternativa ao primeiro script (que é executado em todos os hosts), verifique com o sistema de backup em uso para ver se é possível obter algo semelhante no relatório de backup (algo que inclui md5 e nome de arquivo, em menos).

    
por 20.05.2012 / 14:30