Desduplicação no nível da partição

8

Quais são as soluções disponíveis para desduplicação em nível de bloco ou mais detalhada?

Existem arquivos baseados - com a abordagem "Copiar na gravação".

Estou procurando pelo nível de bloco "copy-on-write", para que possa procurar periodicamente por blocos comuns, ou - preferencialmente - partes de arquivos, mesclá-los e sinalizar para o modo de uso do CoW. Existe algo assim disponível ou ainda precisa ser criado? Não tenho certeza se a desduplicação do Btrfs está no nível de bloco / arquivo / subparte? Há LessFS, mas não tenho certeza de qual nível de deduplicação ele fornece? Talvez outra solução?

Grzegorz Wierzowiecki
fonte
Não entendo por que essa pergunta está sendo votada com êxito. Pesquisando no Google para "desduplicação do linux", aparece uma lista de sistemas de arquivos e produtos que não precisamos duplicar aqui.
Kyle Jones
Esse tipo de pesquisa retorna muitas soluções trabalhando no nível de arquivos. Qual é o objetivo desta pergunta, um conselho sobre qual deles se encaixa no meu objetivo - de preferência para permitir a duplicação de duas partes de arquivos, desnecessárias ajustadas ao nível do bloco. Se essa solução não estiver disponível, clique no nível do bloco. Outra coisa é que muitas coisas causam impressão experimental - conto com a experiência de outros usuários para aconselhar alguma solução madura.
Grzegorz Wierzowiecki 22/03
1
@GrzegorzWierzowiecki não tem certeza de que se encaixa na conta, mas confira a cyphertite, formalmente um epítome: peereboom.us/epitome cyphertite.com
gabe.

Respostas:

3

No que diz respeito à desduplicação no nível do bloco, acho que o ZFS é a melhor implementação incontestada atualmente. Realmente não foi projetado para otimização após o fato, porque sua desduplicação (se ativada) é criada diretamente nas funções de leitura / gravação. Por esse motivo, pode ser um pouco caro de memória sob carga, tentando manter na memória as partes mais relevantes da tabela de deduplicação, mas o ZFS é bom em restringir-se a consumir não mais do que 50% da memória, o que depende de quantidade de memória instalada, pode parecer bastante arbitrária (50% de 2Gb vs 50% de 64Gb, especialmente se houver poucas tarefas de usuário que necessitem de memória).

Dependendo do que você deseja usá-lo, você tem algumas opções:

O OpenIndiana parece ter boas opções de área de trabalho e servidor, com base no Solaris

O FreeBSD (desde 9.0) possui uma versão bastante avançada do ZFS (que inclui desduplicação) embutida. Uma notável distribuição derivada do FreeBSD (então MonoWall) é o NAS4Free , o que facilita a criação de um NAS.

O Linux tem algumas opções, algumas com desduplicação, outras sem. Como você está procurando por desduplicação, o mais notável que eu vi é o zfsonlinux . Não tenho certeza de qual é o progresso deles ou de quão estável é o projeto, mas definitivamente parece promissor.

Quanto a qualquer coisa com desduplicação parcial de bloco, não vi NADA até agora que relate a capacidade de fazer isso.

killermist
fonte
0

Sua pergunta é um pouco confusa devido ao termo "blocos", que é uma palavra muito sobrecarregada quando se trata de discos e sistemas de arquivos. (Mas seu contexto circundante ajuda a esclarecer.) O Btrfs não lida com "blocos" de sistema de arquivos de tamanho fixo, mas com "extensões" de tamanho variável. (Embora, confusamente, também defina zonas de blocos de tamanho variável). O ZFS lida com "blocos" do sistema de arquivos, em parte ou principalmente porque isso apresenta problemas significativamente mais fáceis de resolver. O Btrfs e o ZFS conhecem os "blocos" no nível do disco, que são abstrações. (Também temos "armazenamento em nível de bloco", que pode ter um significado semanticamente diferente.) Eu posso ter essas descrições um pouco fora, sem clareza suficiente ou com 100% de precisão. (Se você precisar de clareza e precisão de 100% no tópico de blocos, finja que você não leu isso. Se você precisar apenas de um entendimento aproximado para continuar, deve seguir em frente.) O ponto principal desta resposta não é definir perfeitamente "blocos", mas a discussão abaixo, que é muito mais na minha casa do leme.

Como o @killermist escreveu, o ZFS suporta nativamente a desduplicação no nível de bloco [ZFS].

Não está ativado por padrão no ZFS. Ligá-lo sem memória suficiente envolve um alto desempenho. Além disso, anedoticamente, o ZFS precisa de uma quantidade razoável mais do que a regra geral recomendada para "1 GB de RAM por 1 TB de armazenamento", para ajustar toda a hashtable na RAM. Mas, mesmo assim, dependendo do hardware, você ainda pode obter velocidades de gravação de 40 MB / s. Eu entendo isso na era da tecnologia de 2008, executando ~ unidades da era de 2015. Perfeitamente aceitável para mim, principalmente para dados de arquivo. A maior desvantagem da desduplicação do ZFS é que ainda não há uma maneira elegante de fazê-lo no modo "lote / offline" (ou mais precisamente "fora da banda"), além de ativar a desduplicação, copiar tudo para um novo diretório temporário no mesmo sistema de arquivos, excluindo os originais e movendo o conteúdo temporário (agora com redução de duplicação) de volta.

