Reduza os backups em 99,5% com hashget

O hashget é um desduplicador gratuito baseado em ópera - um utilitário semelhante ao arquivador que pode reduzir significativamente o tamanho dos backups, além de organizar esquemas de backup incremental e diferencial e muito mais.


Este é um artigo de revisão para descrever os recursos. O uso do hashget em si (bastante simples) é descrito na documentação README e wiki do projeto.


Comparação


De acordo com a lei do gênero, começarei imediatamente com intrigas - comparando os resultados:


Amostra de dadostamanho descompactado.tar.gzhashget .tar.gz
Wordpress-5.1.143 Mb11 Mb (26%)155 Kb ( 0,3% )
Linux kernel 5.0.4934 Mb161 Mb (20%)4,7 Mb ( 0,5% )
VM LXC do Debian 9 (LAMP)724 Mb165 Mb (23%)4,1 Mb ( 0,5% )

Antecedentes do que um backup ideal e eficaz deve ser


Toda vez que eu fazia um backup de uma máquina virtual criada recentemente, ficava assombrada com a sensação de estar fazendo algo errado. Por que obtenho um backup pesado de um sistema em que minha inestimável criatividade imperecível é um index.html de linha única com o texto "Hello world"?


Por que há 16 megabytes / usr / sbin / mysqld no meu backup? É realmente neste mundo que tenho a honra de armazenar esse arquivo importante e, se eu não conseguir, será perdido para a humanidade? Provavelmente não. Ele é armazenado em servidores debian altamente confiáveis ​​(cuja confiabilidade e continuidade não podem ser comparadas com o que eu posso fornecer), bem como em cópias de backup (milhões deles) de outros administradores. Realmente precisamos criar 10.000.000 + 1ª cópia desse arquivo importante para aumentar a confiabilidade?


Em geral, o hashget resolve esse problema. Ao embalar - ele cria um backup muito pequeno. Ao descompactar - um sistema completamente descompactado, semelhante ao que seria com tar -c / tar -x . (Em outras palavras, esta é uma embalagem sem perdas)


Como o hashget funciona


O Hashget possui os conceitos de Package e HashPackage, com a ajuda deles para executar a desduplicação.


Pacote Um arquivo (geralmente um arquivo .deb ou .tar.gz) que pode ser baixado com segurança da rede e do qual um ou mais arquivos podem ser obtidos.


HashPackage é um pequeno arquivo JSON que representa o pacote, incluindo a URL do pacote e a soma de hash (sha256) dos arquivos dele. Por exemplo, para o pacote mariadb-server-core de 5 megabytes de tamanho, o tamanho do pacote de hash é de apenas 6 kilobytes. Mil vezes menor.


Desduplicação - criando um arquivo morto sem arquivos duplicados (se o desduplicador souber onde o pacote original pode ser baixado, isso reduzirá as duplicatas do arquivo morto).


Embalagem


Ao compactar, todos os arquivos do diretório compactado são exibidos, suas somas de hash são consideradas e, se a soma for encontrada em um dos HashPackage conhecidos, os metadados do arquivo (nome, hash, permissões etc.) são salvos em um arquivo especial .hashget-restore.json, que também será incluído no arquivo.


A própria embalagem, no caso mais simples, não parece mais complicada que o tar:


 hashget -zf /tmp/mybackup.tar.gz --pack /path/to/data 

Desembalar


A desembalagem é feita em duas etapas. Primeiro, o alcatrão usual é desembalado:


 tar -xf mybackup.tar.gz -C /path/to/data 

depois restaure da rede:


 hashget -u /path/to/data 

Durante a recuperação, o hashget lê o arquivo .hashget-restore.json, baixa os pacotes necessários, descompacta e extrai os arquivos necessários, configurando-os nos caminhos corretos, com o proprietário / grupo / permissões necessários.


Coisas mais complicadas


O que é descrito acima já é suficiente para aqueles que "querem como tar, mas empacotam meu Debian em 4 megabytes". Além disso, veremos coisas mais difíceis.


Indexação


Se um hashget não tivesse um único HashPackage, simplesmente não poderia deduplicar nada.


