Qual a diferença entre deduplicação e compressão?

Quando se trata de armazenamento de grandes volumes de dados se fala muito em deduplicação como uma maneira eficiente de reduzir a quantidade de armazenamento necessária, sem perda de performance. No entanto nunca vi um texto didático explicando a diferença entre deduplicação e compressão, então resolvi escrever este texto.

Antes de continuarmos, um comentário: acredito que o termo correto seja "deduplicação" e não "desduplicação" como alguns defendem. Falo um pouco mais sobre este tema no final do artigo.

Compressão

A grosso modo, a compressão é um processo que consome muito processamento e é realizado analisando as informações, procurando qualquer tipo de repetição e criando uma tabela de trocas para essas repetições. Por exemplo considere o seguinte texto:

O tempo perguntou pro tempo
quanto tempo o tempo tem.
O tempo respondeu pro tempo
que o tempo tem tanto tempo
quanto tempo o tempo tem.

Vamos supor que usamos a seguinte tabela de conversão:

1 = tempo
2 = tem
3 = quanto

Eu posso rescrever o texto da seguinte maneira:

O 1 perguntou pro 1
3 1 o 1 2.
O 1 respondeu pro 1
que o 1 2 tanto 1
3 1 o 1 2.

Eu agora posso armazenar a tabela de conversão mais o texto que eles irão ocupar menos espaço que o texto original. Quando eu necessitar do texto original é só pegar a tabela de conversão (chamada de "dicionário") e tenho de volta o texto original. Obviamente que este é apenas um exemplo didático (você pode se perguntar: mas e se o texto tiver os números 1, 2 ou 3?), assim a ideia não foi mostrar como se cria um protocolo de compressão do zero, foi apenas mostrar um resumo de como eles funcionam.

Repare que na compressão eu necessito procurar quais as repetições existem na informação (isso consome tempo) para criar o dicionário.

Assim a compressão é muito eficiente em reduzir a quantidade de dados armazenados, porem tem algumas deficiências importantes:
  1. só funciona bem em quantidades grandes de informações (quanto mais dados, maior a chance de ocorrerem repetições e consequentemente maior a taxa de compressão alcançada).
  2. demanda uma quantidade significativa processamento (e tempo) para ser comprimido e descomprimido, assim gera atrasos no processo de armazenamento e recuperação das informações.

Dessa forma os fabricantes de tecnologia de armazenamento buscaram uma opção intermediária: que não causasse atrasos (ou que o atraso fosse insignificante) mas que pudesse gerar algum ganho significativo em termos de economia de armazenamento. Foi dessa necessidade que surgiu o conceito de deduplicação.

Dois tipos de deduplicação

O primeiro tipo de deduplicação é bem simples, baseado em arquivos repetidos. O sistema de armazenamento procura arquivos duplicados e quando os encontra apaga todos menos um, os arquivos apagados são substituídos por um arquivo-ponteiro, que como o nome indica aponta para o arquivo que sobrou. Por exemplo imaginem que o João cria uma apresentação e envia o arquivo para a Maria, Pedro e Manuel. Todos guardam essa apresentação em diretórios diferentes nos seus computadores. Quando for realizado o backup de todos esses usuários no servidor central, esses arquivos idênticos vão parar no mesmo servidor, que guardaria apenas o primeiro arquivo, para os demais ele armazenaria um arquivo pequeno apontando a localização (diretório) do primeiro arquivo. Dessa forma não existe gasto extra com armazenamento de várias vezes o mesmo arquivo. Quanto mais arquivos duplicados, maior o ganho neste caso.

Esse tipo de deduplicação é bem simples de ser implementado, porém tem uma eficiência pequena: se algum dos usuários mudar o nome do arquivo ou trocar um slide (ou seja, mudar apenas uma parte pequena do arquivo original) esse novo arquivo será considerado com algo totalmente diferente e não irá aproveitar nenhuma economia de espaço.

O segundo tipo de deduplicação é mais eficiente, porém um pouco mais trabalhoso de se entender. Ele se baseia em deduplicar blocos de informações e não apenas arquivos. Para entender como isso funciona, vamos relembrar rapidamente como as informações são armazenadas em um disco.

