Reduza os backups em 99.5% com hashget

hashget - é gratuito e de código aberto desduplicador é um utilitário semelhante a um arquivador que permite reduzir significativamente o tamanho dos backups, bem como organizar esquemas de backup incrementais e diferenciais e muito mais.

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

Comparação

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

Amostra de dados
tamanho descompactado
.tar.gz
hashget.tar.gz

WordPress-5.1.1
43 Mb
11 MB (26%)
155 KB ( 0.3% )

Kernel Linux 5.0.4
934 Mb
161 MB (20%)
4.7 MB ( 0.5% )

VM Debian 9 (LAMP) LXC
724 Mb
165 MB (23%)
4.1 MB ( 0.5% )

Antecedentes sobre o que deve ser um backup ideal e eficaz

Cada vez que fazia backup de uma máquina virtual recém-criada, era assombrado pela sensação de que estava fazendo algo errado. Por que obtenho um backup robusto do sistema, onde minha criatividade inestimável e imperecível é um index.html de uma linha com o texto “Olá, mundo”?

Por que há um /usr/sbin/mysqld de 16 MB no meu backup? É realmente possível que neste mundo eu tenha a honra de guardar este importante arquivo e, se falhar, ele será perdido para a humanidade? Provavelmente não. Ele é armazenado em servidores Debian altamente confiáveis ​​(cuja confiabilidade e tempo de atividade não podem ser comparados ao que posso fornecer), bem como em backups (milhões deles) de outros administradores. Precisamos realmente criar mais de 10 de primeira cópia deste arquivo importante para melhorar a confiabilidade?

Geralmente hashget e resolve esse problema. Quando compactado, cria um backup muito pequeno. Ao descompactar - um sistema completamente descompactado, semelhante ao que seria se tar -c / tar -x. (Em outras palavras, esta é uma embalagem sem perdas)

Como funciona o hashget

hashget possui os conceitos de Package e HashPackage, com a ajuda deles realiza desduplicação.

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

HashPackage — um pequeno arquivo JSON representando um pacote, incluindo a URL do pacote e somas de hash (sha256) dos arquivos dele. Por exemplo, para um pacote mariadb-server-core de 5 megabytes, o tamanho do hashpackage é de apenas 6 kilobytes. Cerca de mil vezes menos.

Desduplicação — criar um arquivo sem arquivos duplicados (se o desduplicador souber onde o pacote original pode ser baixado, ele reduzirá as duplicatas do arquivo).

Embalagem

Ao compactar, todos os arquivos do diretório que está sendo compactado são verificados, suas somas de hash são calculadas e, se a soma for encontrada em um dos HashPackages conhecidos, os metadados sobre o arquivo (nome, hash, direitos de acesso, etc.) são salvos em um arquivo especial .hashget-restore.json, que também será incluído no arquivo.

No caso mais simples, a embalagem em si não parece mais complicada que o alcatrão:

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

desembalar

A desembalagem é feita em duas etapas. Primeiro, a descompactação usual do alcatrão:

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

em seguida, restaure da rede:

hashget -u /path/to/data

Ao restaurar, o hashget lê o arquivo .hashget-restore.json, baixa os pacotes necessários, descompacta-os e extrai os arquivos necessários, instalando-os nos caminhos necessários, com o proprietário/grupo/permissões necessários.

Coisas mais difíceis

O que está descrito acima já é suficiente para quem “quer como o tar, mas compactar meu Debian em 4 megabytes”. Vejamos coisas mais complexas mais tarde.

Indexação

Se o hashget não tivesse um único HashPackage, ele simplesmente não seria capaz de desduplicar 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 um estágio indexação (é executado automaticamente com o comando --pack) E heurística. Ao indexar, o hashget “alimenta” cada arquivo encontrado para todas as heurísticas disponíveis que estão interessadas nele. A heurística pode então indexar qualquer pacote para criar um HashPackage.

Por exemplo, a heurística Debian adora o arquivo /var/lib/dpkg/status e detecta pacotes Debian instalados e, se eles não estiverem indexados (não há HashPackage criado para eles), baixa-os e indexa-os. O resultado é um efeito muito bom - o hashget sempre desduplicará efetivamente os sistemas operacionais Debian, mesmo que eles tenham os pacotes mais recentes.

Arquivos de dicas

Se sua rede usa alguns de seus pacotes proprietários ou um pacote público que não está incluído na heurística hashget, você pode adicionar um arquivo de dica simples hashget-hint.json assim:

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

Em seguida, cada vez que um arquivo for criado, o pacote será indexado (se não tiver sido anteriormente) e os arquivos do pacote serão desduplicados do arquivo. Nenhuma programação é necessária, tudo pode ser feito a partir do vim e salvo em cada backup. Observe que, graças à abordagem de soma de hash, se alguns arquivos do pacote forem alterados localmente (por exemplo, um arquivo de configuração for alterado), os arquivos alterados serão salvos no arquivo “como estão” e não serão truncados.

Se alguns de seus próprios pacotes forem atualizados periodicamente, mas as alterações não forem muito grandes, você poderá sugerir apenas versões principais. Por exemplo, na versão 1.0 eles fizeram uma dica apontando para mypackage-1.0.tar.gz, e será completamente desduplicado, então lançaram a versão 1.1, que é um pouco diferente, mas a dica não foi atualizada. Tudo bem. Somente os arquivos que correspondem (podem ser restaurados para) a versão 1.0 são desduplicados.