Você também pode criar um HashPackage manualmente (simplesmente: hashget --submit https://wordpress.org/wordpress-5.1.1.zip -p my ), mas existe uma maneira mais conveniente.


Para obter o hashpackage necessário, existe uma etapa de indexação (é executada automaticamente quando o comando --pack é --pack ) e heurísticas . Ao indexar, o hashget "alimenta" cada arquivo encontrado para todas as heurísticas existentes nas quais ele está interessado. A heurística pode indexar qualquer pacote para criar um HashPackage.


Por exemplo, uma heurística Debian ama o arquivo / var / lib / dpkg / status e detecta pacotes debian instalados e, se não estiverem indexados (o HashPackage não foi criado para eles), os fará o download e os indexará. O resultado é um efeito muito agradável - o hashget sempre deduplicará efetivamente os sistemas operacionais Debian, mesmo se eles tiverem os pacotes mais recentes.


Arquivos de dicas


Se sua rede usar algum tipo de pacote proprietário ou público que não esteja incluído nas heurísticas de hashget, você poderá adicionar um arquivo de dica hashget-hint.json simples da seguinte maneira:


 { "project": "wordpress.org", "url": "https://ru.wordpress.org/wordpress-5.1.1-ru_RU.zip" } 

Além disso, toda vez que o arquivo morto é criado, o pacote será indexado (se não anteriormente) e os arquivos do pacote serão deduplicados do arquivo morto. Nenhuma programação é necessária, tudo pode ser feito a partir do vim e salvo em todos os backups. Observe que, graças à abordagem via hashes, se alguns arquivos do pacote forem alterados localmente (por exemplo, o arquivo de configuração for alterado), os arquivos alterados serão salvos no arquivo morto "como estão" e não serão reduzidos.


Se alguns de seus próprios pacotes são atualizados periodicamente, mas as alterações não são muito grandes, você pode apenas sugerir versões principais. Por exemplo, na versão 1.0, eles fizeram uma dica indicando mypackage-1.0.tar.gz, e ela será completamente desduplicada; depois, eles lançaram a versão 1.1, que é um pouco diferente, mas a dica não foi atualizada. Nada para se preocupar. Somente arquivos que correspondem (que podem ser restaurados) com a versão 1.0 são deduplicados.


Uma heurística que processa um arquivo de dicas é um bom exemplo para entender o mecanismo interno da heurística. Ele processa apenas arquivos hashget-hint.json (ou .hashget-hint.json com um ponto) e ignora todos os outros. Usando esse arquivo, ele determina qual URL do pacote deve ser indexado e o hashget o indexa (se isso não tiver sido feito antes)


Hashver


Seria bastante demorado executar totalmente a indexação ao criar backups. Para fazer isso, você precisa baixar cada pacote, descompactar, indexar. Portanto, o hashget usa um esquema com um HashServer . Se um pacote debian estiver instalado, se não for encontrado no HashPackage local, primeiro será feita uma tentativa de simplesmente fazer o download do HashPackage do servidor de hash. E somente se isso não der certo - o hashget faz o download e o hash do pacote (e faz o upload para o hashserver, para que o hashserver o forneça posteriormente).


HashServer - um elemento opcional do esquema, não crítico, é usado exclusivamente para acelerar e reduzir a carga nos repositórios. É facilmente desconectado (com a opção --hashserver sem parâmetros). Além disso, você pode criar facilmente seu próprio servidor de hash .


Backups incrementais e diferenciais, obsolescência planejada


O hashget facilita muito fazer backups incrementais e diferenciais . Por que não indexamos nosso próprio backup (com todos os nossos arquivos exclusivos)? Uma equipe - --submit e pronto! O próximo backup que o hashget criará não incluirá arquivos desse arquivo.


Mas essa não é uma abordagem muito boa, pois pode ocorrer que, durante a recuperação, tenhamos de arrancar todos os backups de hashget de todo o histórico (se cada um tiver pelo menos um arquivo exclusivo). Existe um mecanismo para obsolescência agendada de backup para isso. Ao indexar, você pode especificar a data de validade do HashPackage - --expires 2019-06-01 e, nessa data (a partir das 00:00), ele não será usado. O arquivo em si não pode ser excluído após essa data (embora o hashget possa mostrar convenientemente os URLs de todos os backups que nós apodrecemos / apodrecemos no momento ou em qualquer data).


Por exemplo, se você fizer um backup completo no 1º dia e indexá-lo por uma vida útil antes do final do mês, obteremos um esquema de backup diferencial.


Se também indexarmos novos backups, haverá um esquema de backups incrementais.


Diferentemente dos esquemas tradicionais, o hashget permite usar várias fontes básicas. O backup será reduzido devido à redução de arquivos de backups anteriores (se houver) e devido a arquivos públicos (que podem ser baixados).


Se, por algum motivo, não confiamos na confiabilidade dos recursos do Debian ( https://snapshot.debian.org/ ) ou usamos uma distribuição diferente, podemos fazer um backup completo de todos os pacotes uma vez e depois confiar nele ( desabilitando a heurística ) Agora, se todos os servidores de nossas distribuições se tornarem inacessíveis para nós (na lembrança da Internet ou durante o apocalipse zumbi), mas nossos backups estiverem em ordem - podemos recuperar qualquer backup diff curto que dependa apenas dos backups anteriores.


O Hashget depende apenas de fontes confiáveis ​​de recuperação, a seu critério. O que você considera confiável - esses serão usados.

FilePool e Geleira


O mecanismo FilePool permite que você não acesse constantemente servidores externos para baixar pacotes, mas use pacotes de um diretório local ou servidor corporativo, por exemplo:


 $ hashget -u . --pool /tmp/pool 

ou


 $ hashget -u . --pool http://myhashdb.example.com/ 

Para criar um pool em um diretório local - basta criar um diretório e fazer upload de arquivos para ele, o próprio hashget encontrará o que ele precisa com hashes. Para tornar o pool acessível via HTTP, você precisa criar links simbólicos de uma maneira especial, isso é feito com um comando ( hashget-admin --build /var/www/html/hashdb/ --pool /tmp/pool ). O próprio HTTP FilePool é um arquivo estático; portanto, qualquer servidor Web simples pode atendê-lo; a carga no servidor é quase zero.


Graças ao FilePool, não apenas os recursos http (s) podem ser usados ​​como recursos básicos, mas também, por exemplo , o Amazon Glacier.


Após o upload do backup para o glaciar, obtemos seu ID de upload e o usamos como um URL. Por exemplo:


 hashget --submit Glacier_Upload_ID --file /tmp/my-glacier-backup.tar.gz --project glacier --hashserver --expires 2019-09-01 

Agora, os novos backups (diferenciais) contarão com esse backup e serão mais curtos. Depois de descompactar o diffback, podemos ver em que recursos ele se baseia:


 hashget --info /tmp/unpacked/ list 

e apenas use o shell script para baixar todos esses arquivos da geleira no pool e execute a recuperação usual: hashget -u / tmp / unpacked --pool / tmp / pool


O jogo vale a vela


No caso mais simples, você pagará menos pelos backups (se os armazenar em algum lugar da nuvem por dinheiro). Talvez - muito, muito menos.


Mas este não é o único. Quantidade entra em qualidade. Você pode usar isso para obter uma atualização de alta qualidade do esquema de backup. Por exemplo, como nossos backups agora são mais curtos - você não pode fazer um backup mensal, mas diário. Mantenha-os não seis meses, como antes, mas 5 anos. Anteriormente, eles eram armazenados em um armazenamento "frio" lento, mas barato (Glacier), agora você pode armazenar em local quente, de onde você sempre pode baixar rapidamente um backup e recuperar em minutos, não em um dia.


Você pode aumentar a confiabilidade do armazenamento de backup. Se agora os armazenarmos em uma loja, reduzindo o volume de backups - podemos armazenar em 2 a 3 lojas e sobreviver com segurança se um deles for danificado.


Como tentar começar a usar?


Vamos para a página do gitlab https://gitlab.com/yaroslaff/hashget , instalamos com um comando ( pip3 install hashget[plugins] ) e apenas lemos e executamos o início rápido. Eu acho que todas as coisas simples a fazer - levarão de 10 a 15 minutos. Em seguida, você pode tentar agitar suas máquinas virtuais, criar arquivos de dica, se necessário, apertar com mais força, brincar com pools, um banco de dados de hash local e um servidor de hash, se for interessante, e no dia seguinte ver qual será o tamanho do backup incremental sobre ontem.


Restic + HashGet


(Este capítulo foi adicionado mais tarde. Agradecemos aos comentaristas por suas críticas e motivação.)


Existe uma boa ferramenta conveniente para backups - restic . Ele também pode executar desduplicação, mas apenas dentro do repositório, não é possível desduplicação externa, o que o hashget faz com facilidade . Mas na combinação de restic + hashget , conseguimos usar as vantagens de ambas as abordagens!


Preparação (descompacte o wordpress e o indexe):


 # wget -q https://wordpress.org/wordpress-5.2.2.tar.gz # hashget --submit https://wordpress.org/wordpress-5.2.2.tar.gz -p my --file wordpress-5.2.2.tar.gz --hashserver # tar -xf wordpress-5.2.2.tar.gz # du -sh wordpress 46M wordpress 

Adicionando instantâneo a restic via


 # hashget -X exclude-list --prepack wordpress --hashserver Saved: 1468 files, 1 pkgs, size: 40.5M. Download: 10.7M # restic --exclude-file exclude-list backup wordpress password is correct scan [/tmp/wp/wordpress] scanned 193 directories, 367 files in 0:02 [0:04] 100.00% 700.829 KiB / 700.829 KiB 560 / 560 items 0 errors ETA 0:00 duration: 0:04 snapshot 76b54230 saved # du -sh /tmp/restic-repo/ 2,1M /tmp/restic-repo/ 

Nesse estágio, adicionamos uma captura instantânea de catálogo (mais de 40 Mb) e o tamanho do repositório aumentou em apenas 1 Mb.


A recuperação é feita por dois comandos:


 # restic restore 76b54230 -t unpacked password is correct restoring <Snapshot 76b54230 of [/tmp/wp/wordpress] at 2019-06-19 04:30:55.760618336 +0700 +07 by root@braconnier> to unpacked # hashget -u unpacked/wordpress/ --hashserver Recovered 1468/1468 files 40.5M bytes (0 downloaded, 0 from pool, 10.7M cached) in 1.56s 

Source: https://habr.com/ru/post/pt454826/


All Articles