Por algumas razões técnicas (que não dá para explicar neste texto) um disco rígido é dividido em pedaços de tamanhos iguais chamados setores. As informações são armazenadas nesses setores, da mesma forma que guardamos roupas em gavetas. Se meu disco tem setores de 4Kbytes e desejo armazenar o arquivo "teste.txt" de 10 Kbytes, vou gastar 3 setores (repare que do último setor se usa apenas 2Kbytes, porém o resto desse setor não pode ser aproveitado por outro arquivo - por razões técnicas).

Outro detalhe é que os setores de um mesmo arquivo não precisam estar juntos, eles podem estar espalhados pelo disco (que é o que causa o problema da fragmentação), assim existe uma tabela no disco (essa é a tão famosa FAT ou então NTFS, que são exemplos de tipos dessa tabela) que indica quais os setores de cada arquivo. Assim se meu disco tem 500.000 setores (marcados de 0 a 499.999) então essa tabela, por exemplo, indicará que o arquivo teste.txt ocupa os setores 34.543, 10.801 e 567 (repare que os setores nem precisam estar em uma ordem específica).

Aonde entra a deduplicação aqui? Para responder a essa questão precisamos procurar setores iguais. Imagine que o arquivo "texte.txt" (setores 34.543, 10.801 e 567) e o arquivo "apresentacao1.ppt" (setores 113, 300.234, 41.345 e 998) tenham, por coincidência, os setores 567 e 113 idênticos. Então estou com dois setores contendo exatamente a mesma informação, isso eu posso resolver apontando os dois arquivos para o mesmo setor. Vamos supor que eu escolha manter o 567 e liberar o 113, assim o arquivo "texte.txt" continua sendo 34.543, 10.801 e 567 mas o "apresentação1.ppt" passa a ser 567, 300.234, 41.345 e 998.

Assim, essa técnica de deduplicação procura "pedaços" de informações repetidos e elimina as duplicidades através da tabela que monta esses arquivos (apontando as duplicidades para um mesmo bloco único). Repare que essa técnica de deduplicação não é restrita a apenas discos. Qualquer tipo de armazenamento que divida as informações em blocos pode se beneficiar dessa técnica.

No exemplo que comentamos acima, aonde o João cria uma apresentação e envia o arquivo para a Maria, Pedro e Manuel, se o Manuel fizer uma modificação na apresentação (o que impediria o primeiro tipo de deduplicação de funcionar) ainda assim teria vários blocos em comum com os demais arquivos dos colegas, sendo assim haverá deduplicação em algumas partes.

Temos então os dois tipos de deduplicação: a de arquivos e a de blocos. A primeira é mais fácil de ser implementada, porém é menos eficiente. A segunda técnica é um pouco mais complexa na implementação (por isso está presente em menos equipamentos) porém mais eficiente.

Repare que ambos os casos a maneira de implementar a deduplicação é - quase sempre - na forma de um processo trabalhando dentro do sistema de armazenamento. Ou seja, as informações são gravadas normalmente (duplicadas) e esse processo fica "em background" procurando oportunidades de deduplicar. Então é comum, em ambientes que usam deduplicação, ocorrer um fenômeno interessante: durante o dia (aonde surgem muitas informações novas) aumenta a ocupação do sistema de armazenamento, mas durante a noite essa ocupação diminui mesmo que nenhum dado ou arquivo tenha sido removido. Isso porque os processos de deduplicação tiveram tempo para encontraram cópias de informação e as deduplicaram.



Resumo

A deduplicação não deixa de ser uma compressão, porém a deduplicação usa uma abordagem mais simples (por consequência sem impactos significativos na performance) para economizar armazenamento sem perda sensível de performance. Uma boa ideia em tempos de crescimento exponencial das informações.


Anexo A - Deduplicação ou Desduplicação?

Sem querer entrar em detalhes sobre etimologia, neologismos ou anglicismo, vou usar como base da minha defesa as palavras decodificar, decolar (que vem do frances décoller) e degradação. Ou vamos criar também uma situação para defender o uso das palavras descodificar (no Português de Portugal, sim, é descodificar), descolar (no caso de aviões saindo do solo) e desgradação? Como os advogados dizem nos EUA, "I rest my case".

Comentários

Anônimo disse…
Excelente explicação, parabéns!
Unknown disse…
Parabéns pela explicação em linguagem simples e objetiva!
Anônimo disse…
Very good!