A desduplicação do Btrfs é sem dúvida um pouco mais superficial, com apenas utilitários de terceiros disponíveis atualmente para fazer o trabalho. (Mas que usam APIs de kernel bem suportadas e / ou uma opção bem suportada para cp; e de qualquer maneira exigindo sua própria lógica para determinar duplicatas, que se espera seja exata). Um benefício potencial é que esses utilitários são "fora da banda". O custo para a maioria dos utilitários, porém, é que eles diminuem o desempenho enquanto tentam fugir - o que pode levar horas, dias e até semanas para ser concluído. (Pessoalmente, prefiro lidar com o desempenho de gravação sempre mais lento da desduplicação de ZFS em banda, do que martelar meus HDDs por dias, digamos, terminando uma vez por ano.)

Duas soluções Btrfs que conheço lidam com "blocos" (mas em outra definição), e não com arquivos, são abelhas e dduper .

As abelhas, por exemplo, definem arbitrariamente um tamanho de "bloco" para si na primeira execução, com base na memória disponível e possivelmente em outros fatores. (Embora eu provavelmente esteja deturpando seu propósito, recursos, mecanismo e prós / contras, já que não o uso, apenas o avaliei recentemente como uma opção.)

As abelhas são indiscutivelmente um pouco híbridas, já que foram projetadas para funcionar continuamente e não martelam os discos com tanta força - embora ainda não seja tecnicamente "in-band" como o deds do ZFS. Ele simplesmente pega duplicatas após o fato e tenta desduplicá-las com um leve toque. Trabalhar com um tamanho de bloco definido arbitrariamente significa que, por design, caberá a hashtable na RAM. A desvantagem (presumivelmente) é que pode haver extensões em um "bloco" iguais, mas as abelhas não podem deduzir porque os "blocos" em que estão são diferentes.

Lembre-se de que mesmo os utilitários que executam especificamente a desduplicação de Btrfs no nível "arquivo" (como bedup , duperemove , rmlint e outros) ainda podem atender aos seus requisitos. Não tenho certeza, mas parece que sim. Isso ocorre porque mesmo um comando "cp --reflink = always" não está desduplicando "arquivos". Está desduplicando as extensões Btrfs . Quando um "arquivo" refletido é alterado, o Btrfs desduplicata apenas as extensões que são alteradas, com suas próprias extensões exclusivas. O restante do arquivo permanece desduplicado. É assim que os arquivos desduplicados grandes ainda podem divergir como se fossem seus próprios arquivos exclusivos, mas ainda podem ser desduplicados.

(É também por isso que é tão difícil determinar se um "arquivo" é refletido ou não, porque esse conceito nem faz sentido. Todas as extensões de um arquivo podem ser refletidas para outras mesmas extensões, um conceito que faz sentido, mas é coincidentemente uma pergunta particularmente difícil de responder, razão pela qual, a menos que um utilitário de deduplicação do Btrfs acompanhe o que já foi deduplicado, não vale a pena tentar "detectar" se um arquivo já foi deduplicado. Não há nenhum atributo como refcount para inspecionar. É mais fácil deduplicá-lo novamente de qualquer maneira. Por outro lado, determinar se um arquivo inteiro é vinculado à moda antiga, é trivial. Verifique a contagem de st_nlink para um determinado inode.)

A falta de "clone de arquivo inteiro" é, de fato, um recurso intrínseco de todos os sistemas de arquivos CoW que oferecem suporte a instantâneos "gratuitos" e / ou deduplicação, e é verdade se estiver lidando com extensões Btrfs, blocos ZFS ou qualquer outra coisa. É por isso que qualquer um provavelmente pode ser uma resposta para sua pergunta. (Existem pelo menos três outros sistemas de arquivos CoW que podem ou estão planejados para serem capazes de fazer tudo isso, que eu saiba: nilfs2, bcachefs e xfs.)

Embora você não tenha mencionado isso, nenhuma tecnologia de deduplicação, pelo que sei, é compatível com o tipo de arquivo. Em outras palavras, nenhum desduplicador sabe pular os metadados * .jpg e considerar apenas os dados da imagem compactada para desduplicação. Da mesma forma, nenhum deles considera números mágicos de arquivo (pelo menos para determinar o que considerar para deduplicação). Esse pode ser um recurso matador - embora certamente exija atualizações de definição constantes e constantes. E pode ser muito difícil de projetar, além de tratar os arquivos como uma coleção abstrata M: M de extensões, blocos, etc.

Jim
fonte
Para expandir essa resposta antiga, o rmlint agora é o dedupero incontestado do btrfs, pelo menos atualmente. 1) Comparação inteligente, para evitar hash duplicado de candidatos desnecessários, a menos que tenha esgotado outras opções; 2) O ramo de desenvolvimento [e acredito que mestre] suporta hash incremental e 3) desduplicação incremental. Esses dois últimos são recursos enormes. Nenhum outro desdobrador fornece todos os três recursos, que podem literalmente reduzir os dias de execuções subseqüentes.
Jim
rmlintconsidera apenas arquivos idênticos como candidatos à desduplicação , ignorando arquivos com apenas intervalos duplicados parciais.
Tom Hale
@ Tom-hale Eu não entendo o seu ponto?
Jim Jim