é um deduplicador gratuito e de código aberto — uma ferramenta semelhante a um compactador, que permite reduzir significativamente o tamanho dos backups, além de organizar esquemas de backup incremental e diferencial, entre outros. Este é um artigo de visão geral para descrever as funcionalidades. O uso do hashget (bastante simples) está descrito em
documentação do projeto e wiki .
Comparação
A amostra de dados
tamanho descompactado
hashget .tar.gz
.tar.gz
WordPress-5.1.1
43 Mb
11 Mb (26%)
155 Kb (
Linux kernel 5.0.4 0.3% )
934 Mb
161 Mb (20%)
4.7 Mb (
Debian 9 (LAMP) LXC VM 0.5% )
724 Mb
165 Mb (23%)
4.1 Mb (
A história, como deve ser um backup ideal e eficaz 0.5% )
Toda vez que eu fazia backup de uma nova máquina virtual, sentia que algo estava errado. Por que meu backup está tão pesado para um sistema que só tem meu precioso e imortal trabalho — um arquivo index.html com o texto "Hello world"?
Por que existe um /usr/sbin/mysqld de 16 megabytes no meu backup? Será que eu sou o único que precisa guardar esse arquivo importante, e se eu não conseguir, ele será perdido para a humanidade? Provavelmente não. Ele está armazenado em servidores extremamente confiáveis debian (a confiabilidade e continuidade deles são incomparáveis ao que posso oferecer), e também em backups (milhões deles) de outros administradores. Precisamos realmente criar 10.000.000 + 1 cópias desse arquivo importante para aumentar a confiabilidade?
Na verdade,
isso resolve esse problema. Ao empacotar, ele cria um backup muito pequeno. Ao descompactar, ele restaura completamente o sistema, semelhante ao que seria obtido com tar -c tar -x / . (Em outras palavras, este é um empacotamento sem perdas)Como funciona o hashget
No hashget, existem os conceitos de Package e HashPackage, que permitem realizar a deduplicação.
(pacote). Um arquivo (geralmente um arquivo .deb ou .tar.gz) que pode ser baixado de forma confiável da internet, do qual se pode obter um ou mais arquivos.
Pacote HashPackage
é um pequeno arquivo JSON que representa o Package, incluindo o URL do pacote e os hashes (sha256) dos arquivos contidos nele. Por exemplo, para o pacote mariadb-server-core de 5 megabytes, o tamanho do hashpackage é apenas 6 kilobytes. Aproximadamente mil vezes menor. Deduplicação
— criação de um arquivo sem arquivos duplicados (se o deduplicador souber onde o pacote original pode ser baixado, ele reduz as duplicatas do arquivo). Empacotamento
Embalagem
Ao compactar, todos os arquivos do diretório a ser compactado são analisados, seus hash são calculados e, se o hash for encontrado em um dos HashPackages 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 compactado.
A própria compactação, no caso mais simples, não é mais complicada que a do tar:
hashget -zf /tmp/mybackup.tar.gz --pack /path/to/dataDesembalagem
A descompactação é realizada em duas etapas. Primeiro, a descompactação normal do tar:
tar -xf mybackup.tar.gz -C /path/to/dataem seguida, a recuperação pela rede:
hashget -u /path/to/dataDurante a recuperação, o hashget lê o arquivo .hashget-restore.json, baixa os pacotes necessários, os descompacta e extrai os arquivos necessários, instalando-os nos caminhos corretos, com os devidos owner/group/permissions.
Coisas mais complexas
O que foi descrito acima já é suficiente para aqueles que dizem 'quero algo como tar, mas que compacte meu Debian em 4 megabytes'. Agora, veremos coisas mais complexas.
Indexação
Se o hashget não tivesse nenhum HashPackage, ele simplesmente não conseguiria desduplicar nada.
Um HashPackage pode ser criado manualmente (basta: hashget --submit https://wordpress.org/wordpress-5.1.1.zip -p my), mas há um caminho mais conveniente.
Para obter os hashpackages necessários, há uma etapa de indexação (que é executada automaticamente ao usar o comando --pack) e heurísticas. Durante a indexação, o hashget 'oferece' cada arquivo encontrado a todas as heurísticas disponíveis que lhe interessam. As heurísticas podem então indexar qualquer Package para criar um HashPackage.
Por exemplo, a heurística do Debian gosta do arquivo /var/lib/dpkg/status e detecta os pacotes Debian instalados, e se eles não estiverem indexados (se nenhum HashPackage foi criado para eles), os baixa e os indexa. O resultado é um efeito muito agradável — o hashget sempre será capaz de desduplicar de forma eficiente os sistemas Debian, mesmo que estes tenham os pacotes mais recentes.
Arquivos de dica (hints)
Se na sua rede houver algum pacote proprietário ou público que não esteja incluído nas heurísticas do hashget, você pode adicionar um simples arquivo de dica hashget-hint.json seguindo o modelo:
{
"project": "wordpress.org",
"url": "https://ru.wordpress.org/wordpress-5.1.1-ru_RU.zip"
}A partir de agora, toda vez que um arquivo zip for criado, o pacote será indexado (se não foi anteriormente), e os arquivos do pacote serão deduplicados do arquivo zip. Não é necessário qualquer programação, tudo pode ser feito a partir do vim, economizando em cada backup. Note que, devido à abordagem através de somas de verificação, se alguns arquivos do pacote forem alterados localmente (por exemplo, o arquivo de configuração foi modificado) — os arquivos alterados serão mantidos no arquivo zip "como estão" e não serão reduzidos.
Se algum de seus próprios pacotes for atualizado periodicamente, mas as alterações não forem muito grandes, você pode gerar um hint apenas para as versões principais. Por exemplo, na versão 1.0 foi feito um hint apontando para mypackage-1.0.tar.gz, e ele será totalmente deduplicado. Depois, a versão 1.1 foi lançada, que é um pouco diferente, mas o hint não foi atualizado. Não tem problema. Somente os arquivos que coincidem (que podem ser restaurados) com a versão 1.0 serão deduplicados.
A heurística que processa o arquivo hint — é um bom exemplo para entender o mecanismo interno de funcionamento das heurísticas. Ele processa apenas os arquivos hashget-hint.json (ou .hashget-hint.json com o ponto) e ignora todos os outros. A partir desse arquivo, ele determina qual URL do pacote deve ser indexado, e o hashget o indexa (se isso não foi feito anteriormente).
HashServer
Seria bastante trabalhoso realizar a indexação completa ao criar backups. Para isso, seria necessário baixar cada pacote, descompactar, indexar. Portanto, o hashget utiliza um esquema com . Ao detectar um pacote Debian instalado, se ele não for encontrado nos HashPackages locais, primeiro é feita uma tentativa de simplesmente baixar o HashPackage do servidor de hash. E somente se isso falhar — o hashget baixa e hashira o pacote (e o carrega no hashserver, para que posteriormente o hashserver o forneça).
O HashServer não é um elemento obrigatório do esquema, não é crítico, serve exclusivamente para acelerar e reduzir a carga nos repositórios. Pode ser facilmente desativado (com a opção --hashserver sem parâmetros). Além disso, é fácil .
Backups incrementais e diferenciais, obsolescência planejada
permitindo uma configuração muito simples . Por que não indexar nosso próprio backup (com todos os nossos arquivos exclusivos)? Um comando --submit e tudo pronto! O próximo backup que o hashget criar não incluirá arquivos deste arquivo.
Mas essa não é uma abordagem muito boa, pois pode acontecer que, ao restaurar, teremos que puxar todos os backups do hashget de toda a história (se em cada um houver pelo menos um arquivo único). Para isso, existe um mecanismo . Ao indexar, você pode especificar a data de expiração do HashPackage --expires 2019-06-01, e ao chegar essa data (às 00:00), ele não será utilizado. O próprio arquivo pode não ser excluído após essa data (Embora o hashget possa convenientemente mostrar as URLs de todos os backups que expiraram/expirarão até o momento ou em qualquer data).
Por exemplo, se no dia 1 fazemos um backup completo e o indexamos com um tempo de vida até o final do mês — teremos um esquema de backup diferencial.
Se também indexarmos novos backups — teremos um esquema de backups incrementais.
Diferente dos esquemas tradicionais, o hashget permite usar várias fontes base. O backup será reduzido tanto pela redução de arquivos de backups anteriores (se houver), quanto por arquivos públicos (aquilo que pode ser baixado).
Se por alguma razão não confiamos na confiabilidade dos recursos do Debian () ou utilizamos outra distribuição, podemos simplesmente fazer um backup completo uma vez com todos os pacotes e, em seguida, confiar nele (). Agora, se todos os servidores das nossas distribuições ficarem inacessíveis (na internet de souvenirs ou em um apocalipse zumbi), mas nossos backups estiverem em ordem — poderemos restaurar de qualquer backup diferencial curto que se baseie apenas em nossos backups anteriores.
O hashget se baseia apenas em fontes confiáveis de restauração a SEU critério. As que você considerar confiáveis — essas serão usadas.
FilePool e Glacier
O mecanismo permite não ter que acessar constantemente servidores externos para baixar pacotes, mas usar pacotes do diretório local ou de um servidor corporativo, por exemplo:
$ hashget -u . --pool /tmp/poolou
$ hashget -u . --pool http://myhashdb.example.com/Para criar um pool em um diretório local, basta criar um diretório e colocar arquivos nele; o hashget encontrará o que precisa através dos hashes. Para tornar o pool acessível via HTTP, é necessário criar links simbólicos de forma especial, o que pode ser feito com um único comando (hashget-admin --build /var/www/html/hashdb/ --pool /tmp/pool). O HTTP FilePool consiste em arquivos estáticos, então qualquer servidor web simples pode atendê-lo, a carga no servidor é quase nula.
Graças ao FilePool, é possível utilizar não apenas recursos na http(s), mas também, , Amazon Glacier.
Depois de fazer o upload do backup para o Glacier, obtemos seu ID de Upload e o usamos como URL. Por exemplo:
hashget --submit Glacier_Upload_ID --file /tmp/my-glacier-backup.tar.gz --project glacier --hashserver --expires 2019-09-01Agora, novos backups (diferenciais) se basearão nesse backup e serão mais curtos. Após descompactar o diferencial, podemos verificar a que recursos ele se refere:
hashget --info /tmp/unpacked/ liste com um simples shell script, baixar todos esses arquivos do Glacier para o pool e iniciar a restauração normalmente: hashget -u /tmp/unpacked --pool /tmp/pool
Vale a pena o esforço?
No caso mais simples, você apenas pagará menos pelos backups (se os estiver armazenando em algum lugar na nuvem por uma taxa). E pode ser — muito menos.
Mas isso não é tudo. A quantidade se transforma em qualidade. Você pode usar isso para obter uma atualização de qualidade no esquema dos backups. Por exemplo, como agora os backups são mais curtos — é possível fazer não apenas backups mensais, mas diários. Armazená-los não por seis meses, como antes, mas por cinco anos. Antes, armazenávamos em um armazenamento 'frio' lento, mas barato (Glacier), agora você pode armazená-los em um 'quente', de onde é sempre rápido baixar o backup e restaurar em minutos, não em um dia.
É possível aumentar a confiabilidade do armazenamento dos backups. Se atualmente os armazenamos em um único armazenamento, reduzindo o tamanho dos backups — poderemos armazená-los em 2-3 locais diferentes e sobreviver sem problemas se um deles falhar.
Como tentar e começar a usar?
Acesse a página do GitLab , instale com um único comando (pip3 install hashget[plugins]) e apenas seguir o quick-start. Acho que fazer todas as coisas simples levará uns 10-15 minutos. Depois, você pode tentar compactar suas VMs, criar, se necessário, arquivos de hint para uma compressão mais eficiente, experimentar com pools, um banco de dados local de hashes e um servidor hash, se estiver interessado. No dia seguinte, verifique qual será o tamanho do backup incremental em relação ao de ontem.
Fonte: habr.com