A heurística que processa o arquivo de dicas é um bom exemplo para entender o mecanismo interno de como a heurística funciona. Ele processa apenas arquivos hashget-hint.json (ou .hashget-hint.json com um ponto) e ignora todos os outros. A partir deste arquivo, ele determina qual URL do pacote deve ser indexado e o hashget o indexa (se ainda não o fez)

Servidor Hash

Seria muito trabalhoso realizar a indexação completa ao criar backups. Para fazer isso, você precisa baixar cada pacote, descompactá-lo e indexá-lo. Portanto, o hashget usa um esquema com Servidor Hash. Quando um pacote Debian instalado é detectado, se ele não for encontrado no HashPackage local, primeiro é feita uma tentativa de simplesmente baixar o HashPackage do servidor hash. E somente se isso não funcionar, o próprio hashget baixa e faz o hash do pacote (e o carrega no hashserver, para que o hashserver o forneça no futuro).

HashServer é um elemento opcional do esquema, não crítico, serve apenas para agilizar e reduzir a carga nos repositórios. Facilmente desabilitado (opcional --hashserver sem parâmetros). Além disso, você pode facilmente faça seu próprio servidor de hash.

Backups incrementais e diferenciais, obsolescência planejada

hashget torna muito fácil fazer um diagrama backups incrementais e diferenciais. Por que não indexamos nosso backup (com todos os nossos arquivos exclusivos)? Um time --submit e pronto! O próximo backup criado pelo hashget não incluirá arquivos deste arquivo.

Mas esta não é uma abordagem muito boa, porque pode acontecer que, ao restaurar, tenhamos que extrair todos os backups de hashget em todo o histórico (se cada um contiver pelo menos um arquivo exclusivo). Existe um mecanismo para isso obsolescência planejada de backups. Ao indexar, você pode especificar a data de expiração do HashPackage --expires 2019-06-01, e após esta data (a partir das 00h00), não será utilizado. O arquivo em si não pode ser excluído após esta data (embora o hashget possa mostrar convenientemente os URLs de todos os backups que estão/estarão podres no momento ou em qualquer data).

Por exemplo, se fizermos um backup completo no dia 1º e indexá-lo com vida útil até o final do mês, obteremos um esquema de backup diferencial.

Se indexarmos novos backups da mesma forma, haverá um esquema de backups incrementais.

Ao contrário dos esquemas tradicionais, o hashget permite usar múltiplas fontes subjacentes. O backup será reduzido tanto pela redução de arquivos de backups anteriores (se houver) quanto por arquivos públicos (o que pode ser baixado).

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

Hashget depende apenas de fontes de recuperação confiáveis, a SEU critério. Serão utilizados aqueles que você considerar confiáveis.

FilePool e Glaciar

Mecanismo FilePool permite que você não entre em contato constantemente com 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 fazer um pool em um diretório local, você só precisa criar um diretório e jogar os arquivos nele, o próprio hashget encontrará o que precisa usando os 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 FilePool HTTP é composto por arquivos estáticos, portanto, qualquer servidor web simples pode atendê-lo, a carga no servidor é quase zero.

Graças ao FilePool, você pode usar não apenas recursos http(s) como recursos base, mas também eg, Geleira Amazonas.

Depois de enviar o backup para a geleira, 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-01

Agora os novos backups (diferenciais) serão baseados neste backup e serão mais curtos. Depois de descompactar o diffbackup, podemos ver de quais recursos ele depende:

hashget --info /tmp/unpacked/ list

e apenas use um script de shell para baixar todos esses arquivos do Glacier para o pool e executar a recuperação normal: hashget -u /tmp/unpacked —pool /tmp/pool

O jogo vale a pena?

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

Mas isso não é a única coisa. Quantidade se transforma em qualidade. Você pode usar isso para obter uma atualização de alta qualidade para seu esquema de backup. Por exemplo, como nossos backups agora são mais curtos, podemos fazer backups não mensais, mas diários. Guarde-os não por seis meses, como antes, mas por 5 anos. Anteriormente, você o armazenava em um armazenamento “frio” lento, mas barato (Glacier), agora você pode armazená-lo em um armazenamento quente, de onde você pode baixar rapidamente um backup e restaurá-lo em minutos, não em um dia.

Você pode aumentar a confiabilidade do armazenamento de backup. Se atualmente os armazenarmos em um local de armazenamento, ao reduzir o volume de backups, seremos capazes de armazená-los em 2 a 3 locais de armazenamento e sobreviver sem problemas se um deles for danificado.

Como experimentar e começar a usar?

Vá para a página do gitlab https://gitlab.com/yaroslaff/hashget, instale com um comando (pip3 install hashget[plugins]) e apenas leia e execute o início rápido. Acho que levará de 10 a 15 minutos para fazer todas as coisas simples. Então você pode tentar compactar suas máquinas virtuais, criar arquivos de dicas se necessário para tornar a compactação mais forte, brincar com pools, um banco de dados hash local e um servidor hash se estiver interessado, e no dia seguinte ver qual é o tamanho do backup incremental estará em cima do de ontem.

Fonte: habr.com

Adicionar um comentário